summaryrefslogtreecommitdiff
path: root/util/mkelfImage/linux-ia64/head.S
diff options
context:
space:
mode:
authorStefan Reinauer <stepan@coresystems.de>2008-02-15 18:16:06 +0000
committerStefan Reinauer <stepan@openbios.org>2008-02-15 18:16:06 +0000
commitb34eea348cb7d6d9c93d17d51a1f322114b8f15d (patch)
tree38dd85932dacaa7c7a174d87307baff6210d70c4 /util/mkelfImage/linux-ia64/head.S
parent46fc14dcc8cdba1d66ae6fa9fdcbbf33265d676e (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.S235
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: