Handle unaligned .bss on sparc64.
Current code improperly assumes that both __bss_start and _end are aligned to 8-bytes. Eliminating this assumption and explicitly align modules.
This commit is contained in:
		
							parent
							
								
									4a73746a04
								
							
						
					
					
						commit
						e5ed2f6947
					
				
					 5 changed files with 49 additions and 10 deletions
				
			
		|  | @ -36,10 +36,14 @@ codestart: | |||
| 	/* Copy the modules past the end of the kernel image. | ||||
| 	 * They are currently sitting in the BSS. | ||||
| 	 */ | ||||
| 	sethi	%hi(__bss_start), %o2 | ||||
| 	or	%o2, %lo(__bss_start), %o2 | ||||
| 	sethi	%hi(_end), %o3 | ||||
| 	or	%o3, %lo(_end), %o3 | ||||
| 	sethi	%hi(__bss_start + GRUB_KERNEL_SPARC64_IEEE1275_MOD_ALIGN - 1), %o2 | ||||
| 	or	%o2, %lo(__bss_start + GRUB_KERNEL_SPARC64_IEEE1275_MOD_ALIGN - 1), %o2 | ||||
| 	srl	%o2, GRUB_KERNEL_SPARC64_IEEE1275_LOG_MOD_ALIGN, %o2 | ||||
| 	sll	%o2, GRUB_KERNEL_SPARC64_IEEE1275_LOG_MOD_ALIGN, %o2 | ||||
| 	sethi	%hi(_end + GRUB_KERNEL_SPARC64_IEEE1275_MOD_ALIGN - 1), %o3 | ||||
| 	or	%o3, %lo(_end + GRUB_KERNEL_SPARC64_IEEE1275_MOD_ALIGN - 1), %o3 | ||||
| 	srl	%o3, GRUB_KERNEL_SPARC64_IEEE1275_LOG_MOD_ALIGN, %o3 | ||||
| 	sll	%o3, GRUB_KERNEL_SPARC64_IEEE1275_LOG_MOD_ALIGN, %o3 | ||||
| 	sethi	%hi(grub_total_module_size), %o4 | ||||
| 	lduw	[%o4 + %lo(grub_total_module_size)], %o4 | ||||
| 
 | ||||
|  | @ -67,16 +71,34 @@ codestart: | |||
| 	/* Now it's safe to clear out the BSS.  */ | ||||
| 	sethi	%hi(__bss_start), %o2 | ||||
| 	or	%o2, %lo(__bss_start), %o2 | ||||
| 	sethi	%hi(_end), %o3 | ||||
| 	or	%o3, %lo(_end), %o3 | ||||
| 1:	stb	%g0, [%o2] | ||||
| 	add	%o2, 1, %o2 | ||||
| 	and	%o2, 7, %o3 | ||||
| 	brnz	%o3, 1b | ||||
| 	 nop | ||||
| 
 | ||||
| 	sethi	%hi(_end - 1), %o3 | ||||
| 	or	%o3, %lo(_end - 1), %o3 | ||||
| 	srl	%o3, 3, %o3 | ||||
| 	sll	%o3, 3, %o3 | ||||
| 1:	stx	%g0, [%o2] | ||||
| 	add	%o2, 8, %o2 | ||||
| 	cmp	%o2, %o3 | ||||
| 	blt,pt	%xcc, 1b | ||||
| 	 nop | ||||
| 
 | ||||
| 	sethi	%hi(_end), %o3 | ||||
| 	or	%o3, %lo(_end), %o3 | ||||
| 1:	stb	%g0, [%o2] | ||||
| 	add	%o2, 1, %o2 | ||||
| 	cmp	%o2, %o3 | ||||
| 	blt,pt	%xcc, 1b | ||||
| 	 nop | ||||
| 
 | ||||
| 	sethi	%hi(grub_ieee1275_original_stack), %o2 | ||||
| 	stx	%o1, [%o2 + %lo(grub_ieee1275_original_stack)] | ||||
| 	sethi	%hi(grub_ieee1275_entry_fn), %o2 | ||||
| 	call	grub_main | ||||
| 	 stx	%o0, [%o2 + %lo(grub_ieee1275_entry_fn)] | ||||
| 1:	ba,a	1b | ||||
| 	 nop | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue