* include/grub/symbol.h (ADDR): New macro. Replace all occurences of
=x with ADDR(x) in arm assembly. (END): New macro. Replace all .end with END.
This commit is contained in:
parent
16057d6bbb
commit
286551b4eb
5 changed files with 34 additions and 18 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* include/grub/symbol.h (ADDR): New macro. Replace all occurences of
|
||||||
|
=x with ADDR(x) in arm assembly.
|
||||||
|
(END): New macro. Replace all .end with END.
|
||||||
|
|
||||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
Redirect all divisions to grub_divmod64.
|
Redirect all divisions to grub_divmod64.
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
@ r1 - *end (exclusive)
|
@ r1 - *end (exclusive)
|
||||||
clean_dcache_range:
|
clean_dcache_range:
|
||||||
@ Clean data cache for range to point-of-unification
|
@ Clean data cache for range to point-of-unification
|
||||||
ldr r2, =EXT_C(grub_arch_cache_dlinesz)
|
ldr r2, ADDR(EXT_C(grub_arch_cache_dlinesz))
|
||||||
ldr r2, [r2]
|
ldr r2, [r2]
|
||||||
sub r3, r2, #1 @ align "beg" to start of line
|
sub r3, r2, #1 @ align "beg" to start of line
|
||||||
mvn r3, r3
|
mvn r3, r3
|
||||||
|
@ -57,7 +57,7 @@ clean_dcache_range:
|
||||||
@ r1 - *end (exclusive)
|
@ r1 - *end (exclusive)
|
||||||
invalidate_icache_range:
|
invalidate_icache_range:
|
||||||
@ Invalidate instruction cache for range to point-of-unification
|
@ Invalidate instruction cache for range to point-of-unification
|
||||||
ldr r2, =EXT_C(grub_arch_cache_ilinesz)
|
ldr r2, ADDR(EXT_C(grub_arch_cache_ilinesz))
|
||||||
ldr r2, [r2]
|
ldr r2, [r2]
|
||||||
sub r3, r2, #1 @ align "beg" to start of line
|
sub r3, r2, #1 @ align "beg" to start of line
|
||||||
mvn r3, r3
|
mvn r3, r3
|
||||||
|
|
|
@ -58,4 +58,4 @@ FUNCTION(raise)
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
.end
|
END
|
||||||
|
|
|
@ -60,22 +60,22 @@ FUNCTION(codestart)
|
||||||
@ U-Boot API signature is stored on the U-Boot heap
|
@ U-Boot API signature is stored on the U-Boot heap
|
||||||
@ Stack pointer used as start address for signature probing
|
@ Stack pointer used as start address for signature probing
|
||||||
mov r12, sp
|
mov r12, sp
|
||||||
ldr sp, =entry_state
|
ldr sp, ADDR(entry_state)
|
||||||
push {r4-r12,lr} @ store U-Boot context (sp in r12)
|
push {r4-r12,lr} @ store U-Boot context (sp in r12)
|
||||||
|
|
||||||
ldr r12, =EXT_C(grub_uboot_machine_type)
|
ldr r12, ADDR(EXT_C(grub_uboot_machine_type))
|
||||||
str r1, [r12]
|
str r1, [r12]
|
||||||
ldr r12, =EXT_C(grub_uboot_boot_data)
|
ldr r12, ADDR(EXT_C(grub_uboot_boot_data))
|
||||||
str r2, [r12]
|
str r2, [r12]
|
||||||
|
|
||||||
@ Modules have been stored as a blob in BSS,
|
@ Modules have been stored as a blob in BSS,
|
||||||
@ they need to be manually relocated to _end
|
@ they need to be manually relocated to _end
|
||||||
ldr r0, =EXT_C(__bss_start) @ src
|
ldr r0, ADDR(EXT_C(__bss_start)) @ src
|
||||||
add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
|
add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
|
||||||
mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
|
mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
|
||||||
and r0, r0, r1
|
and r0, r0, r1
|
||||||
|
|
||||||
ldr r1, =EXT_C(_end) @ dst = End of BSS
|
ldr r1, ADDR(EXT_C(_end)) @ dst = End of BSS
|
||||||
ldr r2, grub_total_module_size @ blob size
|
ldr r2, grub_total_module_size @ blob size
|
||||||
|
|
||||||
add r1, r1, #GRUB_KERNEL_MACHINE_STACK_SIZE
|
add r1, r1, #GRUB_KERNEL_MACHINE_STACK_SIZE
|
||||||
|
@ -83,7 +83,7 @@ FUNCTION(codestart)
|
||||||
sub sp, r1, #8
|
sub sp, r1, #8
|
||||||
add r1, r1, #1024
|
add r1, r1, #1024
|
||||||
|
|
||||||
ldr r12, =EXT_C(grub_modbase)
|
ldr r12, ADDR(EXT_C(grub_modbase))
|
||||||
str r1, [r12]
|
str r1, [r12]
|
||||||
|
|
||||||
add r1, r1, r2
|
add r1, r1, r2
|
||||||
|
@ -98,14 +98,14 @@ FUNCTION(codestart)
|
||||||
|
|
||||||
@ Since we _are_ the C run-time, we need to manually zero the BSS
|
@ Since we _are_ the C run-time, we need to manually zero the BSS
|
||||||
@ region before continuing
|
@ region before continuing
|
||||||
ldr r0, =EXT_C(__bss_start) @ zero from here
|
ldr r0, ADDR(EXT_C(__bss_start)) @ zero from here
|
||||||
@ If unaligned, bytewise zero until base address aligned.
|
@ If unaligned, bytewise zero until base address aligned.
|
||||||
mov r2, #0
|
mov r2, #0
|
||||||
1: tst r0, #3
|
1: tst r0, #3
|
||||||
beq 2f
|
beq 2f
|
||||||
strb r2, [r0], #1
|
strb r2, [r0], #1
|
||||||
b 1b
|
b 1b
|
||||||
2: ldr r1, =EXT_C(_end) @ to here
|
2: ldr r1, ADDR(EXT_C(_end)) @ to here
|
||||||
1: str r2, [r0], #4
|
1: str r2, [r0], #4
|
||||||
cmp r0, r1
|
cmp r0, r1
|
||||||
bne 1b
|
bne 1b
|
||||||
|
@ -120,21 +120,21 @@ FUNCTION(codestart)
|
||||||
* U-Boot (Global Data Pointer) and preserve it for Grub.
|
* U-Boot (Global Data Pointer) and preserve it for Grub.
|
||||||
*/
|
*/
|
||||||
FUNCTION(grub_uboot_syscall)
|
FUNCTION(grub_uboot_syscall)
|
||||||
ldr ip, =transition_space
|
ldr ip, ADDR(transition_space)
|
||||||
stm ip, {r8, lr}
|
stm ip, {r8, lr}
|
||||||
ldr ip, =gd_backup
|
ldr ip, ADDR(gd_backup)
|
||||||
ldr r8, [ip]
|
ldr r8, [ip]
|
||||||
ldr ip, =grub_uboot_syscall_ptr
|
ldr ip, ADDR(grub_uboot_syscall_ptr)
|
||||||
mov lr, pc
|
mov lr, pc
|
||||||
ldr pc, [ip]
|
ldr pc, [ip]
|
||||||
ldr ip, =gd_backup
|
ldr ip, ADDR(gd_backup)
|
||||||
str r8, [ip]
|
str r8, [ip]
|
||||||
ldr ip, =transition_space
|
ldr ip, ADDR(transition_space)
|
||||||
ldm ip, {r8, lr}
|
ldm ip, {r8, lr}
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
FUNCTION(grub_uboot_return)
|
FUNCTION(grub_uboot_return)
|
||||||
ldr sp, =entry_state_end
|
ldr sp, ADDR(entry_state_end)
|
||||||
pop {r4-r12, lr}
|
pop {r4-r12, lr}
|
||||||
mov sp, r12
|
mov sp, r12
|
||||||
bx lr
|
bx lr
|
||||||
|
@ -166,4 +166,4 @@ transition_space:
|
||||||
VARIABLE(grub_uboot_syscall_ptr)
|
VARIABLE(grub_uboot_syscall_ptr)
|
||||||
.long 0 @
|
.long 0 @
|
||||||
|
|
||||||
.end
|
END
|
||||||
|
|
|
@ -37,6 +37,16 @@
|
||||||
# define EXT_C(sym) sym
|
# define EXT_C(sym) sym
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __arm__
|
||||||
|
#ifdef __clang__
|
||||||
|
#define ADDR(x) x
|
||||||
|
#define END
|
||||||
|
#else
|
||||||
|
#define ADDR(x) =x
|
||||||
|
#define END .end
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined (__APPLE__)
|
#if defined (__APPLE__)
|
||||||
#define FUNCTION(x) .globl EXT_C(x) ; EXT_C(x):
|
#define FUNCTION(x) .globl EXT_C(x) ; EXT_C(x):
|
||||||
#define VARIABLE(x) .globl EXT_C(x) ; EXT_C(x):
|
#define VARIABLE(x) .globl EXT_C(x) ; EXT_C(x):
|
||||||
|
|
Loading…
Reference in a new issue