--HG-- branch : dtrg-videocore rename : mach/i80/.distr => mach/vc4/.distr rename : plat/cpm/.distr => plat/rpi/.distr
		
			
				
	
	
		
			120 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #
 | |
| /*
 | |
|  * Raspberry Pi support library for the ACK
 | |
|  * © 2013 David Given
 | |
|  * This file is redistributable under the terms of the 3-clause BSD license.
 | |
|  * See the file 'Copying' in the root of the distribution for the full text.
 | |
|  */
 | |
| 
 | |
| ! Declare segments (the order is important).
 | |
| 
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| 
 | |
| .sect .text
 | |
| 
 | |
| #define gp r15
 | |
| #define STACKSIZE 1*1024
 | |
| 
 | |
| ! MAIN ENTRY POINT
 | |
| 
 | |
| begtext:
 | |
| 	! This empty space is required by the boot loader.
 | |
| 
 | |
| kernel_start:
 | |
| 	! When running as a kernel, we need to preserve all registers. We save
 | |
| 	! them onto the default stack.
 | |
| 	push r0-r24
 | |
| 	b baremetal_start
 | |
| 	.space 506 ! first 512 bytes are ignored by the boot loader
 | |
| baremetal_start:
 | |
| 	! Wipe the bss (including the new stack).
 | |
| 
 | |
| 	lea r6, begbss
 | |
| 	lea r7, endbss
 | |
| 	mov r8, #0
 | |
| _1:
 | |
| 	stb r8, (r6)
 | |
| 	addcmpb.lt r6, #1, r7, _1
 | |
| 
 | |
| 	! Save system registers.
 | |
| 
 | |
| 	st fp, .returnfp
 | |
| 	st sp, .returnsp
 | |
| 	st lr, .returnlr
 | |
| 
 | |
| 	lea gp, begtext
 | |
| 	lea sp, .stack + STACKSIZE
 | |
| 
 | |
| 	! Save the kernel parameters.
 | |
| 
 | |
| 	sub r0, gp ! fix up pointer
 | |
| 	sub r1, gp ! fix up pointer
 | |
| 	sub r2, gp ! fix up pointer
 | |
| 	sub r3, gp ! fix up pointer
 | |
| 	push r0-r5
 | |
| 	sub r0, sp, gp
 | |
| 	st r0, _pi_kernel_parameters
 | |
| 
 | |
| 	! Push standard parameters onto the stack and go.
 | |
| 	
 | |
| 	mov r0, #0
 | |
| 	push r0                 ! envp
 | |
| 	push r0                 ! argv
 | |
| 	push r0                 ! argc
 | |
| 
 | |
| 	! Call the language startup code.
 | |
| 
 | |
| 	bl __m_a_i_n
 | |
| 
 | |
| 	! Fall through to __exit if this returns.
 | |
| 
 | |
| .define __exit
 | |
| __exit:
 | |
| 	! It only makes sense to get here if we're in kernel mode. If we're in
 | |
| 	! bare-metal mode, we'll just crash, but that's fine.
 | |
| 
 | |
| 	st r0, _pi_kernel_parameters ! save return value
 | |
| 	mov r0, sr
 | |
| 	ld fp, .returnfp
 | |
| 	ld sp, .returnsp
 | |
| 	ld lr, .returnlr
 | |
| 	pop r0-r24
 | |
| 	ld r0, _pi_kernel_parameters ! restore return value
 | |
| 	b lr
 | |
| 
 | |
| ! Define symbols at the beginning of our various segments, so that we can find
 | |
| ! them. (Except .text, which has already been done.)
 | |
| 
 | |
| .define begtext, begdata, begbss
 | |
| .sect .data;       begdata:
 | |
| .sect .rom;        begrom:
 | |
| .sect .bss;        begbss:
 | |
| 
 | |
| ! Some magic data. All EM systems need these.
 | |
| 
 | |
| .define .trppc, .ignmask, _errno
 | |
| .comm .trppc, 4
 | |
| .comm .ignmask, 4
 | |
| .comm _errno, 4
 | |
| 
 | |
| ! We store the stack pointer and return address on entry so that we can
 | |
| ! cleanly exit.
 | |
| 
 | |
| .comm .returnfp, 4
 | |
| .comm .returnsp, 4
 | |
| .comm .returnlr, 4
 | |
| 
 | |
| .define _pi_kernel_parameters
 | |
| .comm _pi_kernel_parameters, 4
 | |
| 
 | |
| .define .linenumber, .filename
 | |
| .comm .linenumber, 4         ! current linenumber (used for debugging)
 | |
| .comm .filename, 4           ! ptr to current filename (used for debugging)
 | |
| 
 | |
| ! User stack.
 | |
| 
 | |
| .comm .stack, STACKSIZE
 | |
| 
 |