2016-06-15 07:29:46 +00:00
|
|
|
#ifndef _S_INTR_H_
|
|
|
|
#define _S_INTR_H_
|
|
|
|
|
2016-06-25 07:25:54 +00:00
|
|
|
#include "g_abi.h"
|
2016-07-09 00:57:09 +00:00
|
|
|
#include "g_type.h"
|
2016-06-23 04:50:29 +00:00
|
|
|
|
|
|
|
typedef struct
|
2016-06-15 07:29:46 +00:00
|
|
|
{
|
2016-06-23 04:50:29 +00:00
|
|
|
uint32_t timer_intr_vec;
|
|
|
|
uint32_t apc_intr_vec;
|
|
|
|
uint32_t dpc_intr_vec;
|
|
|
|
} k_hal_intr_info_t;
|
|
|
|
|
2016-06-25 01:47:29 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
unrecoverable_exc,
|
|
|
|
div_by_zero_exc,
|
|
|
|
general_protection_exc,
|
|
|
|
invalid_op_exc,
|
|
|
|
page_fault_exc,
|
|
|
|
unsupported_exc,
|
|
|
|
debug_exc
|
|
|
|
} k_exc_type_t;
|
|
|
|
|
2016-06-23 04:50:29 +00:00
|
|
|
// IRQL APIs
|
2016-09-13 04:41:09 +00:00
|
|
|
typedef uint32_t k_irql_t;
|
|
|
|
#define K_IRQL_DISABLED_LEVEL 15
|
|
|
|
#define K_IRQL_DPC_LEVEL 4
|
|
|
|
#define K_IRQL_APC_LEVEL 2
|
2016-06-25 07:25:54 +00:00
|
|
|
#define K_IRQL_PASSIVE_LEVEL 0
|
2016-06-25 01:47:29 +00:00
|
|
|
|
2016-08-27 05:13:54 +00:00
|
|
|
extern k_irql_t KAPI ke_set_irql(k_irql_t irql);
|
2016-06-25 01:47:29 +00:00
|
|
|
|
2016-08-27 05:13:54 +00:00
|
|
|
extern k_irql_t KAPI ke_get_irql();
|
2016-06-23 04:50:29 +00:00
|
|
|
|
2016-08-27 05:13:54 +00:00
|
|
|
extern void KAPI ke_halt_cpu();
|
2016-07-09 03:01:33 +00:00
|
|
|
|
2016-08-27 05:13:54 +00:00
|
|
|
extern void KAPI ke_set_timer_timeout(uint64_t timeout);
|
2016-07-01 09:15:07 +00:00
|
|
|
|
2016-09-13 04:41:09 +00:00
|
|
|
extern int32_t KAPI ke_get_core_id();
|
|
|
|
|
|
|
|
extern int32_t KAPI ke_issue_interrupt(int32_t core_id, uint32_t vector);
|
|
|
|
|
2016-06-23 04:50:29 +00:00
|
|
|
// Interrupt handler registration
|
|
|
|
// context is a parameter passed by the kernel. HAL must pass back.
|
|
|
|
// intr_stack is a parameter passed by the HAL. Used by some HAL interrupt context functions.
|
2016-06-25 01:47:29 +00:00
|
|
|
typedef void ( KAPI *k_intr_handler_t)(void *context, void *intr_stack);
|
|
|
|
|
2016-08-27 05:13:54 +00:00
|
|
|
extern void KAPI ke_register_intr_handler(uint32_t index, k_intr_handler_t handler, void *context);
|
2016-06-25 01:47:29 +00:00
|
|
|
|
2016-08-27 05:13:54 +00:00
|
|
|
extern k_intr_handler_t KAPI ke_deregister_intr_handler(uint32_t index);
|
2016-06-23 04:50:29 +00:00
|
|
|
|
|
|
|
// Exception handler registration
|
2016-06-25 01:47:29 +00:00
|
|
|
typedef void ( KAPI *k_exc_handler_t)(uint64_t exc_addr, uint64_t exc_stack, uint64_t error_code);
|
|
|
|
|
2016-08-27 05:13:54 +00:00
|
|
|
extern void KAPI ke_register_exc_handler(k_exc_type_t type, k_exc_handler_t handler);
|
2016-06-25 01:47:29 +00:00
|
|
|
|
2016-08-27 05:13:54 +00:00
|
|
|
extern k_exc_handler_t KAPI ke_deregister_exc_handler(uint64_t index);
|
2016-06-15 07:29:46 +00:00
|
|
|
|
|
|
|
#endif
|