/** * \file cpu.h * License details are found in the file LICENSE. * \brief * Declare types and functions to control CPU. * \author Taku Shimosawa \par * Copyright (C) 2011 - 2012 Taku Shimosawa */ /* * HISTORY */ #ifndef IHK_CPU_H #define IHK_CPU_H #include #include void cpu_enable_interrupt(void); void cpu_disable_interrupt(void); void cpu_halt(void); void cpu_safe_halt(void); void cpu_restore_interrupt(unsigned long); void cpu_pause(void); #define barrier() asm volatile("" : : : "memory") unsigned long cpu_disable_interrupt_save(void); struct ihk_mc_interrupt_handler { struct list_head list; void (*func)(void *); void *priv; }; int ihk_mc_register_interrupt_handler(int vector, struct ihk_mc_interrupt_handler *h); int ihk_mc_unregister_interrupt_handler(int vector, struct ihk_mc_interrupt_handler *h); enum ihk_mc_gv_type { IHK_GV_IKC = 1, IHK_GV_QUERY_FREE_MEM = 2 }; int ihk_mc_get_vector(enum ihk_mc_gv_type type); int ihk_mc_interrupt_host(int cpu, int vector); struct ihk_mc_cpu_info { int ncpus; int *hw_ids; int *nodes; }; struct ihk_mc_cpu_info *ihk_mc_get_cpu_info(void); void ihk_mc_boot_cpu(int cpuid, unsigned long pc); int ihk_mc_get_processor_id(void); int ihk_mc_get_hardware_processor_id(void); void ihk_mc_delay_us(int us); void ihk_mc_set_syscall_handler(long (*handler)(int, ihk_mc_user_context_t *)); void ihk_mc_init_ap(void); void ihk_mc_init_context(ihk_mc_kernel_context_t *new_ctx, void *stack_pointer, void (*next_function)(void)); /* returns the 'prev' argument of the call that caused the switch to the context returned. */ void *ihk_mc_switch_context(ihk_mc_kernel_context_t *old_ctx, ihk_mc_kernel_context_t *new_ctx, void *prev); int ihk_mc_interrupt_cpu(int cpu, int vector); void ihk_mc_init_user_process(ihk_mc_kernel_context_t *ctx, ihk_mc_user_context_t **puctx, void *stack_pointer, unsigned long user_pc, unsigned long user_sp); enum ihk_mc_user_context_regtype { IHK_UCR_STACK_POINTER = 1, IHK_UCR_PROGRAM_COUNTER = 2, }; void ihk_mc_modify_user_context(ihk_mc_user_context_t *uctx, enum ihk_mc_user_context_regtype reg, unsigned long value); void ihk_mc_debug_show_interrupt_context(const void *reg); enum ihk_asr_type { IHK_ASR_X86_FS, IHK_ASR_X86_GS, }; #define IHK_TLB_FLUSH_IRQ_VECTOR_START 68 #define IHK_TLB_FLUSH_IRQ_VECTOR_SIZE 64 #define IHK_TLB_FLUSH_IRQ_VECTOR_END (IHK_TLB_FLUSH_IRQ_VECTOR_START + IHK_TLB_FLUSH_IRQ_VECTOR_SIZE) int ihk_mc_arch_set_special_register(enum ihk_asr_type, unsigned long value); int ihk_mc_arch_get_special_register(enum ihk_asr_type, unsigned long *value); extern unsigned int ihk_ikc_irq; extern unsigned int ihk_ikc_irq_apicid; #endif