/*
* Copyright (c) 2011-2014 Richard Braun.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*
* Trap (interrupt and exception) handling.
*
* This file is a top header in the inclusion hierarchy, and shouldn't include
* other headers that may cause circular dependencies.
*/
#ifndef X86_TRAP_H
#define X86_TRAP_H
#include
/*
* Architecture defined traps.
*/
#define TRAP_DE 0 /* Divide Error */
#define TRAP_DB 1 /* Debug */
#define TRAP_NMI 2 /* NMI Interrupt */
#define TRAP_BP 3 /* Breakpoint */
#define TRAP_OF 4 /* Overflow */
#define TRAP_BR 5 /* BOUND Range Exceeded */
#define TRAP_UD 6 /* Invalid Opcode (Undefined Opcode) */
#define TRAP_NM 7 /* Device Not Available (No Math Coprocessor) */
#define TRAP_DF 8 /* Double Fault */
#define TRAP_TS 10 /* Invalid TSS */
#define TRAP_NP 11 /* Segment Not Present */
#define TRAP_SS 12 /* Stack-Segment Fault */
#define TRAP_GP 13 /* General Protection */
#define TRAP_PF 14 /* Page Fault */
#define TRAP_MF 16 /* x87 FPU Floating-Point Error (Math Fault) */
#define TRAP_AC 17 /* Alignment Check */
#define TRAP_MC 18 /* Machine Check */
#define TRAP_XM 19 /* SIMD Floating-Point Exception */
/*
* Traps used for handling external interrupts.
*/
#define TRAP_INTR_FIRST 32
#define TRAP_INTR_LAST 223
/*
* System defined traps.
*
* The local APIC assigns one priority every 16 vectors.
*/
#define TRAP_XCALL 238
#define TRAP_THREAD_SCHEDULE 239
#define TRAP_CPU_HALT 240
#define TRAP_LAPIC_PMC_OF 252
#define TRAP_LAPIC_TIMER 253
#define TRAP_LAPIC_ERROR 254
#define TRAP_LAPIC_SPURIOUS 255
#define TRAP_NR_VECTORS 256
#define TRAP_INTR_TABLE_SIZE 256
#define TRAP_STACK_SIZE PAGE_SIZE
#ifndef __ASSEMBLER__
#include
#include
#include
#include
#ifdef __LP64__
struct trap_frame {
uint64_t rax;
uint64_t rbx;
uint64_t rcx;
uint64_t rdx;
uint64_t rbp;
uint64_t rsi;
uint64_t rdi;
uint64_t r8;
uint64_t r9;
uint64_t r10;
uint64_t r11;
uint64_t r12;
uint64_t r13;
uint64_t r14;
uint64_t r15;
uint64_t vector;
uint64_t error;
uint64_t rip;
uint64_t cs;
uint64_t rflags;
uint64_t rsp;
uint64_t ss;
} __packed;
#else /* __LP64__ */
struct trap_frame {
uint32_t eax;
uint32_t ebx;
uint32_t ecx;
uint32_t edx;
uint32_t ebp;
uint32_t esi;
uint32_t edi;
uint16_t ds;
uint16_t es;
uint16_t fs;
uint16_t gs;
uint32_t vector;
uint32_t error;
uint32_t eip;
uint32_t cs;
uint32_t eflags;
uint32_t esp; /* esp and ss are undefined if trapped in kernel */
uint32_t ss;
} __packed;
#endif /* __LP64__ */
/*
* Type for trap handler functions.
*/
typedef void (*trap_handler_fn_t)(struct trap_frame *);
static inline void
trap_trigger_double_fault(void)
{
printf("trap: double fault test\n");
asm volatile("movl $0xdead, %esp; push $0");
}
/*
* Unified trap entry point.
*/
void trap_main(struct trap_frame *frame);
/*
* Register a trap handler.
*/
void trap_register(unsigned int vector, trap_handler_fn_t handler_fn);
/*
* Display the content of a trap frame.
*/
void trap_frame_show(struct trap_frame *frame);
/*
* Display the call trace interrupted by the trap of the given frame.
*/
void trap_stack_show(struct trap_frame *frame);
/*
* Return a pointer to the local interrupt stack.
*
* This function is called by the low level trap handling code.
*
* Return NULL if no stack switching is required.
*/
void * trap_get_interrupt_stack(const struct trap_frame *frame);
/*
* This init operation provides :
* - initialization of all IDT entries and trap handlers
* - double fault exception support
*/
INIT_OP_DECLARE(trap_setup);
#endif /* __ASSEMBLER__ */
#endif /* X86_TRAP_H */