CS350 COS
COS
Loading...
Searching...
No Matches
trap.h File Reference

Go to the source code of this file.

Data Structures

struct  TrapFrame
 

Macros

#define T_DE   0 /* Divide Error Exception */
 
#define T_DB   1 /* Debug Exception */
 
#define T_NMI   2 /* NMI Interrupt */
 
#define T_BP   3 /* Breakpoint Exception */
 
#define T_OF   4 /* Overflow Exception */
 
#define T_BR   5 /* BOUND Range Exceeded Exception */
 
#define T_UD   6 /* Invalid Opcode Exception */
 
#define T_NM   7 /* Device Not Available Exception */
 
#define T_DF   8 /* Double Fault Exception */
 
#define T_TS   10 /* Invalid TSS Exception */
 
#define T_NP   11 /* Segment Not Present */
 
#define T_SS   12 /* Stack Fault Exception */
 
#define T_GP   13 /* General Protection Exception */
 
#define T_PF   14 /* Page-Fault Exception */
 
#define T_MF   16 /* x87 FPU Floating-Point Error */
 
#define T_AC   17 /* Alignment Check Exception */
 
#define T_MC   18 /* Machine-Check Exception */
 
#define T_XF   19 /* SIMB Floating-Point Exception */
 
#define T_VE   20 /* Virtualization Exception */
 
#define T_CPU_LAST   T_VE
 
#define T_IRQ_BASE   32
 
#define T_IRQ_LEN   24
 
#define T_IRQ_MAX   (T_IRQ_BASE + T_IRQ_LEN - 1)
 
#define T_IRQ_TIMER   (T_IRQ_BASE + 0)
 
#define T_IRQ_KBD   (T_IRQ_BASE + 1)
 
#define T_IRQ_COM1   (T_IRQ_BASE + 4)
 
#define T_IRQ_MOUSE   (T_IRQ_BASE + 12)
 
#define T_IRQ_SPURIOUS   (T_IRQ_BASE + 24)
 
#define T_IRQ_ERROR   (T_IRQ_BASE + 25)
 
#define T_IRQ_THERMAL   (T_IRQ_BASE + 26)
 
#define T_SYSCALL   60 /* System Call */
 
#define T_CROSSCALL   61 /* Cross Call (IPI) */
 
#define T_DEBUGIPI   62 /* Kernel Debugger Halt (IPI) */
 
#define T_UNKNOWN   63 /* Unknown Trap */
 
#define T_MAX   64
 

Typedefs

typedef struct TrapFrame TrapFrame
 

Functions

void Trap_Init ()
 
void Trap_InitAP ()
 
void Trap_Dump (TrapFrame *tf)
 
void Trap_Pop (TrapFrame *tf)
 

Data Structure Documentation

◆ TrapFrame

struct TrapFrame

Definition at line 50 of file trap.h.

Collaboration diagram for TrapFrame:
[legend]
Data Fields
uint32_t _unused0
uint16_t _unused1
uint16_t _unused2
uint16_t _unused3
uint16_t _unused4
uint16_t _unused5
uint16_t _unused6
uint16_t cs
uint64_t ds
uint32_t errcode
uint64_t r10
uint64_t r11
uint64_t r12
uint64_t r13
uint64_t r14
uint64_t r15
uint64_t r8
uint64_t r9
uint64_t rax
uint64_t rbp
uint64_t rbx
uint64_t rcx
uint64_t rdi
uint64_t rdx
uint64_t rflags
uint64_t rip
uint64_t rsi
uint64_t rsp
uint16_t ss
uint64_t vector

Macro Definition Documentation

◆ T_AC

#define T_AC   17 /* Alignment Check Exception */

Definition at line 20 of file trap.h.

◆ T_BP

#define T_BP   3 /* Breakpoint Exception */

Definition at line 8 of file trap.h.

◆ T_BR

#define T_BR   5 /* BOUND Range Exceeded Exception */

Definition at line 10 of file trap.h.

◆ T_CPU_LAST

#define T_CPU_LAST   T_VE

Definition at line 25 of file trap.h.

◆ T_CROSSCALL

#define T_CROSSCALL   61 /* Cross Call (IPI) */

Definition at line 43 of file trap.h.

◆ T_DB

#define T_DB   1 /* Debug Exception */

Definition at line 6 of file trap.h.

◆ T_DE

#define T_DE   0 /* Divide Error Exception */

Definition at line 5 of file trap.h.

◆ T_DEBUGIPI

#define T_DEBUGIPI   62 /* Kernel Debugger Halt (IPI) */

Definition at line 44 of file trap.h.

◆ T_DF

#define T_DF   8 /* Double Fault Exception */

Definition at line 13 of file trap.h.

◆ T_GP

#define T_GP   13 /* General Protection Exception */

Definition at line 17 of file trap.h.

◆ T_IRQ_BASE

#define T_IRQ_BASE   32

Definition at line 28 of file trap.h.

◆ T_IRQ_COM1

#define T_IRQ_COM1   (T_IRQ_BASE + 4)

Definition at line 34 of file trap.h.

◆ T_IRQ_ERROR

#define T_IRQ_ERROR   (T_IRQ_BASE + 25)

Definition at line 39 of file trap.h.

◆ T_IRQ_KBD

#define T_IRQ_KBD   (T_IRQ_BASE + 1)

Definition at line 33 of file trap.h.

◆ T_IRQ_LEN

#define T_IRQ_LEN   24

Definition at line 29 of file trap.h.

◆ T_IRQ_MAX

#define T_IRQ_MAX   (T_IRQ_BASE + T_IRQ_LEN - 1)

Definition at line 30 of file trap.h.

◆ T_IRQ_MOUSE

#define T_IRQ_MOUSE   (T_IRQ_BASE + 12)

Definition at line 35 of file trap.h.

◆ T_IRQ_SPURIOUS

#define T_IRQ_SPURIOUS   (T_IRQ_BASE + 24)

Definition at line 38 of file trap.h.

◆ T_IRQ_THERMAL

#define T_IRQ_THERMAL   (T_IRQ_BASE + 26)

Definition at line 40 of file trap.h.

◆ T_IRQ_TIMER

#define T_IRQ_TIMER   (T_IRQ_BASE + 0)

Definition at line 32 of file trap.h.

◆ T_MAX

#define T_MAX   64

Definition at line 48 of file trap.h.

◆ T_MC

#define T_MC   18 /* Machine-Check Exception */

Definition at line 21 of file trap.h.

◆ T_MF

#define T_MF   16 /* x87 FPU Floating-Point Error */

Definition at line 19 of file trap.h.

◆ T_NM

#define T_NM   7 /* Device Not Available Exception */

Definition at line 12 of file trap.h.

◆ T_NMI

#define T_NMI   2 /* NMI Interrupt */

Definition at line 7 of file trap.h.

◆ T_NP

#define T_NP   11 /* Segment Not Present */

Definition at line 15 of file trap.h.

◆ T_OF

#define T_OF   4 /* Overflow Exception */

Definition at line 9 of file trap.h.

◆ T_PF

#define T_PF   14 /* Page-Fault Exception */

Definition at line 18 of file trap.h.

◆ T_SS

#define T_SS   12 /* Stack Fault Exception */

Definition at line 16 of file trap.h.

◆ T_SYSCALL

#define T_SYSCALL   60 /* System Call */

Definition at line 42 of file trap.h.

◆ T_TS

#define T_TS   10 /* Invalid TSS Exception */

Definition at line 14 of file trap.h.

◆ T_UD

#define T_UD   6 /* Invalid Opcode Exception */

Definition at line 11 of file trap.h.

◆ T_UNKNOWN

#define T_UNKNOWN   63 /* Unknown Trap */

Definition at line 46 of file trap.h.

◆ T_VE

#define T_VE   20 /* Virtualization Exception */

Definition at line 23 of file trap.h.

◆ T_XF

#define T_XF   19 /* SIMB Floating-Point Exception */

Definition at line 22 of file trap.h.

Typedef Documentation

◆ TrapFrame

typedef struct TrapFrame TrapFrame

Function Documentation

◆ Trap_Dump()

void Trap_Dump ( TrapFrame tf)

Definition at line 95 of file trap.c.

96{
97 kprintf("CPU %d\n", CPU());
98 kprintf("Interrupt %d Error Code: %016llx\n",
99 tf->vector, tf->errcode);
100 kprintf("cr0: %016llx cr2: %016llx\n",
101 read_cr0(), read_cr2());
102 kprintf("cr3: %016llx cr4: %016llx\n",
103 read_cr3(), read_cr4());
104 kprintf("dr0: %016llx dr1: %016llx dr2: %016llx\n",
105 read_dr0(), read_dr1(), read_dr2());
106 kprintf("dr3: %016llx dr6: %016llx dr7: %016llx\n",
107 read_dr3(), read_dr6(), read_dr7());
108 kprintf("rip: %04x:%016llx rsp: %04x:%016llx\n",
109 tf->cs, tf->rip, tf->ss, tf->rsp);
110 kprintf("rflags: %016llx ds: %04x es: %04x fs: %04x gs: %04x\n",
111 tf->rflags, read_ds(), read_es(), read_fs(), read_gs());
112 kprintf("rax: %016llx rbx: %016llx rcx: %016llx\n",
113 tf->rax, tf->rbx, tf->rcx);
114 kprintf("rdx: %016llx rsi: %016llx rdi: %016llx\n",
115 tf->rdx, tf->rsi, tf->rdi);
116 kprintf("rbp: %016llx r8: %016llx r9: %016llx\n",
117 tf->rbp, tf->r8, tf->r9);
118 kprintf("r10: %016llx r11: %016llx r12: %016llx\n",
119 tf->r10, tf->r11, tf->r12);
120 kprintf("r13: %016llx r14: %016llx r15: %016llx\n",
121 tf->r13, tf->r14, tf->r15);
122}
static INLINE uint64_t read_dr1()
Definition: amd64op.h:211
static INLINE uint16_t read_es()
Definition: amd64op.h:317
static INLINE uint16_t read_ds()
Definition: amd64op.h:300
static INLINE uint64_t read_cr2()
Definition: amd64op.h:146
static INLINE uint16_t read_fs()
Definition: amd64op.h:334
static INLINE uint64_t read_cr3()
Definition: amd64op.h:156
static INLINE uint64_t read_dr3()
Definition: amd64op.h:245
static INLINE uint64_t read_dr7()
Definition: amd64op.h:279
static INLINE uint64_t read_dr6()
Definition: amd64op.h:262
static INLINE uint16_t read_gs()
Definition: amd64op.h:351
static INLINE uint64_t read_cr4()
Definition: amd64op.h:173
static INLINE uint64_t read_cr0()
Definition: amd64op.h:129
static INLINE uint64_t read_dr0()
Definition: amd64op.h:194
static INLINE uint64_t read_dr2()
Definition: amd64op.h:228
#define CPU
Definition: mp.h:7
int kprintf(const char *fmt,...)
Definition: printf.c:210
uint16_t cs
Definition: trap.h:73
uint64_t r8
Definition: trap.h:59
uint64_t r15
Definition: trap.h:52
uint64_t rsi
Definition: trap.h:62
uint64_t rbp
Definition: trap.h:60
uint16_t ss
Definition: trap.h:79
uint64_t rsp
Definition: trap.h:78
uint64_t r12
Definition: trap.h:55
uint64_t rbx
Definition: trap.h:65
uint64_t rip
Definition: trap.h:72
uint64_t rdi
Definition: trap.h:61
uint64_t rax
Definition: trap.h:67
uint64_t r14
Definition: trap.h:53
uint64_t vector
Definition: trap.h:69
uint64_t rcx
Definition: trap.h:64
uint32_t errcode
Definition: trap.h:70
uint64_t r10
Definition: trap.h:57
uint64_t r13
Definition: trap.h:54
uint64_t r9
Definition: trap.h:58
uint64_t rflags
Definition: trap.h:77
uint64_t rdx
Definition: trap.h:63
uint64_t r11
Definition: trap.h:56
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Trap_Init()

void Trap_Init ( )

Definition at line 33 of file trap.c.

34{
35 int i;
36
37 kprintf("Initializing IDT... ");
38
39 for (i = 0; i < T_MAX; i++) {
40 idt[i].pc_low = trap_table[i] & 0x0000ffff;
41 idt[i].pc_mid = (trap_table[i] >> 16) & 0x0000ffff;
42 idt[i].pc_high = trap_table[i] >> 32;
43
44 idt[i].cs = 0x0008;
45 idt[i].type = 0x8E;
46
47 idt[i].ist = 0x00;
48 idt[i]._unused1 = 0x00000000;
49 }
50
51 for (; i < 256; i++) {
52 idt[i].pc_low = trap_table[63] & 0x0000ffff;
53 idt[i].pc_mid = (trap_table[63] >> 16) & 0x0000ffff;
54 idt[i].pc_high = trap_table[63] >> 32;
55
56 idt[i].cs = 0x0008;
57 idt[i].type = 0x8E;
58
59 idt[i].ist = 0;
60 idt[i]._unused1 = 0;
61 }
62
63 // Double fault handler
64 idt[T_NMI].ist = 0x01;
65 idt[T_DF].ist = 0x01;
66 idt[T_GP].ist = 0x01;
67 idt[T_NP].ist = 0x01;
68 idt[T_SS].ist = 0x01;
69
70 // Enable Breakpoint and Syscall from Userspace
71 idt[T_DB].type = 0xEE;
72 idt[T_BP].type = 0xEE;
73 idt[T_SYSCALL].type = 0xEE;
74
76 idtdesc.lim = sizeof(idt) - 1;
77
78 lidt(&idtdesc);
79
80 // Zero out interrupt stats
81 for (i = 0; i < 256; i++) {
82 intStats[i] = 0;
83 }
84
85 kprintf("Done!\n");
86}
uint64_t off
Definition: amd64.h:64
uint8_t type
Definition: amd64.h:96
uint16_t cs
Definition: amd64.h:94
uint32_t pc_high
Definition: amd64.h:98
uint16_t pc_low
Definition: amd64.h:93
uint16_t pc_mid
Definition: amd64.h:97
uint32_t _unused1
Definition: amd64.h:99
uint8_t ist
Definition: amd64.h:95
uint16_t lim
Definition: amd64.h:63
static INLINE void lidt(PseudoDescriptor *idt)
Definition: amd64op.h:62
static uint64_t intStats[256]
Definition: trap.c:30
static InteruptGate64 idt[256]
Definition: trap.c:28
static PseudoDescriptor idtdesc
Definition: trap.c:29
uint64_t trap_table[T_MAX]
#define T_SS
Definition: trap.h:16
#define T_DF
Definition: trap.h:13
#define T_GP
Definition: trap.h:17
#define T_BP
Definition: trap.h:8
#define T_DB
Definition: trap.h:6
#define T_NMI
Definition: trap.h:7
#define T_SYSCALL
Definition: trap.h:42
#define T_NP
Definition: trap.h:15
#define T_MAX
Definition: trap.h:48
unsigned long uint64_t
Definition: types.h:13
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Trap_InitAP()

void Trap_InitAP ( )

Definition at line 89 of file trap.c.

90{
91 lidt(&idtdesc);
92}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Trap_Pop()

void Trap_Pop ( TrapFrame tf)
Here is the caller graph for this function: