You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			187 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
			
		
		
	
	
			187 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
| /* Copyright 2013-2014 IBM Corp.
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  * 	http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | |
|  * implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| #define STACK_TOP 0x4000
 | |
| 
 | |
| /* Load an immediate 64-bit value into a register */
 | |
| #define LOAD_IMM64(r, e)			\
 | |
| 	lis     r,(e)@highest;			\
 | |
| 	ori     r,r,(e)@higher;			\
 | |
| 	rldicr  r,r, 32, 31;			\
 | |
| 	oris    r,r, (e)@h;			\
 | |
| 	ori     r,r, (e)@l;
 | |
| 
 | |
| 	.section ".head","ax"
 | |
| 
 | |
| 	/* Microwatt currently enters in LE mode at 0x0 */
 | |
| 	. = 0
 | |
| .global _start
 | |
| _start:
 | |
| 	LOAD_IMM64(%r12, 0x000000000ffffff)
 | |
| 	mtdec	%r12
 | |
| 	LOAD_IMM64(%r12, 0x9000000000008003)
 | |
| 	mtmsrd	%r12	// EE on
 | |
| 	/* setup stack */
 | |
| 	LOAD_IMM64(%r1, STACK_TOP - 0x100)
 | |
| 	LOAD_IMM64(%r12, main)
 | |
| 	mtctr	%r12
 | |
| 	bctrl
 | |
| 	attn // terminate on exit
 | |
| 	b .
 | |
| 
 | |
| #define EXCEPTION(nr)		\
 | |
| 	.= nr			;\
 | |
| 	b	.
 | |
| 
 | |
| 	/* More exception stubs */
 | |
| 	EXCEPTION(0x300)
 | |
| 	EXCEPTION(0x380)
 | |
| 	EXCEPTION(0x400)
 | |
| 	EXCEPTION(0x480)
 | |
| 	. = 0x500
 | |
| 	b	__isr
 | |
| 
 | |
| 	EXCEPTION(0x600)
 | |
| 	EXCEPTION(0x700)
 | |
| 	EXCEPTION(0x800)
 | |
| 	EXCEPTION(0x900)
 | |
| 	EXCEPTION(0x980)
 | |
| 	EXCEPTION(0xa00)
 | |
| 	EXCEPTION(0xb00)
 | |
| 	EXCEPTION(0xc00)
 | |
| 	EXCEPTION(0xd00)
 | |
| 
 | |
| //  ISR data
 | |
| 
 | |
| #define REDZONE_SIZE    (512)
 | |
| #define REG_SAVE_SIZE	((32 + 5)*8)
 | |
| #define STACK_FRAME_C_MINIMAL   64
 | |
| 
 | |
| #define SAVE_NIA	(32*8)
 | |
| #define SAVE_LR		(33*8)
 | |
| #define SAVE_CTR	(34*8)
 | |
| #define SAVE_CR		(35*8)
 | |
| #define SAVE_SRR1	(36*8)
 | |
| 
 | |
| __isr:
 | |
| /*
 | |
|  * Assume where we are coming from has a stack and can save there.
 | |
|  * We save the full register set. Since we are calling out to C, we
 | |
|  * could just save the ABI volatile registers
 | |
|  */
 | |
| 	stdu	%r1,-(REG_SAVE_SIZE+REDZONE_SIZE)(%r1)
 | |
| 	std	%r0,   1*8(%r1)
 | |
| //	std	%r1,   1*8(%r1)
 | |
| 	std	%r2,   2*8(%r1)
 | |
| 	std	%r3,   3*8(%r1)
 | |
| 	std	%r4,   4*8(%r1)
 | |
| 	std	%r5,   5*8(%r1)
 | |
| 	std	%r6,   6*8(%r1)
 | |
| 	std	%r7,   7*8(%r1)
 | |
| 	std	%r8,   8*8(%r1)
 | |
| 	std	%r9,   9*8(%r1)
 | |
| 	std	%r10, 10*8(%r1)
 | |
| 	std	%r11, 11*8(%r1)
 | |
| 	std	%r12, 12*8(%r1)
 | |
| 	std	%r13, 13*8(%r1)
 | |
| 	std	%r14, 14*8(%r1)
 | |
| 	std	%r15, 15*8(%r1)
 | |
| 	std	%r16, 16*8(%r1)
 | |
| 	std	%r17, 17*8(%r1)
 | |
| 	std	%r18, 18*8(%r1)
 | |
| 	std	%r19, 19*8(%r1)
 | |
| 	std	%r20, 20*8(%r1)
 | |
| 	std	%r21, 21*8(%r1)
 | |
| 	std	%r22, 22*8(%r1)
 | |
| 	std	%r23, 23*8(%r1)
 | |
| 	std	%r24, 24*8(%r1)
 | |
| 	std	%r25, 25*8(%r1)
 | |
| 	std	%r26, 26*8(%r1)
 | |
| 	std	%r27, 27*8(%r1)
 | |
| 	std	%r28, 28*8(%r1)
 | |
| 	std	%r29, 29*8(%r1)
 | |
| 	std	%r30, 30*8(%r1)
 | |
| 	std	%r31, 31*8(%r1)
 | |
| 	mfsrr0	%r0
 | |
| 	std	%r0,  SAVE_NIA*8(%r1)
 | |
| 	mflr	%r0
 | |
| 	std	%r0,  SAVE_LR*8(%r1)
 | |
| 	mfctr	%r0
 | |
| 	std	%r0,  SAVE_CTR*8(%r1)
 | |
| 	mfcr	%r0
 | |
| 	std	%r0,  SAVE_CR*8(%r1)
 | |
| 	mfsrr1	%r0
 | |
| 	std	%r0,  SAVE_SRR1*8(%r1)
 | |
| 
 | |
| 	stdu	%r1,-STACK_FRAME_C_MINIMAL(%r1)
 | |
| 	LOAD_IMM64(%r3, isr)
 | |
| 	mtctr	%r3,
 | |
| 	bctrl
 | |
| 	nop
 | |
| 	ld	%r1, 0(%r1)
 | |
| 
 | |
| 	ld	%r0,   1*8(%r1)
 | |
| //	ld	%r1,   1*8(%r1) // do this at rfid
 | |
| 	ld	%r2,   2*8(%r1)
 | |
| //	ld	%r3,   3*8(%r1) // do this at rfid
 | |
| 	ld	%r4,   4*8(%r1)
 | |
| 	ld	%r5,   5*8(%r1)
 | |
| 	ld	%r6,   6*8(%r1)
 | |
| 	ld	%r7,   7*8(%r1)
 | |
| 	ld	%r8,   8*8(%r1)
 | |
| 	ld	%r9,   9*8(%r1)
 | |
| 	ld	%r10, 10*8(%r1)
 | |
| 	ld	%r11, 11*8(%r1)
 | |
| 	ld	%r12, 12*8(%r1)
 | |
| 	ld	%r13, 13*8(%r1)
 | |
| 	ld	%r14, 14*8(%r1)
 | |
| 	ld	%r15, 15*8(%r1)
 | |
| 	ld	%r16, 16*8(%r1)
 | |
| 	ld	%r17, 17*8(%r1)
 | |
| 	ld	%r18, 18*8(%r1)
 | |
| 	ld	%r19, 19*8(%r1)
 | |
| 	ld	%r20, 20*8(%r1)
 | |
| 	ld	%r21, 21*8(%r1)
 | |
| 	ld	%r22, 22*8(%r1)
 | |
| 	ld	%r23, 23*8(%r1)
 | |
| 	ld	%r24, 24*8(%r1)
 | |
| 	ld	%r25, 25*8(%r1)
 | |
| 	ld	%r26, 26*8(%r1)
 | |
| 	ld	%r27, 27*8(%r1)
 | |
| 	ld	%r28, 28*8(%r1)
 | |
| 	ld	%r29, 29*8(%r1)
 | |
| 	ld	%r30, 30*8(%r1)
 | |
| 	ld	%r31, 31*8(%r1)
 | |
| 
 | |
| 	ld	%r3, SAVE_LR*8(%r1)
 | |
| 	mtlr	%r3
 | |
| 	ld	%r3, SAVE_CTR*8(%r1)
 | |
| 	mtctr	%r3
 | |
| 	ld	%r3, SAVE_CR*8(%r1)
 | |
| 	mtcr	%r3
 | |
| 	ld	%r3, SAVE_SRR1*8(%r1)
 | |
| 	mtsrr1	%r3
 | |
| 	ld	%r3, SAVE_NIA*8(%r1)
 | |
| 	mtsrr0	%r3
 | |
| 
 | |
| 	/* restore %r3 */
 | |
| 	ld	%r3, 3*8(%r1)
 | |
| 
 | |
| 	/* do final fixup r1 */
 | |
| 	ld	%r1, 0*8(%r1)
 | |
| 
 | |
| 	rfid
 |