linux_trampoline: use trampoline RAM for the GDT
The linux trampoline was modifying the existing GDT to add the 0x10 and 0x18 descriptors for Linux. This will not work when the existing GDT is in ROM. Change the code to set up a new GDT in what we know to be RAM. Tested by booting a linux payload. The main reason this works is that Linux almost immediately loads its own GDT and then segment registers. This GDT is a very temporary bridge. Note that none of this change used to be necessary; the coreboot GDT was originally compatible with Linux (ca 2000); then Linux changed. Change-Id: I13990052fbfd6a500adab8a2db8f7aead1d24fa6 Signed-off-by: Ronald G. Minnich <rminnich@gmail.com> Reviewed-on: https://review.coreboot.org/27529 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
parent
ebde659503
commit
eeb83b6b53
|
@ -31,7 +31,6 @@
|
||||||
#define E820_OFFSET 0x2d0
|
#define E820_OFFSET 0x2d0
|
||||||
|
|
||||||
.trampoline_start:
|
.trampoline_start:
|
||||||
|
|
||||||
cld
|
cld
|
||||||
xor %edx, %edx
|
xor %edx, %edx
|
||||||
mov $0, %ecx
|
mov $0, %ecx
|
||||||
|
@ -114,12 +113,13 @@ jnz .tableScan
|
||||||
** Use TRAMPOLINE_ENTRY_LOC as a scratchpad.
|
** Use TRAMPOLINE_ENTRY_LOC as a scratchpad.
|
||||||
*/
|
*/
|
||||||
mov $TRAMPOLINE_ENTRY_LOC, %eax
|
mov $TRAMPOLINE_ENTRY_LOC, %eax
|
||||||
sgdt (%eax)
|
movl $0x0000ffff, 16(%eax) // Set up the 2 new descriptors
|
||||||
mov 2(%eax), %ebx
|
movl $0x00cf9b00, 20(%eax)
|
||||||
movl $0x0000ffff, 16(%ebx)
|
movl $0x0000ffff, 24(%eax)
|
||||||
movl $0x00cf9b00, 20(%ebx)
|
movl $0x00cf9300, 28(%eax)
|
||||||
movl $0x0000ffff, 24(%ebx)
|
movb $0x2b, 0(%eax) // Set the size
|
||||||
movl $0x00cf9300, 28(%ebx)
|
movl %eax, 2(%eax) // Set pointer to new GDT
|
||||||
|
lgdt (%eax) // Load it
|
||||||
|
|
||||||
/* finally: jump to kernel */
|
/* finally: jump to kernel */
|
||||||
mov $LINUX_PARAM_LOC, %esi
|
mov $LINUX_PARAM_LOC, %esi
|
||||||
|
@ -129,5 +129,4 @@ jmp *(LINUX_PARAM_LOC + LINUX_ENTRY_OFFSET)
|
||||||
2:
|
2:
|
||||||
hlt
|
hlt
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
.trampoline_end:
|
.trampoline_end:
|
||||||
|
|
|
@ -2,15 +2,15 @@
|
||||||
unsigned char trampoline[] = {
|
unsigned char trampoline[] = {
|
||||||
0xfc, 0x31, 0xd2, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x00, 0x01, 0xcb, 0x8b,
|
0xfc, 0x31, 0xd2, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x00, 0x01, 0xcb, 0x8b,
|
||||||
0x01, 0x3d, 0x4c, 0x42, 0x49, 0x4f, 0x74, 0x07, 0x83, 0xc1, 0x10, 0x39, 0xcb, 0x75, 0xe9, 0x39,
|
0x01, 0x3d, 0x4c, 0x42, 0x49, 0x4f, 0x74, 0x07, 0x83, 0xc1, 0x10, 0x39, 0xcb, 0x75, 0xe9, 0x39,
|
||||||
0xcb, 0x0f, 0x84, 0x87, 0x00, 0x00, 0x00, 0x8b, 0x59, 0x04, 0x01, 0xcb, 0x8b, 0x49, 0x14, 0x83,
|
0xcb, 0x0f, 0x84, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x59, 0x04, 0x01, 0xcb, 0x8b, 0x49, 0x14, 0x83,
|
||||||
0x3b, 0x11, 0x75, 0x05, 0x8b, 0x4b, 0x08, 0xeb, 0xcf, 0x83, 0x3b, 0x01, 0x75, 0x33, 0x8b, 0x43,
|
0x3b, 0x11, 0x75, 0x05, 0x8b, 0x4b, 0x08, 0xeb, 0xcf, 0x83, 0x3b, 0x01, 0x75, 0x33, 0x8b, 0x43,
|
||||||
0x04, 0x83, 0xe8, 0x08, 0xc1, 0xe8, 0x02, 0x3d, 0xa0, 0x00, 0x00, 0x00, 0x7e, 0x05, 0xb8, 0xa0,
|
0x04, 0x83, 0xe8, 0x08, 0xc1, 0xe8, 0x02, 0x3d, 0xa0, 0x00, 0x00, 0x00, 0x7e, 0x05, 0xb8, 0xa0,
|
||||||
0x00, 0x00, 0x00, 0x89, 0xc6, 0xbf, 0x05, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xa3, 0xe8, 0x01, 0x09,
|
0x00, 0x00, 0x00, 0x89, 0xc6, 0xbf, 0x05, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0xa3, 0xe8, 0x01, 0x09,
|
||||||
0x00, 0x89, 0xf0, 0x91, 0x8d, 0x73, 0x08, 0xbf, 0xd0, 0x02, 0x09, 0x00, 0xf3, 0xa5, 0x91, 0xeb,
|
0x00, 0x89, 0xf0, 0x91, 0x8d, 0x73, 0x08, 0xbf, 0xd0, 0x02, 0x09, 0x00, 0xf3, 0xa5, 0x91, 0xeb,
|
||||||
0x05, 0x83, 0x3b, 0x12, 0x75, 0x00, 0x03, 0x5b, 0x04, 0x49, 0x75, 0xb3, 0xb8, 0x00, 0x00, 0x04,
|
0x05, 0x83, 0x3b, 0x12, 0x75, 0x00, 0x03, 0x5b, 0x04, 0x49, 0x75, 0xb3, 0xb8, 0x00, 0x00, 0x04,
|
||||||
0x00, 0x0f, 0x01, 0x00, 0x8b, 0x58, 0x02, 0xc7, 0x43, 0x10, 0xff, 0xff, 0x00, 0x00, 0xc7, 0x43,
|
0x00, 0xc7, 0x40, 0x10, 0xff, 0xff, 0x00, 0x00, 0xc7, 0x40, 0x14, 0x00, 0x9b, 0xcf, 0x00, 0xc7,
|
||||||
0x14, 0x00, 0x9b, 0xcf, 0x00, 0xc7, 0x43, 0x18, 0xff, 0xff, 0x00, 0x00, 0xc7, 0x43, 0x1c, 0x00,
|
0x40, 0x18, 0xff, 0xff, 0x00, 0x00, 0xc7, 0x40, 0x1c, 0x00, 0x93, 0xcf, 0x00, 0xc6, 0x00, 0x2b,
|
||||||
0x93, 0xcf, 0x00, 0xbe, 0x00, 0x00, 0x09, 0x00, 0xff, 0x25, 0x14, 0x02, 0x09, 0x00, 0xf4, 0xeb,
|
0x89, 0x40, 0x02, 0x0f, 0x01, 0x10, 0xbe, 0x00, 0x00, 0x09, 0x00, 0xff, 0x25, 0x14, 0x02, 0x09,
|
||||||
0xfd
|
0x00, 0xf4, 0xeb, 0xfd
|
||||||
};
|
};
|
||||||
unsigned int trampoline_len = 177;
|
unsigned int trampoline_len = 180;
|
||||||
|
|
Loading…
Reference in New Issue