Rev 113 | Rev 141 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 113 | Rev 125 | ||
---|---|---|---|
Line 43... | Line 43... | ||
43 | * We have no use for segmentation so we set up flat mode. In this |
43 | * We have no use for segmentation so we set up flat mode. In this |
44 | * mode, we use, for each privilege level, two segments spanning the |
44 | * mode, we use, for each privilege level, two segments spanning the |
45 | * whole memory. One is for code and one is for data. |
45 | * whole memory. One is for code and one is for data. |
46 | */ |
46 | */ |
47 | struct descriptor gdt[GDT_ITEMS] = { |
47 | struct descriptor gdt[GDT_ITEMS] = { |
48 | /* NULL descriptor */ |
48 | /* NULL descriptor */ |
49 | { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
49 | { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
50 | /* KTEXT descriptor */ |
50 | /* KTEXT descriptor */ |
51 | { 0xffff, 0, 0, AR_PRESENT | AR_CODE | DPL_KERNEL, 0xf, 0, 0, 1, 1, 0 }, |
51 | { 0xffff, 0, 0, AR_PRESENT | AR_CODE | DPL_KERNEL, 0xf, 0, 0, 1, 1, 0 }, |
52 | /* KDATA descriptor */ |
52 | /* KDATA descriptor */ |
53 | { 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_KERNEL, 0xf, 0, 0, 1, 1, 0 }, |
53 | { 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_KERNEL, 0xf, 0, 0, 1, 1, 0 }, |
54 | /* UTEXT descriptor */ |
54 | /* UTEXT descriptor */ |
55 | { 0xffff, 0, 0, AR_PRESENT | AR_CODE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
55 | { 0xffff, 0, 0, AR_PRESENT | AR_CODE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
56 | /* UDATA descriptor */ |
56 | /* UDATA descriptor */ |
57 | { 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
57 | { 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
58 | /* TSS descriptor - set up will be completed later */ |
58 | /* TSS descriptor - set up will be completed later */ |
59 | { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } |
59 | { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } |
60 | }; |
60 | }; |
61 | 61 | ||
62 | static struct idescriptor idt[IDT_ITEMS]; |
62 | static struct idescriptor idt[IDT_ITEMS]; |
63 | 63 | ||
64 | static struct tss tss; |
64 | static struct tss tss; |
Line 69... | Line 69... | ||
69 | struct ptr_16_32 gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt) }; |
69 | struct ptr_16_32 gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt) }; |
70 | struct ptr_16_32 idtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(idt), .base = KA2PA((__address) idt) }; |
70 | struct ptr_16_32 idtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(idt), .base = KA2PA((__address) idt) }; |
71 | 71 | ||
72 | void gdt_setbase(struct descriptor *d, __address base) |
72 | void gdt_setbase(struct descriptor *d, __address base) |
73 | { |
73 | { |
74 | d->base_0_15 = base & 0xffff; |
74 | d->base_0_15 = base & 0xffff; |
75 | d->base_16_23 = ((base) >> 16) & 0xff; |
75 | d->base_16_23 = ((base) >> 16) & 0xff; |
76 | d->base_24_31 = ((base) >> 24) & 0xff; |
76 | d->base_24_31 = ((base) >> 24) & 0xff; |
77 | - | ||
78 | } |
77 | } |
79 | 78 | ||
80 | void gdt_setlimit(struct descriptor *d, __u32 limit) |
79 | void gdt_setlimit(struct descriptor *d, __u32 limit) |
81 | { |
80 | { |
82 | d->limit_0_15 = limit & 0xffff; |
81 | d->limit_0_15 = limit & 0xffff; |
83 | d->limit_16_19 = (limit >> 16) & 0xf; |
82 | d->limit_16_19 = (limit >> 16) & 0xf; |
84 | } |
83 | } |
85 | 84 | ||
86 | void idt_setoffset(struct idescriptor *d, __address offset) |
85 | void idt_setoffset(struct idescriptor *d, __address offset) |
87 | { |
86 | { |
88 | /* |
87 | /* |
Line 102... | Line 101... | ||
102 | */ |
101 | */ |
103 | void idt_init(void) |
102 | void idt_init(void) |
104 | { |
103 | { |
105 | struct idescriptor *d; |
104 | struct idescriptor *d; |
106 | int i; |
105 | int i; |
107 | 106 | ||
108 | for (i = 0; i < IDT_ITEMS; i++) { |
107 | for (i = 0; i < IDT_ITEMS; i++) { |
109 | d = &idt[i]; |
108 | d = &idt[i]; |
110 | 109 | ||
111 | d->unused = 0; |
110 | d->unused = 0; |
112 | d->selector = selector(KTEXT_DES); |
111 | d->selector = selector(KTEXT_DES); |