* grub-core/boot/i386/pc/startup_raw.S [__APPLE__]: Add Apple assembly
version. * grub-core/commands/i386/pc/drivemap_int13h.S [__APPLE__]: Likewise. * grub-core/kern/i386/pc/startup.S [__APPLE__]: Likewise. * grub-core/lib/i386/relocator16.S [__APPLE__]: Likewise. * grub-core/lib/i386/relocator_common.S [__APPLE__]: Likewise. * grub-core/mmap/i386/pc/mmap_helper.S [__APPLE__]: Likewise.
This commit is contained in:
parent
e6ad0555e4
commit
f7143efe1b
7 changed files with 163 additions and 0 deletions
|
@ -35,10 +35,19 @@
|
|||
VARIABLE(grub_relocator16_start)
|
||||
PREAMBLE
|
||||
|
||||
#ifdef __APPLE__
|
||||
LOCAL(cs_base_bytes12_offset) = LOCAL (cs_base_bytes12) - LOCAL (base)
|
||||
LOCAL(cs_base_byte3_offset) = LOCAL (cs_base_byte3) - LOCAL (base)
|
||||
movl %esi, %eax
|
||||
movw %ax, (LOCAL(cs_base_bytes12_offset)) (RSI, 1)
|
||||
shrl $16, %eax
|
||||
movb %al, (LOCAL (cs_base_byte3_offset)) (RSI, 1)
|
||||
#else
|
||||
movl %esi, %eax
|
||||
movw %ax, (LOCAL (cs_base_bytes12) - LOCAL (base)) (RSI, 1)
|
||||
shrl $16, %eax
|
||||
movb %al, (LOCAL (cs_base_byte3) - LOCAL (base)) (RSI, 1)
|
||||
#endif
|
||||
|
||||
RELOAD_GDT
|
||||
.code32
|
||||
|
@ -75,12 +84,23 @@ VARIABLE(grub_relocator16_start)
|
|||
|
||||
movl %esi, %eax
|
||||
shrl $4, %eax
|
||||
#ifdef __APPLE_
|
||||
LOCAL(segment_offset) = LOCAL (segment) - LOCAL (base)
|
||||
LOCAL(idt_offset) = LOCAL(relocator16_idt) - LOCAL (base)
|
||||
LOCAL(cont2_offset) = LOCAL (cont2) - LOCAL(base)
|
||||
movw %ax, LOCAL(segment_offset) (%esi, 1)
|
||||
lidt LOCAL(idt_offset) (%esi, 1)
|
||||
|
||||
/* jump to a 16 bit segment */
|
||||
ljmp $PSEUDO_REAL_CSEG, $(LOCAL(cont2_offset))
|
||||
#else
|
||||
movw %ax, (LOCAL (segment) - LOCAL (base)) (%esi, 1)
|
||||
|
||||
lidt (EXT_C(grub_relocator16_idt) - LOCAL (base)) (%esi, 1)
|
||||
|
||||
/* jump to a 16 bit segment */
|
||||
ljmp $PSEUDO_REAL_CSEG, $(LOCAL (cont2) - LOCAL(base))
|
||||
#endif
|
||||
LOCAL(cont2):
|
||||
.code16
|
||||
|
||||
|
@ -92,7 +112,12 @@ LOCAL(cont2):
|
|||
/* flush prefetch queue, reload %cs */
|
||||
/* ljmp */
|
||||
.byte 0xea
|
||||
#ifdef __APPLE__
|
||||
LOCAL(cont3_offset) = LOCAL(cont3) - LOCAL(base)
|
||||
.word LOCAL(cont3_offset)
|
||||
#else
|
||||
.word LOCAL(cont3)-LOCAL(base)
|
||||
#endif
|
||||
LOCAL(segment):
|
||||
.word 0
|
||||
|
||||
|
@ -108,7 +133,12 @@ VARIABLE(grub_relocator16_keep_a20_enabled)
|
|||
|
||||
movw %cs, %ax
|
||||
movw %ax, %ss
|
||||
#ifdef __APPLE__
|
||||
LOCAL(relocator16_end_offset) = LOCAL(relocator16_end) - LOCAL(base)
|
||||
leaw LOCAL(relocator16_end_offset), %sp
|
||||
#else
|
||||
leaw LOCAL(relocator16_end) - LOCAL(base), %sp
|
||||
#endif
|
||||
addw $GRUB_RELOCATOR16_STACK_SIZE, %sp
|
||||
|
||||
/* second, try a BIOS call */
|
||||
|
@ -282,6 +312,9 @@ LOCAL(cs_base_byte3):
|
|||
.byte 0, 0x92, 0, 0
|
||||
LOCAL(gdt_end):
|
||||
|
||||
#ifdef __APPLE__
|
||||
LOCAL(relocator16_idt):
|
||||
#endif
|
||||
VARIABLE(grub_relocator16_idt)
|
||||
.word 0
|
||||
.long 0
|
||||
|
|
|
@ -42,12 +42,40 @@ LOCAL(base):
|
|||
/* %rax contains now our new 'base'. */
|
||||
mov RAX, RSI
|
||||
|
||||
#ifdef __APPLE__
|
||||
LOCAL(cont0_offset) = LOCAL(cont0) - LOCAL(base)
|
||||
add $LOCAL(cont0_offset), RAX
|
||||
#else
|
||||
add $(LOCAL(cont0) - LOCAL(base)), RAX
|
||||
#endif
|
||||
jmp *RAX
|
||||
LOCAL(cont0):
|
||||
.endm
|
||||
|
||||
.macro RELOAD_GDT
|
||||
#ifdef __APPLE__
|
||||
LOCAL(cont1_offset) = LOCAL(cont1) - LOCAL(base)
|
||||
LOCAL(jump_vector_offset) = LOCAL(jump_vector) - LOCAL(base)
|
||||
LOCAL(gdt_offset) = LOCAL(gdt) - LOCAL(base)
|
||||
LOCAL(gdt_addr_offset) = LOCAL(gdt_addr) - LOCAL(base)
|
||||
LOCAL(gdtdesc_offset) = LOCAL(gdt_addr) - LOCAL(base)
|
||||
|
||||
lea LOCAL(cont1_offset) (RSI, 1), RAX
|
||||
movl %eax, LOCAL(jump_vector_offset) (RSI, 1)
|
||||
|
||||
lea LOCAL(gdt_offset) (RSI, 1), RAX
|
||||
mov RAX, (LOCAL(gdt_addr_offset)) (RSI, 1)
|
||||
|
||||
/* Switch to compatibility mode. */
|
||||
lgdt (LOCAL(gdtdesc_offset)) (RSI, 1)
|
||||
|
||||
/* Update %cs. */
|
||||
ljmp *(LOCAL(jump_vector_offset)) (RSI, 1)
|
||||
.p2align 4
|
||||
LOCAL(gdtdesc):
|
||||
LOCAL(gdtsize) = LOCAL(gdt_end) - LOCAL(gdt)
|
||||
.word LOCAL(gdtsize)
|
||||
#else
|
||||
lea (LOCAL(cont1) - LOCAL(base)) (RSI, 1), RAX
|
||||
movl %eax, (LOCAL(jump_vector) - LOCAL(base)) (RSI, 1)
|
||||
|
||||
|
@ -63,6 +91,7 @@ LOCAL(cont0):
|
|||
.p2align 4
|
||||
LOCAL(gdtdesc):
|
||||
.word LOCAL(gdt_end) - LOCAL(gdt)
|
||||
#endif
|
||||
LOCAL(gdt_addr):
|
||||
#ifdef __x86_64__
|
||||
/* Filled by the code. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue