From f39779e81033e713478039ece1a62025818fcf1c Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 20 Mar 2025 19:03:46 +0100 Subject: [PATCH] i386: remove dependency on This defines memory-protection flags specifically for the GDT. --- src/arch/i386/gdt.h | 5 ++++- src/kernel/multiboot.c | 4 ++-- src/loader/gdt.c | 12 ++++++------ src/loader/multiboot.c | 4 ++-- tests/gdt.c | 10 +++++----- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/arch/i386/gdt.h b/src/arch/i386/gdt.h index 9f13152..2f82e2e 100644 --- a/src/arch/i386/gdt.h +++ b/src/arch/i386/gdt.h @@ -7,7 +7,6 @@ #ifndef UKERNEL_ARCH_I386_GDT_H # define UKERNEL_ARCH_I386_GDT_H -# include # include # include @@ -70,6 +69,10 @@ typedef struct _TSS /* constants */ +# define GDT_PROT_READ 0x1 +# define GDT_PROT_WRITE 0x2 +# define GDT_PROT_EXEC 0x4 + # define GDT_SYSTEM_TYPE_LDT 0x2 # define GDT_SYSTEM_TYPE_TSS 0x9 diff --git a/src/kernel/multiboot.c b/src/kernel/multiboot.c index d6f5f7e..5bcb92c 100644 --- a/src/kernel/multiboot.c +++ b/src/kernel/multiboot.c @@ -29,8 +29,8 @@ /* GDT: 4GB flat memory setup */ static const GDTTable _gdt_4gb[2] = { - { 0x00000000, 0xffffffff, PROT_READ | PROT_EXEC }, - { 0x00000000, 0xffffffff, PROT_READ | PROT_WRITE } + { 0x00000000, 0xffffffff, GDT_PROT_READ | GDT_PROT_EXEC }, + { 0x00000000, 0xffffffff, GDT_PROT_READ | GDT_PROT_WRITE } }; static const IDT _idt[] = diff --git a/src/loader/gdt.c b/src/loader/gdt.c index a11101e..01b0b53 100644 --- a/src/loader/gdt.c +++ b/src/loader/gdt.c @@ -139,9 +139,9 @@ int gdt_append(GDT * gdt, vaddr_t base, size_t size, unsigned int prot) errno = ENOMEM; return -1; } - if(prot != PROT_READ - && prot != (PROT_READ | PROT_WRITE) - && prot != (PROT_READ | PROT_EXEC)) + if(prot != GDT_PROT_READ + && prot != (GDT_PROT_READ | GDT_PROT_WRITE) + && prot != (GDT_PROT_READ | GDT_PROT_EXEC)) { errno = EPERM; return -1; @@ -157,13 +157,13 @@ int gdt_append(GDT * gdt, vaddr_t base, size_t size, unsigned int prot) else limit = size - 1; /* access */ - if(prot == (PROT_READ | PROT_EXEC)) + if(prot == (GDT_PROT_READ | GDT_PROT_EXEC)) /* code segment */ access |= GDT_ACCESS_PROT_RW | GDT_ACCESS_PROT_X; - else if(prot == (PROT_READ | PROT_WRITE)) + else if(prot == (GDT_PROT_READ | GDT_PROT_WRITE)) /* data segment (read/write) */ access |= GDT_ACCESS_PROT_RW; - else if(prot == PROT_READ) + else if(prot == GDT_PROT_READ) /* data segment (read-only) */ access |= GDT_ACCESS_SET; return _gdt_append_entry(gdt, base, limit, access, flags); diff --git a/src/loader/multiboot.c b/src/loader/multiboot.c index 51225ea..fa1b10f 100644 --- a/src/loader/multiboot.c +++ b/src/loader/multiboot.c @@ -31,8 +31,8 @@ /* GDT: 4GB flat memory setup */ static const GDTTable _gdt_4gb[2] = { - { 0x00000000, 0xffffffff, PROT_READ | PROT_EXEC }, - { 0x00000000, 0xffffffff, PROT_READ | PROT_WRITE } + { 0x00000000, 0xffffffff, GDT_PROT_READ | GDT_PROT_EXEC }, + { 0x00000000, 0xffffffff, GDT_PROT_READ | GDT_PROT_WRITE } }; diff --git a/tests/gdt.c b/tests/gdt.c index d5e38e8..21d2fbf 100644 --- a/tests/gdt.c +++ b/tests/gdt.c @@ -54,17 +54,17 @@ int main(int argc, char * argv[]) /* flat 4 GB */ printf("Flat 4 GB:\n"); gdt = gdt_init(); - gdt_append(gdt, 0x00000000, 0xffffffff, PROT_READ | PROT_EXEC); - gdt_append(gdt, 0x00000000, 0xffffffff, PROT_READ | PROT_WRITE); + gdt_append(gdt, 0x00000000, 0xffffffff, GDT_PROT_READ | GDT_PROT_EXEC); + gdt_append(gdt, 0x00000000, 0xffffffff, GDT_PROT_READ | GDT_PROT_WRITE); gdt_append_system(gdt, &tss, sizeof(tss), GDT_SYSTEM_TYPE_TSS); gdt_apply(gdt); /* 4 MB code + 4 MB data (read-write) + 4 MB data (read-only) */ printf("\n4 MB (rx) + 4 MB (rw) + 4 MB (ro):\n"); gdt = gdt_init(); - gdt_append(gdt, 0x00400000, 0x00400000, PROT_READ | PROT_EXEC); - gdt_append(gdt, 0x00800000, 0x00400000, PROT_READ | PROT_WRITE); - gdt_append(gdt, 0x00c00000, 0x00400000, PROT_READ); + gdt_append(gdt, 0x00400000, 0x00400000, GDT_PROT_READ | GDT_PROT_EXEC); + gdt_append(gdt, 0x00800000, 0x00400000, GDT_PROT_READ | GDT_PROT_WRITE); + gdt_append(gdt, 0x00c00000, 0x00400000, GDT_PROT_READ); gdt_append_system(gdt, &tss, sizeof(tss), GDT_SYSTEM_TYPE_TSS); gdt_apply(gdt);