missing "SEG_BIG" flag in data segments (desc_seg())
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 13 Jun 2021 03:31:47 +0000 (06:31 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 13 Jun 2021 03:31:47 +0000 (06:31 +0300)
sys1/kern/src/desc.c

index 9af939e..4e02991 100644 (file)
@@ -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
 
 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;
 }