Modestus Moon OS  R4
CS 450 project
tables.c
Go to the documentation of this file.
1 /*
2  ----- tables.c -----
3 
4  Description..: Routines for setting up the global descriptor
5  table and interrupt descriptor table.
6 */
7 
8 #include <string.h>
9 #include <core/tables.h>
10 
11 // Global Descriptor Table
12 gdt_descriptor gdt_ptr;
13 gdt_entry gdt_entries[5];
14 
15 // Interrupt Descriptor Table
16 idt_descriptor idt_ptr;
17 idt_entry idt_entries[256];
18 
19 // Assembly routines to install tables
20 extern void write_gdt_ptr(u32int, size_t);
21 extern void write_idt_ptr(u32int);
22 
23 /*
24  Procedure..: idt_set_gate
25  Description..: Installs a new gate entry into the IDT.
26 */
28  u8int flags)
29 {
30  idt_entry *new_entry = &idt_entries[idx];
31  new_entry->base_low = (base & 0xFFFF);
32  new_entry->base_high = (base >> 16) & 0xFFFF;
33  new_entry->sselect = sel;
34  new_entry->zero = 0;
35  new_entry->flags = flags;
36 }
37 
38 /*
39  Procedure..: init_idt
40  Description..: Creates the interrupt descriptor table and
41  writes the pointer using the defined assembly function.
42 */
43 void init_idt()
44 {
45  idt_ptr.limit = 256*sizeof(idt_descriptor) - 1;
46  idt_ptr.base = (u32int)idt_entries;
47  memset(idt_entries, 0, 256*sizeof(idt_descriptor));
48 
50 }
51 
52 /*
53  Procedure..: gdt_init_entry
54  Description..: Installs a new table entry into the global
55  descriptor table.
56 */
59 {
60  gdt_entry *new_entry = &gdt_entries[idx];
61  new_entry->base_low = (base & 0xFFFF);
62  new_entry->base_mid = (base >> 16) & 0xFF;
63  new_entry->base_high = (base >> 24) & 0xFF;
64  new_entry->limit_low = (limit & 0xFFFF);
65  new_entry->flags = (limit >> 16) & 0xFF;
66  new_entry->flags |= flags & 0xF0;
67  new_entry->access = access;
68 }
69 
70 /*
71  Procedure..: init_gdt
72  Description..: Creates the global descriptor table and installs
73  it using the defined assembly routine.
74 */
75 void init_gdt()
76 {
77  gdt_ptr.limit = 5 * sizeof(gdt_entry) - 1;
78  gdt_ptr.base = (u32int) gdt_entries;
79 
80  u32int limit = 0xFFFFFFFF;
81  gdt_init_entry(0, 0, 0, 0, 0); //required null segment
82  gdt_init_entry(1, 0, limit, 0x9A, 0xCF); //code segment
83  gdt_init_entry(2, 0, limit, 0x92, 0xCF); //data segment
84  gdt_init_entry(3, 0, limit, 0xFA, 0xCF); //user mode code segment
85  gdt_init_entry(4, 0, limit, 0xF2, 0xCF); //user mode data segment
86 
87  write_gdt_ptr((u32int) &gdt_ptr, sizeof(gdt_ptr));
88 }
u32int base
Definition: tables.h:53
unsigned char u8int
Definition: system.h:25
idt_entry idt_entries[256]
Definition: tables.c:17
void write_idt_ptr(u32int)
idt_descriptor idt_ptr
Definition: tables.c:16
u16int limit
Definition: tables.h:52
void idt_set_gate(u8int idx, u32int base, u16int sel, u8int flags)
Definition: tables.c:27
void init_gdt()
Definition: tables.c:75
u8int access
Definition: tables.h:55
void init_idt()
Definition: tables.c:43
unsigned long u32int
Definition: system.h:27
void write_gdt_ptr(u32int, size_t)
void gdt_init_entry(int idx, u32int base, u32int limit, u8int access, u8int flags)
Definition: tables.c:57
void * memset(void *s, int c, size_t n)
memset Set a region of memory.
Definition: string.c:139
unsigned short u16int
Definition: system.h:26
gdt_descriptor gdt_ptr
Definition: tables.c:12
u8int flags
Definition: tables.h:55
gdt_entry gdt_entries[5]
Definition: tables.c:13