static const unsigned char * const *ideal_nops __initdata = k8_nops;
-static int __init mask_nmi_callback(struct cpu_user_regs *regs, int cpu)
+static int __init mask_nmi_callback(const struct cpu_user_regs *regs, int cpu)
{
return 1;
}
void
mc_memerr_dhandler(struct mca_binfo *binfo,
enum mce_result *result,
- struct cpu_user_regs *regs)
+ const struct cpu_user_regs *regs)
{
struct mcinfo_bank *bank = binfo->mib;
struct mcinfo_global *global = binfo->mig;
void
mc_memerr_dhandler(struct mca_binfo *binfo,
enum mce_result *result,
- struct cpu_user_regs *regs);
+ const struct cpu_user_regs *regs);
#define MC_ADDR_PHYSICAL 0
#define MC_ADDR_VIRTUAL 1
custom_param("mce_verbosity", mce_set_verbosity);
/* Handle unconfigured int18 (should never happen) */
-static void unexpected_machine_check(struct cpu_user_regs *regs, long error_code)
+static void unexpected_machine_check(const struct cpu_user_regs *regs, long error_code)
{
console_force_unlock();
printk("Unexpected Machine Check Exception\n");
/* Call the installed machine check handler for this CPU setup. */
-void machine_check_vector(struct cpu_user_regs *regs, long error_code)
+void machine_check_vector(const struct cpu_user_regs *regs, long error_code)
{
_machine_check_vector(regs, error_code);
}
spin_unlock(lk);
}
-static enum mce_result mce_action(struct cpu_user_regs *regs,
+static enum mce_result mce_action(const struct cpu_user_regs *regs,
mctelem_cookie_t mctc);
/*
* -1: if system can't be recovered
* 0: Continue to next step
*/
-static int mce_urgent_action(struct cpu_user_regs *regs,
+static int mce_urgent_action(const struct cpu_user_regs *regs,
mctelem_cookie_t mctc)
{
uint64_t gstatus;
}
/* Shared #MC handler. */
-void mcheck_cmn_handler(struct cpu_user_regs *regs, long error_code,
+void mcheck_cmn_handler(const struct cpu_user_regs *regs, long error_code,
struct mca_banks *bankmask, struct mca_banks *clear_bank)
{
uint64_t gstatus;
*/
/* Maybe called in MCE context, no lock, no printk */
-static enum mce_result mce_action(struct cpu_user_regs *regs,
+static enum mce_result mce_action(const struct cpu_user_regs *regs,
mctelem_cookie_t mctc)
{
struct mc_info *local_mi;
uint32_t *, uint32_t *, uint32_t *, uint32_t *);
/* Register a handler for machine check exceptions. */
-typedef void (*x86_mce_vector_t)(struct cpu_user_regs *, long);
+typedef void (*x86_mce_vector_t)(const struct cpu_user_regs *, long);
extern void x86_mce_vector_register(x86_mce_vector_t);
/* Common generic MCE handler that implementations may nominate
* via x86_mce_vector_register. */
-extern void mcheck_cmn_handler(struct cpu_user_regs *, long,
+extern void mcheck_cmn_handler(const struct cpu_user_regs *, long,
struct mca_banks *, struct mca_banks *);
/* Register a handler for judging whether mce is recoverable. */
}
/* Common AMD Machine Check Handler for AMD K8 and higher */
-static void amd_cmn_machine_check(struct cpu_user_regs *regs, long error_code)
+static void amd_cmn_machine_check(const struct cpu_user_regs *regs, long error_code)
{
mcheck_cmn_handler(regs, error_code, mca_allbanks,
__get_cpu_var(mce_clear_banks));
static void intel_memerr_dhandler(
struct mca_binfo *binfo,
enum mce_result *result,
- struct cpu_user_regs *regs)
+ const struct cpu_user_regs *regs)
{
mce_printk(MCE_VERBOSE, "MCE: Enter UCR recovery action\n");
mc_memerr_dhandler(binfo, result, regs);
static void intel_srar_dhandler(
struct mca_binfo *binfo,
enum mce_result *result,
- struct cpu_user_regs *regs)
+ const struct cpu_user_regs *regs)
{
uint64_t status = binfo->mib->mc_status;
static void intel_srao_dhandler(
struct mca_binfo *binfo,
enum mce_result *result,
- struct cpu_user_regs *regs)
+ const struct cpu_user_regs *regs)
{
uint64_t status = binfo->mib->mc_status;
static void intel_default_mce_dhandler(
struct mca_binfo *binfo,
enum mce_result *result,
- struct cpu_user_regs * regs)
+ const struct cpu_user_regs * regs)
{
uint64_t status = binfo->mib->mc_status;
enum intel_mce_type type;
static void intel_default_mce_uhandler(
struct mca_binfo *binfo,
enum mce_result *result,
- struct cpu_user_regs *regs)
+ const struct cpu_user_regs *regs)
{
uint64_t status = binfo->mib->mc_status;
enum intel_mce_type type;
{intel_default_check, intel_default_mce_uhandler}
};
-static void intel_machine_check(struct cpu_user_regs * regs, long error_code)
+static void intel_machine_check(const struct cpu_user_regs * regs, long error_code)
{
mcheck_cmn_handler(regs, error_code, mca_allbanks,
__get_cpu_var(mce_clear_banks));
*/
int (*owned_error)(uint64_t status);
void (*recovery_handler)(struct mca_binfo *binfo,
- enum mce_result *result, struct cpu_user_regs *regs);
+ enum mce_result *result, const struct cpu_user_regs *regs);
};
/* Global variables */
return 0;
}
-void nmi_watchdog_tick(struct cpu_user_regs * regs)
+void nmi_watchdog_tick(const struct cpu_user_regs *regs)
{
unsigned int sum = this_cpu(nmi_timer_ticks);
model->free_msr(v);
}
-static int nmi_callback(struct cpu_user_regs *regs, int cpu)
+static int nmi_callback(const struct cpu_user_regs *regs, int cpu)
{
int xen_mode, ovf;
}
static inline void
-ibs_log_event(u64 data, struct cpu_user_regs * const regs, int mode)
+ibs_log_event(u64 data, struct cpu_user_regs const * const regs, int mode)
{
struct vcpu *v = current;
u32 temp = 0;
}
-static inline int handle_ibs(int mode, struct cpu_user_regs * const regs)
+static inline int handle_ibs(int mode, struct cpu_user_regs const * const regs)
{
u64 val, ctl;
struct vcpu *v = current;
static int athlon_check_ctrs(unsigned int const cpu,
struct op_msrs const * const msrs,
- struct cpu_user_regs * const regs)
+ struct cpu_user_regs const * const regs)
{
uint64_t msr_content;
static int p4_check_ctrs(unsigned int const cpu,
struct op_msrs const * const msrs,
- struct cpu_user_regs * const regs)
+ struct cpu_user_regs const * const regs)
{
unsigned long ctr, stag, real;
uint64_t msr_content;
static int ppro_check_ctrs(unsigned int const cpu,
struct op_msrs const * const msrs,
- struct cpu_user_regs * const regs)
+ struct cpu_user_regs const * const regs)
{
u64 val;
int i;
void (*setup_ctrs)(struct op_msrs const * const msrs);
int (*check_ctrs)(unsigned int const cpu,
struct op_msrs const * const msrs,
- struct cpu_user_regs * const regs);
+ struct cpu_user_regs const * const regs);
void (*start)(struct op_msrs const * const msrs);
void (*stop)(struct op_msrs const * const msrs);
int (*is_arch_pmu_msr)(u64 msr_index, int *type, int *index);
#define stack_words_per_line 4
#define ESP_BEFORE_EXCEPTION(regs) ((unsigned long *)regs->rsp)
-static void show_guest_stack(struct vcpu *v, struct cpu_user_regs *regs)
+static void show_guest_stack(struct vcpu *v, const struct cpu_user_regs *regs)
{
int i;
unsigned long *stack, addr;
printk("\n");
}
-void show_stack(struct cpu_user_regs *regs)
+void show_stack(const struct cpu_user_regs *regs)
{
unsigned long *stack = ESP_BEFORE_EXCEPTION(regs), addr;
int i;
#endif
}
-void show_execution_state(struct cpu_user_regs *regs)
+void show_execution_state(const struct cpu_user_regs *regs)
{
show_registers(regs);
show_stack(regs);
* are disabled). In such situations we can't do much that is safe. We try to
* print out some tracing and then we just spin.
*/
-void fatal_trap(int trapnr, struct cpu_user_regs *regs)
+void fatal_trap(int trapnr, const struct cpu_user_regs *regs)
{
static DEFINE_PER_CPU(char, depth);
do_guest_trap(TRAP_int3, regs, 0);
}
-void do_machine_check(struct cpu_user_regs *regs)
+void do_machine_check(const struct cpu_user_regs *regs)
{
machine_check_vector(regs, regs->error_code);
}
send_guest_trap(d, 0, TRAP_nmi);
}
-static void pci_serr_error(struct cpu_user_regs *regs)
+static void pci_serr_error(const struct cpu_user_regs *regs)
{
outb((inb(0x61) & 0x0f) | 0x04, 0x61); /* clear-and-disable the PCI SERR error line. */
}
}
-static void io_check_error(struct cpu_user_regs *regs)
+static void io_check_error(const struct cpu_user_regs *regs)
{
switch ( opt_nmi[0] )
{
outb((inb(0x61) & 0x07) | 0x00, 0x61); /* enable IOCK */
}
-static void unknown_nmi_error(struct cpu_user_regs *regs, unsigned char reason)
+static void unknown_nmi_error(const struct cpu_user_regs *regs, unsigned char reason)
{
switch ( opt_nmi[0] )
{
}
}
-static int dummy_nmi_callback(struct cpu_user_regs *regs, int cpu)
+static int dummy_nmi_callback(const struct cpu_user_regs *regs, int cpu)
{
return 0;
}
static nmi_callback_t nmi_callback = dummy_nmi_callback;
-void do_nmi(struct cpu_user_regs *regs)
+void do_nmi(const struct cpu_user_regs *regs)
{
unsigned int cpu = smp_processor_id();
unsigned char reason;
#include <compat/callback.h>
#include <compat/arch-x86_32.h>
-void compat_show_guest_stack(struct vcpu *v, struct cpu_user_regs *regs,
+void compat_show_guest_stack(struct vcpu *v, const struct cpu_user_regs *regs,
int debug_stack_lines)
{
unsigned int i, *stack, addr, mask = STACK_SIZE;
regs->gs, regs->ss, regs->cs);
}
-void show_registers(struct cpu_user_regs *regs)
+void show_registers(const struct cpu_user_regs *regs)
{
struct cpu_user_regs fault_regs = *regs;
unsigned long fault_crs[8];
extern void self_nmi(void);
extern void disable_timer_nmi_watchdog(void);
extern void enable_timer_nmi_watchdog(void);
-extern void nmi_watchdog_tick (struct cpu_user_regs *regs);
+extern void nmi_watchdog_tick (const struct cpu_user_regs *regs);
extern int APIC_init_uniprocessor (void);
extern void disable_APIC_timer(void);
extern void enable_APIC_timer(void);
/* Watchdog boolean from the command line */
extern bool_t opt_watchdog;
-typedef int (*nmi_callback_t)(struct cpu_user_regs *regs, int cpu);
+typedef int (*nmi_callback_t)(const struct cpu_user_regs *regs, int cpu);
/**
* set_nmi_callback
#define cpu_relax() rep_nop()
-void show_stack(struct cpu_user_regs *regs);
+void show_stack(const struct cpu_user_regs *regs);
void show_stack_overflow(unsigned int cpu, const struct cpu_user_regs *regs);
-void show_registers(struct cpu_user_regs *regs);
-void show_execution_state(struct cpu_user_regs *regs);
+void show_registers(const struct cpu_user_regs *regs);
+void show_execution_state(const struct cpu_user_regs *regs);
#define dump_execution_state() run_in_exception_handler(show_execution_state)
void show_page_walk(unsigned long addr);
-void noreturn fatal_trap(int trapnr, struct cpu_user_regs *regs);
+void noreturn fatal_trap(int trapnr, const struct cpu_user_regs *regs);
-void compat_show_guest_stack(struct vcpu *, struct cpu_user_regs *, int lines);
+void compat_show_guest_stack(struct vcpu *v,
+ const struct cpu_user_regs *regs, int lines);
extern void mtrr_ap_init(void);
extern void mtrr_bp_init(void);
void mcheck_init(struct cpuinfo_x86 *c, bool_t bsp);
-#define DECLARE_TRAP_HANDLER(_name) \
-void _name(void); \
-void do_ ## _name(struct cpu_user_regs *regs)
+#define DECLARE_TRAP_HANDLER(_name) \
+ void _name(void); \
+ void do_ ## _name(struct cpu_user_regs *regs)
+#define DECLARE_TRAP_HANDLER_CONST(_name) \
+ void _name(void); \
+ void do_ ## _name(const struct cpu_user_regs *regs)
+
DECLARE_TRAP_HANDLER(divide_error);
DECLARE_TRAP_HANDLER(debug);
-DECLARE_TRAP_HANDLER(nmi);
+DECLARE_TRAP_HANDLER_CONST(nmi);
DECLARE_TRAP_HANDLER(int3);
DECLARE_TRAP_HANDLER(overflow);
DECLARE_TRAP_HANDLER(bounds);
DECLARE_TRAP_HANDLER(early_page_fault);
DECLARE_TRAP_HANDLER(coprocessor_error);
DECLARE_TRAP_HANDLER(simd_coprocessor_error);
-DECLARE_TRAP_HANDLER(machine_check);
+DECLARE_TRAP_HANDLER_CONST(machine_check);
DECLARE_TRAP_HANDLER(alignment_check);
+
+#undef DECLARE_TRAP_HANDLER_CONST
#undef DECLARE_TRAP_HANDLER
void trap_nop(void);
struct cpu_user_regs;
-extern void machine_check_vector(struct cpu_user_regs *regs, long error_code);
+extern void machine_check_vector(const struct cpu_user_regs *regs, long error_code);
void async_exception_cleanup(struct vcpu *);