Espresso 0.0.1c
This commit is contained in:
@ -16,11 +16,21 @@ extern void gdt_flush(uint32_t);
|
||||
|
||||
void gdt_install(bool prnt_gdt)
|
||||
{
|
||||
create_descriptor(0, 0, 0, 0, prnt_gdt); // Null
|
||||
create_descriptor(1, 0, 0x000FFFFF, GDT_CODE_PL0, prnt_gdt); // Kernel code
|
||||
create_descriptor(2, 0, 0x000FFFFF, GDT_DATA_PL0, prnt_gdt); // Kernel data
|
||||
create_descriptor(3, 0, 0x000FFFFF, GDT_CODE_PL3, prnt_gdt); // User code
|
||||
create_descriptor(4, 0, 0x000FFFFF, GDT_DATA_PL3, prnt_gdt); // User data
|
||||
if (prnt_gdt)
|
||||
{
|
||||
printf("<===== GDT =====>\n");
|
||||
}
|
||||
|
||||
create_descriptor(0, 0, 0, 0, prnt_gdt); /* Null */
|
||||
create_descriptor(1, 0, 0x000FFFFF, GDT_CODE_PL0, prnt_gdt); /* Kernel code */
|
||||
create_descriptor(2, 0, 0x000FFFFF, GDT_DATA_PL0, prnt_gdt); /* Kernel data */
|
||||
create_descriptor(3, 0, 0x000FFFFF, GDT_CODE_PL3, prnt_gdt); /* User code */
|
||||
create_descriptor(4, 0, 0x000FFFFF, GDT_DATA_PL3, prnt_gdt); /* User data */
|
||||
|
||||
if (prnt_gdt)
|
||||
{
|
||||
printf("<===== GDT =====>\n");
|
||||
}
|
||||
|
||||
gp.limit = sizeof(gdt) - 1;
|
||||
gp.base = (uint32_t)&gdt;
|
||||
@ -32,15 +42,15 @@ void create_descriptor(int index, uint32_t base, uint32_t limit, uint16_t flag,
|
||||
{
|
||||
uint64_t descriptor;
|
||||
|
||||
descriptor = limit & 0x000F0000; // limit bits 19:16
|
||||
descriptor |= (flag << 8) & 0x00F0FF00; // flags and access
|
||||
descriptor |= (base >> 16) & 0x000000FF; // base bits 23:16
|
||||
descriptor |= base & 0xFF000000; // base bits 31:24
|
||||
descriptor = limit & 0x000F0000; /* limit bits 19:16 */
|
||||
descriptor |= (flag << 8) & 0x00F0FF00; /* flags and access */
|
||||
descriptor |= (base >> 16) & 0x000000FF; /* base bits 23:16 */
|
||||
descriptor |= base & 0xFF000000; /* base bits 31:24 */
|
||||
|
||||
descriptor <<= 32;
|
||||
|
||||
descriptor |= ((uint64_t)base << 16); // base bits 15:0
|
||||
descriptor |= (limit & 0x0000FFFF); // limit bits 15:0
|
||||
descriptor |= ((uint64_t)base << 16); /* base bits 15:0 */
|
||||
descriptor |= (limit & 0x0000FFFF); /* limit bits 15:0 */
|
||||
|
||||
gdt[index] = descriptor;
|
||||
|
||||
|
Reference in New Issue
Block a user