diff options
author | Stefan Reinauer <stepan@coresystems.de> | 2008-02-15 18:16:06 +0000 |
---|---|---|
committer | Stefan Reinauer <stepan@openbios.org> | 2008-02-15 18:16:06 +0000 |
commit | b34eea348cb7d6d9c93d17d51a1f322114b8f15d (patch) | |
tree | 38dd85932dacaa7c7a174d87307baff6210d70c4 /util/mkelfImage/linux-ia64/head.S | |
parent | 46fc14dcc8cdba1d66ae6fa9fdcbbf33265d676e (diff) |
Importing mkelfimage from
ftp://ftp.lnxi.com/pub/mkelfImage/mkelfImage-2.7.tar.gz
Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Stefan Reinauer <stepan@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3103 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'util/mkelfImage/linux-ia64/head.S')
-rw-r--r-- | util/mkelfImage/linux-ia64/head.S | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/util/mkelfImage/linux-ia64/head.S b/util/mkelfImage/linux-ia64/head.S new file mode 100644 index 0000000000..4a12fb5566 --- /dev/null +++ b/util/mkelfImage/linux-ia64/head.S @@ -0,0 +1,235 @@ +#define ASSEMBLY 1 + + .text + +#include "convert.h" + + .globl _start + .proc _start +_start: + alloc loc0=ar.pfs,1,2,3,0 /* in, local, out, rotating */ + mov loc1=rp + mov r14=ip /* Get the address of _start, I'm in the first bundle */ + movl r15=@gprel(_start) + ;; + sub gp=r14,r15 /* gp = _start - @gprel(_start), current value of gp */ + ;; + mov out0=in0 + mov out1=r28 + add out2=@gprel(params),gp + br.call.sptk.few rp=convert_params + + + mov r28=r8 + add r15=@gprel(entry), gp + ;; + ld8 r16=[r15] + ;; + mov b1=r16 + mov ar.pfs=loc0 + mov rp=loc1 + ;; + br.cond.sptk.few b1 + + .size _start, . - _start + .endp _start + + +#if 0 + +/* Base Address */ +#define UART_BASE 0x00000000f8030000 +#define UART_BAUD 9600 + +/* Data */ +#define UART_RBR 0x00 +#define UART_TBR 0x00 +/* Control */ +#define UART_IER 0x01 +#define UART_IIR 0x02 +#define UART_FCR 0x02 +#define UART_LCR 0x03 +#define UART_MCR 0x04 + +#define UART_DLL 0x00 +#define UART_DLM 0x01 +/* Status */ +#define UART_LSR 0x05 +#define UART_MSR 0x06 +#define UART_SCR 0x07 + +#define UART_PHYS_BASE (0x8000000000000000|UART_BASE) +#define UART_DIV (115200/UART_BAUD) +#define UART_DIV_LO (UART_DIV&0xFF) +#define UART_DIV_HI ((UART_DIV >> 8)&0xFF) + +#if ((115200%UART_BAUD) != 0) +#error Bad uart baud rate +#endif + +/* NOTE: As these are debugging functions, they do not consume any + * space on the register stack, and instead rely entirely on + * scratch registers for the registers they use. + */ +uart_init: + /* set the UART_BASE */ + movl r31=UART_PHYS_BASE + ;; + + /* disable interrupts */ + add r30=UART_IER,r31 + mov r29=0x00 + ;; + st1 [r30]=r29 + + /* enable fifos */ + add r30=UART_FCR,r31 + mov r29=0x01 + ;; + st1 [r30]=r29 + + /* Set Baud Rate Divisor to UART_BAUD */ + add r30=UART_LCR,r31 + mov r29=0x83 + ;; + st1 [r30]=r29 + + add r30=UART_DLL,r31 + mov r29=UART_DIV_LO + ;; + st1 [r30]=r29 + + add r30=UART_DLM,r31 + mov r29=UART_DIV_HI + ;; + st1 [r30]=r29 + + add r30=UART_LCR,r31 + mov r29=0x03 + ;; + st1 [r30]=r29 + + br.ret.sptk.few rp + + .proc uart_tx_byte + .globl uart_tx_byte +uart_tx_byte: + /* set the UART_PHYS_BASE */ + movl r31=UART_PHYS_BASE + ;; +__uart_tx_byte: + /* Wait until the UART can hold another byte */ + add r30=UART_LSR,r31 + ;; +9: ld1.acq.nta r29=[r30] + ;; + and r29=0x20,r29 + ;; + cmp.eq p63,p0=0,r29 +(p63) br.cond.sptk.few 9b + + /* Transmit the byte */ + add r30=UART_TBR,r31 + ;; + st1.rel.nta [r30]=r32 + ;; + + /* Wait until the UART is empty to be certain the byte is flushed */ + add r30=UART_LSR,r31 + ;; +9: ld1.acq.nta r29=[r30] + ;; + and r29=0x40,r29 + ;; + cmp.eq p63,p0=0,r29 +(p63) br.cond.sptk.few 9b + ;; + br.ret.sptk.few rp + .endp uart_tx_byte + +__uart_tx_hex_char: + cmp.ltu p62,p63=9,r32 + ;; +(p63) add r32=48,r32 /* digits*/ +(p62) add r32=55,r32 /* letters */ + br.cond.sptk.few __uart_tx_byte + +uart_tx_hex64: + /* set the UART_bASE */ + movl r31=UART_PHYS_BASE + /* skip r28 */ + mov r27=rp + mov r26=ar.pfs + mov r25=r32 + ;; + extr.u r32=r25,60,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,56,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,52,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,48,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,44,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,40,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,36,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,32,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,28,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,24,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,20,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,16,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,12,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,8,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,4,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + extr.u r32=r25,0,4 + br.call.sptk.few rp=__uart_tx_hex_char + ;; + mov ar.pfs = r26 + mov rp = r27 + ;; + br.ret.sptk.few rp +#endif + + .section ".trailer", "a" + /* Constants set at build time, these are at the very end of my image */ + .balign 16 + .global params +params: +convert_magic: + .quad CONVERT_MAGIC +entry: + .quad 0 +initrd_start: + .quad 0 +initrd_size: + .quad 0 +cmdline: + .asciz "BOOT_IMAGE=head.S console=ttyS0 ip=dhcp root=/dev/nfs" + .org cmdline + 1024, 0 +cmdline_end: |