PageRenderTime 11ms CodeModel.GetById 1ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/arch/cris/arch-v10/boot/compressed/head.S

https://bitbucket.org/evzijst/gittest
Assembly | 111 lines | 61 code | 34 blank | 16 comment | 0 complexity | c48f6cc6ef8413921d2de5a2cd320797 MD5 | raw file
  1/*
  2 *  arch/cris/boot/compressed/head.S
  3 *
  4 *  Copyright (C) 1999, 2001 Axis Communications AB
  5 *
  6 *  Code that sets up the DRAM registers, calls the
  7 *  decompressor to unpack the piggybacked kernel, and jumps.
  8 *
  9 */
 10
 11#include <linux/config.h>
 12#define ASSEMBLER_MACROS_ONLY
 13#include <asm/arch/sv_addr_ag.h>
 14
 15#define RAM_INIT_MAGIC 0x56902387
 16	
 17	;; Exported symbols
 18	
 19	.globl	_input_data
 20
 21	
 22	.text
 23
 24	nop
 25	di
 26
 27;; We need to initialze DRAM registers before we start using the DRAM
 28	
 29	cmp.d	RAM_INIT_MAGIC, r8	; Already initialized?
 30	beq	dram_init_finished
 31	nop
 32	
 33#include "../../lib/dram_init.S"
 34	
 35dram_init_finished:	
 36		
 37	;; Initiate the PA and PB ports
 38
 39	move.b   CONFIG_ETRAX_DEF_R_PORT_PA_DATA, r0
 40	move.b   r0, [R_PORT_PA_DATA]
 41
 42	move.b   CONFIG_ETRAX_DEF_R_PORT_PA_DIR, r0
 43	move.b   r0, [R_PORT_PA_DIR]
 44
 45	move.b   CONFIG_ETRAX_DEF_R_PORT_PB_DATA, r0
 46	move.b   r0, [R_PORT_PB_DATA]
 47
 48	move.b   CONFIG_ETRAX_DEF_R_PORT_PB_DIR, r0
 49	move.b   r0, [R_PORT_PB_DIR]
 50
 51	;; Setup the stack to a suitably high address.
 52	;; We assume 8 MB is the minimum DRAM in an eLinux
 53	;; product and put the sp at the top for now.
 54
 55	move.d	0x40800000, sp
 56
 57	;; Figure out where the compressed piggyback image is
 58	;; in the flash (since we wont try to copy it to DRAM
 59	;; before unpacking). It is at _edata, but in flash.
 60	;; Use (_edata - basse) as offset to the current PC.
 61	
 62basse:	move.d	pc, r5
 63	and.d	0x7fffffff, r5	; strip any non-cache bit
 64	subq	2, r5		; compensate for the move.d pc instr
 65	move.d	r5, r0		; save for later - flash address of 'basse'
 66	add.d	_edata, r5
 67	sub.d	basse, r5	; r5 = flash address of '_edata'
 68	
 69	;; Copy text+data to DRAM
 70	
 71	move.d	basse, r1	; destination
 72	move.d	_edata, r2	; end destination
 731:	move.w	[r0+], r3
 74	move.w	r3, [r1+]
 75	cmp.d	r2, r1
 76	bcs	1b
 77	nop
 78
 79	move.d	r5, [_input_data] ; for the decompressor
 80
 81
 82	;; Clear the decompressors BSS (between _edata and _end)
 83	
 84	moveq	0, r0
 85	move.d	_edata, r1
 86	move.d	_end, r2
 871:	move.w	r0, [r1+]
 88	cmp.d	r2, r1
 89	bcs	1b
 90	nop
 91	
 92	;; Do the decompression and save compressed size in _inptr
 93
 94	jsr	_decompress_kernel
 95	
 96	;; Put start address of root partition in r9 so the kernel can use it
 97	;; when mounting from flash
 98
 99	move.d	[_input_data], r9	; flash address of compressed kernel
100	add.d	[_inptr], r9		; size of compressed kernel
101	 
102	;; Enter the decompressed kernel
103	move.d	RAM_INIT_MAGIC, r8	; Tell kernel that DRAM is initialized
104	jump	0x40004000	; kernel is linked to this address
105	
106	.data
107
108_input_data:
109	.dword	0		; used by the decompressor
110
111#include "../../lib/hw_settings.S"