patch-2.4.4 linux/arch/cris/boot/rescue/kimagerescue.S

Next file: linux/arch/cris/boot/rescue/rescue.ld
Previous file: linux/arch/cris/boot/rescue/head.S
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.3/linux/arch/cris/boot/rescue/kimagerescue.S linux/arch/cris/boot/rescue/kimagerescue.S
@@ -0,0 +1,143 @@
+	;; $Id: kimagerescue.S,v 1.2 2001/02/14 16:57:25 larsv Exp $
+	;; 
+	;; Rescue code to be prepended on a kimage and copied to the
+	;; rescue serial port.
+	;; This is called from the rescue code, it will copy received data to
+	;; 4000500 and after a timeout jump to it.
+	
+#include <linux/config.h>
+#define ASSEMBLER_MACROS_ONLY
+#include <asm/sv_addr_ag.h>
+
+#define CODE_START 0x40000500
+#define CODE_LENGTH 784
+#define TIMEOUT_VALUE 1000
+	
+		
+#ifdef CONFIG_RESCUE_SER0
+#define SERXOFF R_SERIAL0_XOFF
+#define SERBAUD R_SERIAL0_BAUD
+#define SERRECC R_SERIAL0_REC_CTRL
+#define SERRDAT R_SERIAL0_REC_DATA
+#define SERSTAT R_SERIAL0_STATUS
+#endif
+#ifdef CONFIG_RESCUE_SER1
+#define SERXOFF R_SERIAL1_XOFF
+#define SERBAUD R_SERIAL1_BAUD
+#define SERRECC R_SERIAL1_REC_CTRL
+#define SERRDAT R_SERIAL1_REC_DATA
+#define SERSTAT R_SERIAL1_STATUS
+#endif
+#ifdef CONFIG_RESCUE_SER2
+#define SERXOFF R_SERIAL2_XOFF
+#define SERBAUD R_SERIAL2_BAUD
+#define SERRECC R_SERIAL2_REC_CTRL
+#define SERRDAT R_SERIAL2_REC_DATA
+#define SERSTAT R_SERIAL2_STATUS
+#endif	
+#ifdef CONFIG_RESCUE_SER3
+#define SERXOFF R_SERIAL3_XOFF
+#define SERBAUD R_SERIAL3_BAUD
+#define SERRECC R_SERIAL3_REC_CTRL
+#define SERRDAT R_SERIAL3_REC_DATA
+#define SERSTAT R_SERIAL3_STATUS
+#endif
+
+	.text
+	;; This is the entry point of the rescue code
+	;; 0x80000000 if loaded in flash (as it should be)
+	;; since etrax actually starts at address 2 when booting from flash, we
+	;; put a nop (2 bytes) here first so we dont accidentally skip the di
+	
+	nop	
+	di
+#ifndef CONFIG_SVINTO_SIM	
+	;; setup port PA and PB default initial directions and data
+	;; (so we can flash LEDs, and so that DTR and others are set)
+	
+	move.b	DEF_R_PORT_PA_DIR, r0
+	move.b	r0, [R_PORT_PA_DIR]
+	move.b	DEF_R_PORT_PA_DATA, r0
+	move.b	r0, [R_PORT_PA_DATA]
+	
+	move.b	DEF_R_PORT_PB_DIR, r0
+	move.b	r0, [R_PORT_PB_DIR]
+	move.b	DEF_R_PORT_PB_DATA, r0
+	move.b	r0, [R_PORT_PB_DATA]
+	
+	;; We need to setup the bus registers before we start using the DRAM
+#include "../../lib/dram_init.S"
+	
+#endif
+	;; Setup the stack to a suitably high address.
+	;; We assume 8 MB is the minimum DRAM in an eLinux
+	;; product and put the sp at the top for now.
+
+	move.d	0x40800000, sp
+	
+	;; setup the serial port at 115200 baud
+	
+	moveq	0, r0
+	move.d	r0, [SERXOFF] 
+
+	move.b	0x99, r0
+	move.b	r0, [SERBAUD]		; 115.2kbaud for both transmit and receive
+
+	move.b	0x40, r0		; rec enable
+	move.b	r0, [SERRECC] 
+
+
+	moveq	0, r1		; "timer" to clock out a LED red flash
+	move.d	CODE_START, r3	; destination counter
+	move.d	CODE_LENGTH, r4	; length
+	move.d	TIMEOUT_VALUE, r5	; "timeout" until jump
+
+wait_ser:
+	addq	1, r1
+	subq	1, r5		; decrease timeout
+	beq	jump_start	; timed out
+	nop
+#ifndef CONFIG_ETRAX_NO_LEDS
+#ifdef CONFIG_ETRAX_PA_LEDS
+	move.b	DEF_R_PORT_PA_DATA, r2
+#endif
+#ifdef CONFIG_ETRAX_PB_LEDS
+	move.b	DEF_R_PORT_PB_DATA, r2
+#endif
+	move.d	(1 << CONFIG_ETRAX_LED1R) | (1 << CONFIG_ETRAX_LED2R), r0
+	btstq	16, r1
+	bpl	1f
+	nop
+	or.d	r0, r2		; set bit
+	ba	2f
+	nop
+1:	not	r0		; clear bit
+	and.d	r0, r2
+2:	
+#ifdef CONFIG_ETRAX_PA_LEDS
+	move.b	r2, [R_PORT_PA_DATA]
+#endif	
+#ifdef CONFIG_ETRAX_PB_LEDS
+	move.b	r2, [R_PORT_PB_DATA]
+#endif
+#endif
+		
+	;; check if we got something on the serial port
+	
+	move.b	[SERSTAT], r0
+	btstq	0, r0		; data_avail
+	bpl	wait_ser
+	nop
+
+	;; got something - copy the byte and loop
+
+	move.b	[SERRDAT], r0
+	move.b	r0, [r3+]
+	move.d	TIMEOUT_VALUE, r5	; reset "timeout"
+	subq	1, r4		; decrease length
+	bne	wait_ser
+	nop
+jump_start:
+	;; jump into downloaded code
+
+	jump	CODE_START

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)