1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# linux_logo in ARM assembly language 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# based on the code from ll_asm-0.41 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# By Vince Weaver <vince _at_ deater.net> 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Modified to remove non-deterministic system calls 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# And to avoid reading from /proc 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.include "../logo.include" 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# offsets into the results returned by the uname syscall 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_SYSNAME,0 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_NODENAME,65 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_RELEASE,65*2 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_VERSION,(65*3) 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_MACHINE,(65*4) 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ U_DOMAINNAME,65*5 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# offset into the results returned by the sysinfo syscall 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ S_TOTALRAM,16 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Sycscalls 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ SYSCALL_EXIT, 1 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ SYSCALL_WRITE, 4 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ STDIN,0 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ STDOUT,1 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.equ STDERR,2 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown .globl _start 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown_start: 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r11,data_addr 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r12,bss_addr 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #========================= 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # PRINT LOGO 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #========================= 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# LZSS decompression algorithm implementation 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# by Stephan Walter 2002, based on LZSS.C by Haruhiko Okumura 1989 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# optimized some more by Vince Weaver 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r1,out_addr @ buffer we are printing to 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r2,#(N-F) @ R 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r3,r11,#(logo-data_begin) 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r3 points to logo data 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r8,logo_end_addr 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r8 points to logo end 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r9,text_addr @ r9 points to text buf 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndecompression_loop: 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r4,[r3],#+1 @ load a byte, increment pointer 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r5,#0xff @ load top as a hackish 8-bit counter 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown orr r5,r4,r5,LSL #8 @ shift 0xff left by 8 and or in the byte we loaded 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntest_flags: 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp r3,r8 @ have we reached the end? 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bge done_logo @ if so, exit 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lsrs r5,#1 @ shift bottom bit into carry flag 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bcs discrete_char @ if set, we jump to discrete char 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownoffset_length: 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r0,[r3],#+1 @ load a byte, increment pointer 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r4,[r3],#+1 @ load a byte, increment pointer 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ we can't load halfword as no unaligned loads on arm 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown orr r4,r0,r4,LSL #8 @ merge back into 16 bits 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ this has match_length and match_position 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r7,r4 @ copy r4 to r7 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ no need to mask r7, as we do it 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ by default in output_loop 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#(THRESHOLD+1) 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r6,r0,r4,LSR #(P_BITS) 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r6 = (r4 >> P_BITS) + THRESHOLD + 1 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ (=match_length) 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownoutput_loop: 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r0,pos_mask @ urgh, can't handle simple constants 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and r7,r7,r0 @ mask it 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r4,[r9,r7] @ load byte from text_buf[] 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r7,r7,#1 @ advance pointer in text_buf 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstore_byte: 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown strb r4,[r1],#+1 @ store a byte, increment pointer 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown strb r4,[r9,r2] @ store a byte to text_buf[r] 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r2,r2,#1 @ r++ 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#(N) 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sub r0,r0,#1 @ grrr no way to get this easier 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and r2,r2,r0 @ mask r 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown subs r6,r6,#1 @ decement count 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bne output_loop @ repeat until k>j 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tst r5,#0xff00 @ are the top bits 0? 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bne test_flags @ if not, re-load flags 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown b decompression_loop 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndiscrete_char: 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r4,[r3],#+1 @ load a byte, increment pointer 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r6,#1 @ we set r6 to one so byte 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ will be output once 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown b store_byte @ and store it 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# end of LZSS code 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndone_logo: 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r1,out_addr @ buffer we are printing to 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl write_stdout @ print the logo 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #========================== 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # PRINT VERSION 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #========================== 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfirst_line: 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#0 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(uname_info-data_begin) 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ os-name from uname "Linux" 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r10,out_addr @ point r10 to out_buffer 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat @ call strcat 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(ver_string-data_begin) @ source is " Version " 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat @ call strcat 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#((uname_info-data_begin)+U_RELEASE) 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ version from uname, ie "2.6.20" 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat @ call strcat 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(compiled_string-data_begin) 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ source is ", Compiled " 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat @ call strcat 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#((uname_info-data_begin)+U_VERSION) 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ compiled date 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat @ call strcat 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r3,#0xa 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown strb r3,[r10],#+1 @ store a linefeed, increment pointer 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown strb r0,[r10],#+1 @ NUL terminate, increment pointer 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl center_and_print @ center and print 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @=============================== 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ Middle-Line 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @=============================== 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmiddle_line: 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @========= 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ Load /proc/cpuinfo into buffer 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @========= 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r10,out_addr @ point r10 to out_buffer 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @============= 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ Number of CPUs 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @============= 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownnumber_of_cpus: 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(one-data_begin) 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # cheat. Who has an SMP arm? 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @========= 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ MHz 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @========= 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprint_mhz: 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ the arm system I have does not report MHz 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @========= 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ Chip Name 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @========= 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownchip_name: 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#'s' 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r1,#'o' 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r2,#'r' 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r3,#' ' 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl find_string 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ find 'sor\t: ' and grab up to ' ' 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(processor-data_begin) 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ print " Processor, " 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @======== 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ RAM 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @======== 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r3,[r11,#((sysinfo_buff-data_begin)+S_TOTALRAM)] 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ size in bytes of RAM 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown movs r3,r3,lsr #20 @ divide by 1024*1024 to get M 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown adc r3,r3,#0 @ round 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#1 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl num_to_ascii 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(ram_comma-data_begin) 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ print 'M RAM, ' 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat @ call strcat 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @======== 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ Bogomips 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @======== 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#'I' 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r1,#'P' 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r2,#'S' 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r3,#'\n' 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl find_string 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(bogo_total-data_begin) 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat @ print bogomips total 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl center_and_print @ center and print 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================= 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Print Host Name 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================= 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownlast_line: 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r10,out_addr @ point r10 to out_buffer 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#((uname_info-data_begin)+U_NODENAME) 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ host name from uname() 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl strcat @ call strcat 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl center_and_print @ center and print 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(default_colors-data_begin) 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ restore colors, print a few linefeeds 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl write_stdout 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @================================ 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ Exit 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @================================ 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownexit: 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#0 @ result is zero 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r7,#SYSCALL_EXIT 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown swi 0x0 @ and exit 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @================================= 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ FIND_STRING 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @================================= 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r0,r1,r2 = string to find 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r3 = char to end at 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r5 trashed 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfind_string: 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r7,disk_addr @ look in cpuinfo buffer 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfind_loop: 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r5,[r7],#+1 @ load a byte, increment pointer 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp r5,r0 @ compare against first byte 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r5,[r7] @ load next byte 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmpeq r5,r1 @ if first byte matched, comp this one 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r5,[r7,#+1] @ load next byte 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmpeq r5,r2 @ if first two matched, comp this one 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown beq find_colon @ if all 3 matched, we are found 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp r5,#0 @ are we at EOF? 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown beq done @ if so, done 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown b find_loop 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfind_colon: 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r5,[r7],#+1 @ load a byte, increment pointer 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp r5,#':' 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bne find_colon @ repeat till we find colon 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r7,r7,#1 @ skip the space 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstore_loop: 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r5,[r7],#+1 @ load a byte, increment pointer 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown strb r5,[r10],#+1 @ store a byte, increment pointer 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp r5,r3 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bne store_loop 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownalmost_done: 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#0 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown strb r0,[r10],#-1 @ replace last value with NUL 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndone: 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bx r14 @ return 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================ 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # strcat 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================ 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # value to cat in r1 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # output buffer in r10 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # r3 trashed 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstrcat: 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r3,[r1],#+1 @ load a byte, increment pointer 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown strb r3,[r10],#+1 @ store a byte, increment pointer 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp r3,#0 @ is it zero? 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bne strcat @ if not loop 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sub r10,r10,#1 @ point to one less than null 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bx r14 @ return 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #============================== 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # center_and_print 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #============================== 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # string to center in at output_buffer 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncenter_and_print: 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stmfd SP!,{LR} @ store return address on stack 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(escape-data_begin) 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ we want to output ^[[ 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl write_stdout 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstr_loop2: 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r2,out_addr @ point r2 to out_buffer 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sub r2,r10,r2 @ get length by subtracting 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown rsb r2,r2,#81 @ reverse subtract! r2=81-r2 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ we use 81 to not count ending \n 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bne done_center @ if result negative, don't center 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lsrs r3,r2,#1 @ divide by 2 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown adc r3,r3,#0 @ round? 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#0 @ print to stdout 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl num_to_ascii @ print number of spaces 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r11,#(C-data_begin) 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ we want to output C 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl write_stdout 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndone_center: 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldr r1,out_addr @ point r1 to out_buffer 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldmfd SP!,{LR} @ restore return address from stack 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================ 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # WRITE_STDOUT 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown #================================ 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # r1 has string 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # r0,r2,r3 trashed 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownwrite_stdout: 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r2,#0 @ clear count 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstr_loop1: 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r2,r2,#1 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldrb r3,[r1,r2] 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp r3,#0 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bne str_loop1 @ repeat till zero 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownwrite_stdout_we_know_size: 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r0,#STDOUT @ print to stdout 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r7,#SYSCALL_WRITE 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown swi 0x0 @ run the syscall 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bx r14 @ return 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @############################# 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ num_to_ascii 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @############################# 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r3 = value to print 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r0 = 0=stdout, 1=strcat 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownnum_to_ascii: 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stmfd SP!,{r10,LR} @ store return address on stack 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r10,r12,#((ascii_buffer-bss_begin)) 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r10,r10,#10 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ point to end of our buffer 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r4,#10 @ we'll be dividing by 10 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndiv_by_10: 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bl divide @ Q=r7,$0, R=r8,$1 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r8,r8,#0x30 @ convert to ascii 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown strb r8,[r10],#-1 @ store a byte, decrement pointer 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown adds r3,r7,#0 @ move Q in for next divide, update flags 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bne div_by_10 @ if Q not zero, loop 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownwrite_out: 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r1,r10,#1 @ adjust pointer 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ldmfd SP!,{r10,LR} @ restore return address from stack 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp r0,#0 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bne strcat @ if 1, strcat 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown b write_stdout @ else, fallthrough to stdout 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @=================================================== 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ Divide - because ARM has no hardware int divide 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ yes this is an awful algorithm, but simple 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ and uses few registers 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @================================================== 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r3=numerator r4=denominator 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r7=quotient r8=remainder 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ r5=trashed 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndivide: 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mov r7,#0 @ zero out quotient 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndivide_loop: 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mul r5,r7,r4 @ multiply Q by denominator 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add r7,r7,#1 @ increment quotient 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmp r5,r3 @ is it greater than numerator? 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ble divide_loop @ if not, loop 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sub r7,r7,#2 @ otherwise went too far, decrement 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @ and done 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mul r5,r7,r4 @ calculate remainder 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sub r8,r3,r5 @ R=N-(Q*D) 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bx r14 @ return 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbss_addr: .word bss_begin 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndata_addr: .word data_begin 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownout_addr: .word out_buffer 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndisk_addr: .word disk_buffer 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownlogo_end_addr: .word logo_end 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownpos_mask: .word ((POSITION_MASK<<8)+0xff) 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntext_addr: .word text_buf 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#=========================================================================== 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# section .data 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#=========================================================================== 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.data 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndata_begin: 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownver_string: .ascii " Version \0" 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncompiled_string: .ascii ", Compiled \0" 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownprocessor: .ascii " Processor, \0" 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownram_comma: .ascii "M RAM, \0" 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbogo_total: .ascii " Bogomips Total\n\0" 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndefault_colors: .ascii "\033[0m\n\n\0" 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownescape: .ascii "\033[\0" 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownC: .ascii "C\0" 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownone: .ascii "One \0" 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownuname_info: 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Linux\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "lindt\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "2.6.32\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "#1 Wed May 13 15:51:54 UTC 2009\0" 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndisk_buffer: 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Processor : Feroceon 88FR131 rev 1 (v5l)\n" 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "BogoMIPS : 1192.75\n" 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Features : swp half thumb fastmult edsp \n" 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU implementer : 0x56\n" 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU architecture: 5TE\n" 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU variant : 0x2\n" 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU part : 0x131\n" 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "CPU revision : 1\n" 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "\n" 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Hardware : Marvell SheevaPlug Reference Board\n" 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Revision : 0000\n" 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.ascii "Serial : 0000000000000000\n\0" 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsysinfo_buff: 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.long 0,0,0,0,512*1024*1024,0,0,0 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.include "../logo.lzss_new" 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#============================================================================ 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# section .bss 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#============================================================================ 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.bss 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbss_begin: 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm ascii_buffer,10 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm text_buf, (N+F-1) 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.lcomm out_buffer,16384 494