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 09e42ba129..a3bc5ebe20 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 <mtc_util.h>
 
 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 d9bd1cd6ba..8f4ad81a0c 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 */