From 3029144412cf13580e11bc1dffca8b14e05014d0 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Sun, 13 Jun 2021 06:31:47 +0300 Subject: [PATCH] missing "SEG_BIG" flag in data segments (desc_seg()) --- sys1/kern/src/desc.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/sys1/kern/src/desc.c b/sys1/kern/src/desc.c index 9af939e..4e02991 100644 --- a/sys1/kern/src/desc.c +++ b/sys1/kern/src/desc.c @@ -4,8 +4,6 @@ #define SEG_TYPE_CODE 0x00001800 #define SEG_TYPE_DATA 0x00001000 #define SEG_TYPE_TSS 0x00000100 -#define SEG_TYPE_INTR 0x00000e00 -#define SEG_TYPE_TRAP 0x00000f00 #define SEG_ACCESSED 0x00000100 #define SEG_PRESENT 0x00008000 @@ -29,24 +27,16 @@ void desc_seg(struct desc *desc, int type, uint32_t base, uint32_t limit, int dpl) { + static uint32_t segtype[] = { 0, SEG_TYPE_CODE, SEG_TYPE_DATA, SEG_TYPE_TSS }; + if(type == SEG_NULL) { desc->d[0] = desc->d[1] = 0; return; } desc->d[0] = (limit & 0xffff) | (base << 16); - desc->d[1] = ((base >> 16) & 0xff) | (type << 8) | SEG_PRESENT | (dpl << 13); - desc->d[1] |= (base & 0xff000000) | (limit & 0xf0000) | SEG_AVL | SEG_GRAN; - - switch(type) { - case SEG_CODE: - desc->d[1] |= (3 << 11) | SEG_DEF | SEG_RD; - break; - - case SEG_DATA: - desc->d[1] |= (2 << 11) | SEG_WR; - break; - } + desc->d[1] = ((base >> 16) & 0xff) | (type << 8) | SEG_PRESENT | (dpl << 13) | segtype[type]; + desc->d[1] |= (base & 0xff000000) | (limit & 0xf0000) | SEG_GRAN | SEG_DEF | SEG_RD; } -- 1.7.10.4