89 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #
 | |
| ! $Source: /cvsroot/tack/Ack/plat/linux386/boot.s,v $
 | |
| ! $State: Exp $
 | |
| ! $Revision: 1.3 $
 | |
| 
 | |
| ! Declare segments (the order is important).
 | |
| 
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| 
 | |
| .sect .text
 | |
| 
 | |
| begtext:
 | |
| 	! This code is the first thing that runs.  The booloader
 | |
| 	! passes the Open Firmware pointer in r5.
 | |
| 	!
 | |
| 	! We keep the bootloader's stack.  The ACK expects:
 | |
| 	!
 | |
| 	! sp+8            environment pointer
 | |
| 	! sp+4            argv as a pointer
 | |
| 	! sp              argc
 | |
| 
 | |
| 	li32 r3, __openfirmware_ptr
 | |
| 	stw r5, 0(r3)
 | |
| 
 | |
| 	li32 r3, envp
 | |
| 	stwu r3, -4(sp)
 | |
| 
 | |
| 	li32 r3, argv
 | |
| 	stwu r3, -4(sp)
 | |
| 
 | |
| 	li32 r3, 1 ! argc
 | |
| 	stwu r3, -4(sp)
 | |
| 	
 | |
| 	bl _openfirmware_init
 | |
| 	bl __m_a_i_n
 | |
| 	! falls through
 | |
| 
 | |
| .define __exit
 | |
| .define EXIT
 | |
| __exit:
 | |
| EXIT:
 | |
| 	! Halt the CPU.  This code halts the default G3 emulation of
 | |
| 	! qemu-system-ppc.  It's wrong for some other CPU models.
 | |
| #define hid0 0x3f0
 | |
| #define mfmsr(r) [[31<<26]|[[r]<<21]|0x0a6]
 | |
| #define mtmsr(r) [[31<<26]|[[r]<<21]|0x124]
 | |
| 	mfspr r3, hid0
 | |
| 	oris r3, r3, 0x00e0		! set DOZE, NAP, SLEEP
 | |
| 	mtspr hid0, r3			!   in hid0
 | |
| 	.data4 mfmsr(3)
 | |
| 	oris r3, r3, 0x0004		! set POW
 | |
| 	.data4 mtmsr(3)			!   in msr
 | |
| 	b EXIT		! If we failed to halt, then spin.
 | |
| 
 | |
| .define _openfirmware_call
 | |
| _openfirmware_call:
 | |
| 	lwz r3, 0(sp)
 | |
| 	li32 r4, __openfirmware_ptr
 | |
| 	lwz r4, 0(r4)
 | |
| 	mtspr ctr, r4
 | |
| 	bcctr 20, 0, 0
 | |
| 
 | |
| ! Define symbols at the beginning of our various segments, so that we can find
 | |
| ! them. (Except .text, which has already been done.)
 | |
| 
 | |
| .sect .rom;        begrom:
 | |
| .sect .data;       begdata:
 | |
| .sect .bss;        begbss:
 | |
| 
 | |
| ! The argv and env arrays.
 | |
| 
 | |
| .sect .rom
 | |
| argv: .data4 exename, 0
 | |
| envp: .data4 0
 | |
| exename: .asciz 'qemuppc.img'
 | |
| 
 | |
| ! Some magic data. All EM systems need these.
 | |
| 
 | |
| .sect .bss
 | |
| .define _errno
 | |
| .comm _errno, 4              ! Posix errno storage
 | |
| 
 | |
| .define .trppc, .ignmask
 | |
| .comm .trppc, 4              ! ptr to user trap handler
 | |
| .comm .ignmask, 4            ! user trap ignore mask 
 | |
| .comm __openfirmware_ptr, 4      ! OpenFirmware entry point
 |