why?<br>
<br>
The payload will have its own GDT.<br>
<br>
YH<br><br><div><span class="gmail_quote">On 9/9/05, <b class="gmail_sendername">Steven J. Magnani</b> <<a href="mailto:steve@digidescorp.com">steve@digidescorp.com</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I posted this patch previously; see<br><a href="http://openbios.org/pipermail/linuxbios/2005-August/012063.html">http://openbios.org/pipermail/linuxbios/2005-August/012063.html</a> for the<br>original issue.<br><br>Here's another chance to comment before I commit it.
<br><br>PATCH:<br><br>--- src/arch/i386/boot/tables.c.orig    2005-09-08 13:35:39.125000000<br>-0500<br>+++ src/arch/i386/boot/tables.c 2005-08-16 16:17:41.766000000 -0500<br>@@ -7,6 +7,32 @@<br> #include <arch/acpi.h>
<br> #include "linuxbios_table.h"<br><br>+// Global Descriptor Table, defined in c_start.S<br>+extern uint8_t gdt;<br>+extern uint8_t gdt_end;<br>+<br>+/* i386 lgdt argument */<br>+struct gdtarg {<br>+    unsigned short limit;
<br>+    unsigned int base;<br>+} __attribute__((packed));<br>+<br>+// Copy GDT to new location and reload it<br>+// 2003-07 by SONE Takeshi<br>+// Ported from Etherboot to LinuxBIOS 2005-08 by Steve Magnani<br>+void move_gdt(unsigned long newgdt)
<br>+{<br>+       uint16_t num_gdt_bytes = &gdt_end - &gdt;<br>+    struct gdtarg gdtarg;<br>+<br>+    printk_debug("Moving GDT to %#lx...", newgdt);<br>+    memcpy((void*)newgdt, &gdt, num_gdt_bytes);
<br>+    gdtarg.base = newgdt;<br>+    gdtarg.limit = num_gdt_bytes - 1;<br>+    __asm__ __volatile__ ("lgdt %0\n\t" : : "m" (gdtarg));<br>+    printk_debug("ok\n");<br>+}<br>+<br> struct lb_memory *write_tables(void)
<br> {<br>        unsigned long low_table_start, low_table_end;<br>@@ -45,6 +71,10 @@<br>                low_table_end = 0x500;<br>        }<br><br>+       // Relocate the GDT to reserved memory, so it won't get<br>clobbered
<br>+       move_gdt(low_table_end);<br>+       low_table_end += &gdt_end - &gdt;<br>+<br>        /* The linuxbios table must be in 0-4K or 960K-1M */<br>        write_linuxbios_table(<br>                              low_table_start,
low_table_end,<br><br>------------------------------------------------------------------------<br>
Steven J.
Magnani              
"I claim this network for MARS!<br>
<a href="http://www.digidescorp.com">www.digidescorp.com</a>              Earthling,
return my space modulator!"<br><br> #include <standard.disclaimer><br><br><br><br><br>--<br>LinuxBIOS mailing list<br><a href="mailto:LinuxBIOS@openbios.org">LinuxBIOS@openbios.org</a><br><a href="http://www.openbios.org/mailman/listinfo/linuxbios">
http://www.openbios.org/mailman/listinfo/linuxbios</a><br></blockquote></div><br>