* 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:
Vladimir Serbinenko 2013-11-13 01:04:56 +01:00
parent 16057d6bbb
commit 286551b4eb
5 changed files with 34 additions and 18 deletions

View file

@ -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.

View file

@ -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

View file

@ -58,4 +58,4 @@ FUNCTION(raise)
mov r0, #0 mov r0, #0
bx lr bx lr
.end END

View file

@ -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

View file

@ -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):