Files
mckernel/lib/include/ihk/cpu.h
Masamichi Takagi 3e00189de0 kprintf: fix checking if interrupt is disabled
Change-Id: I2ee1a1e2438ae761c4136593953ede2738bc6f74
2021-03-11 07:03:04 +00:00

179 lines
5.4 KiB
C

/**
* \file cpu.h
* License details are found in the file LICENSE.
* \brief
* Declare types and functions to control CPU.
* \author Taku Shimosawa <shimosawa@is.s.u-tokyo.ac.jp> \par
* Copyright (C) 2011 - 2012 Taku Shimosawa
*/
/*
* HISTORY
*/
/* cpu.h COPYRIGHT FUJITSU LIMITED 2015-2019 */
#ifndef IHK_CPU_H
#define IHK_CPU_H
#include <list.h>
#include <ihk/context.h>
#include <arch/cpu.h>
#include <mc_perf_event.h>
extern int num_processors;
void cpu_enable_interrupt(void);
void cpu_disable_interrupt(void);
int cpu_interrupt_disabled(void);
void cpu_halt(void);
#ifdef ENABLE_FUGAKU_HACKS
void cpu_halt_panic(void);
#endif
void cpu_safe_halt(void);
void cpu_restore_interrupt(unsigned long);
void cpu_pause(void);
unsigned long cpu_disable_interrupt_save(void);
unsigned long cpu_enable_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;
int *linux_cpu_ids;
int *ikc_cpus;
};
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);
int ihk_mc_get_numa_id(void);
int ihk_mc_get_nr_cores(void);
int ihk_mc_get_nr_linux_cores(void);
int ihk_mc_get_osnum(void);
int ihk_mc_get_core(int id, unsigned long *linux_core_id, unsigned long *apic_id,
int *numa_id);
int ihk_mc_get_ikc_cpu(int id);
int ihk_mc_get_apicid(int linux_core_id);
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));
void *ihk_mc_get_linux_kernel_pgt(void);
int ihk_mc_get_extra_reg_id(unsigned long hw_config, unsigned long hw_config_ext);
unsigned int ihk_mc_get_nr_extra_regs(void);
int ihk_mc_get_extra_reg_idx(int id);
unsigned int ihk_mc_get_extra_reg_msr(int id);
unsigned long ihk_mc_get_extra_reg_event(int id);
unsigned long ihk_mc_hw_event_map(unsigned long hw_event);
unsigned long ihk_mc_hw_cache_event_map(unsigned long hw_cache_event);
unsigned long ihk_mc_hw_cache_extra_reg_map(unsigned long hw_cache_event);
unsigned long ihk_mc_raw_event_map(unsigned long raw_event);
int ihk_mc_validate_event(unsigned long hw_config);
int hw_perf_event_init(struct mc_perf_event *event);
int ihk_mc_event_set_period(struct mc_perf_event *event);
uint64_t ihk_mc_event_update(struct mc_perf_event *event);
static inline int is_sampling_event(struct mc_perf_event *event)
{
return event->attr.sample_period != 0;
}
/* 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_get_interrupt_id(int cpu);
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);
void ihk_mc_init_user_tlsbase(ihk_mc_user_context_t *ctx,
unsigned long tls_base_addr);
#ifdef POSTK_DEBUG_ARCH_DEP_42 /* /proc/cpuinfo support added. */
long ihk_mc_show_cpuinfo(char *buf, size_t buf_size, unsigned long read_off, int *eofp);
#endif /* POSTK_DEBUG_ARCH_DEP_42 */
enum ihk_mc_user_context_regtype {
IHK_UCR_STACK_POINTER = 1,
IHK_UCR_PROGRAM_COUNTER = 2,
};
struct thread;
void arch_clone_thread(struct thread *othread, unsigned long pc,
unsigned long sp, struct thread *nthread);
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;
extern int gettime_local_support;
void init_tick(void);
void init_delay(void);
void sync_tick(void);
struct pvclock_vsyscall_time_info {
long contents[64/sizeof(long)];
};
extern struct pvclock_vsyscall_time_info *pvti;
extern int pvti_npages;
int arch_setup_pvclock(void);
void arch_start_pvclock(void);
struct cpu_mapping;
int arch_get_cpu_mapping(struct cpu_mapping **buf, int *nelemsp);
int ihk_mc_ikc_arch_issue_host_ipi(int cpu, int vector);
void smp_func_call_handler(void);
int ihk_mc_get_smp_handler_irq(void);
#endif