diff --git a/repos/base-hw/src/core/include/spec/x86_64/gdt.h b/repos/base-hw/src/core/include/spec/x86_64/gdt.h index 09e42ba12..a3bc5ebe2 100644 --- a/repos/base-hw/src/core/include/spec/x86_64/gdt.h +++ b/repos/base-hw/src/core/include/spec/x86_64/gdt.h @@ -5,6 +5,7 @@ #include extern int _mt_gdt_start; +extern int _mt_gdt_end; namespace Genode { @@ -26,8 +27,9 @@ class Genode::Gdt */ static void load(addr_t const virt_base) { - asm volatile ("lgdt %0" : : "m" (Pseudo_descriptor (0x37, - _virt_mtc_addr(virt_base, (addr_t)&_mt_gdt_start)))); + asm volatile ("lgdt %0" : : "m" (Pseudo_descriptor + (_mt_gdt_end - _mt_gdt_start - 1, + _virt_mtc_addr(virt_base, (addr_t)&_mt_gdt_start)))); } }; diff --git a/repos/base-hw/src/core/spec/x86_64/mode_transition.s b/repos/base-hw/src/core/spec/x86_64/mode_transition.s index d9bd1cd6b..8f4ad81a0 100644 --- a/repos/base-hw/src/core/spec/x86_64/mode_transition.s +++ b/repos/base-hw/src/core/spec/x86_64/mode_transition.s @@ -300,6 +300,7 @@ .long 0x8900 .long 0 .long 0 + .global _mt_gdt_end _mt_gdt_end: /* end of the mode transition code */