It boots:
parse_bootparam(phys_tag:fe000020): Linux version 2.6.29-rc7-ga0f0129-dirty (dumb@octofox.metropolis) (gcc version 4.4.5 (GCC) ) #10 Tue Jun 21 23:13:31 MSD 2011 bootmem_init: sysmem.bank[i:0].{type:0, start:0x1000, end:0x3000} bootmem_init: sysmem.bank[i:1].{type:0, start:0x142000, end:0x8000000} bootmem_init: min_low_pfn:0x1, max_low_pfn:0x8000, max_pfn:0x8000 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32480 Kernel command line: console=ttyS0,38400 root=/dev/simdisk0 init=/init trap_init: PID hash table entries: 512 (order: 9, 2048 bytes) time_init: Platform Calibrating CPU frequency __platform_calibrate_ccount: No Platform Specific routine available to calibrate cpu frequency! __platform_calibrate_ccount: Using Defaults derived from kernel .config file. time_init: ccount_per_jiffy:100000 [10.00 MHz], nsec_per_ccount:100 console [ttyS0] enabled Console: colour dummy device 80x25 Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) Memory: 128380k/131072k available (865k kernel code, 2536k reserved, 53k data, 48k init 0k highmem) SLUB: Genslabs=12, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 calibrate_delay: Calibrating delay loop (skipped)... 10.00 BogoMIPS preset Mount-cache hash table entries: 512 net_namespace: 520 bytes NET: Registered protocol family 16 bio: create slab <bio-0> at 0 NET: Registered protocol family 2 IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 4096 (order: 3, 32768 bytes) TCP bind hash table entries: 4096 (order: 2, 16384 bytes) TCP: Hash tables configured (established 4096 bind 4096) TCP reno registered NET: Registered protocol family 1 simdisk_init: SIMDISK: major: 240 simdisk_attach(dev:d7809000, filename:'x') simdisk_attach: SIMDISK: disk_name:'simdisk0', filename:'x' simdisk_attach(dev:d780941c, filename:'x') simdisk_attach: SIMDISK: disk_name:'simdisk1', filename:'x' msgmni has been set to 251 io scheduler noop registered (default) loop: module loaded Software Watchdog Timer: 0.07 initialized. soft_noboot=0 soft_margin=60 sec (nowayout= 1) TCP cubic registered NET: Registered protocol family 17 ISS serial driver 0.1 VFS: Mounted root (ext2 filesystem) readonly on device 240:0. free_initmem: Freeing unused/init kernel memory: ... 48k freed EXT2-fs warning: mounting unchecked fs, running e2fsck is recommended Starting portmap: done Initializing random number generator... done. Starting network... ip: RTNETLINK answers: File exists Welcome to your custom Xtensa processor based uClibc environment. uclibc login:
arch/xtensa/kernel/entry.S:777
movi a0, 1f + (0x40000000 - 0xC0000000) # Calculate Return address for "1f" and store in a0 rsil a2, XCHAL_EXCM_LEVEL # FIXME: again, only do this if PS.INTLEVEL <= EXCM_LEVEL retw # rotate back by 4 registers, possibly with underflow # Back out our _entry Frame above... # ... We return here from above retw. 1: mov a1, a5 # our a1 became a5 at the above _entry, a1 = a5
Assembled it looks like this:
0010 ffffff3f 00000000 000000c0 05030080 ... 1c: R_XTENSA_32 .text ... 2fd: 000001 l32r a0, fffc0300 <ret_from_fork+0xfffbf858> 2fd: R_XTENSA_SLOT0_OP .literal+0x1c 300: 006320 rsil a2, 3 303: f01d retw.n 305: 051d mov.n a1, a5
Linked vmlinux looks like this (broken, word at d000357c should be 2d3d0050):
d0003570 ffffff3f e83b00d0 000000c0 cd3c0050 ... d0003d25: fe1501 l32r a0, d000357c <T$339+0x68> d0003d28: 006320 rsil a2, 3 d0003d2b: f01d retw.n d0003d2d: 051d mov.n a1, a5
Looks like bug in linker. Cured by the following patch:
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S index 0cb1530..e7b2263 100644 --- a/arch/xtensa/kernel/entry.S +++ b/arch/xtensa/kernel/entry.S @@ -774,7 +774,9 @@ _kernel_exception: #endif l32i a3, a1, PT_PS # a3 = ptregs->ps [NOTE: Used below after retw] - movi a0, 1f + (0x40000000 - 0xC0000000) # Calculate Return address for "1f" and store in a0 + movi a0, 1f # + (0x40000000 - 0xC0000000) # Calculate Return address for "1f" and store in a0 + movi a2, 0x40000000 - 0xC0000000 + add a0, a0, a2 rsil a2, XCHAL_EXCM_LEVEL # FIXME: again, only do this if PS.INTLEVEL <= EXCM_LEVEL retw # rotate back by 4 registers, possibly with underflow # Back out our _entry Frame above...
There's no checks for select simcall error status (or maybe there just should not be EINTR error, that's just not documented). Fix is the following:
diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c index e650152..285744e 100644 --- a/arch/xtensa/platforms/iss/console.c +++ b/arch/xtensa/platforms/iss/console.c @@ -126,10 +126,11 @@ static void rs_poll(unsigned long priv) spin_lock(&timer_lock); - while (__simc(SYS_select_one, 0, XTISS_SELECT_ONE_READ, (int)&tv,0,0)){ - __simc (SYS_read, 0, (unsigned long)&c, 1, 0, 0); - tty_insert_flip_char(tty, c, TTY_NORMAL); - i++; + while (__simc(SYS_select_one, 0, XTISS_SELECT_ONE_READ, (int)&tv,0,0) > 0) { + if (__simc (SYS_read, 0, (unsigned long)&c, 1, 0, 0) == 1) { + tty_insert_flip_char(tty, c, TTY_NORMAL); + i++; + } } if (i)
There's polling timer, it's 20 seconds :(). Fix is the following:
diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c index e650152..285744e 100644 --- a/arch/xtensa/platforms/iss/console.c +++ b/arch/xtensa/platforms/iss/console.c @@ -35,7 +35,7 @@ #endif #define SERIAL_MAX_NUM_LINES 1 -#define SERIAL_TIMER_VALUE (20 * HZ) +#define SERIAL_TIMER_VALUE (HZ / 10) static struct tty_driver *serial_driver; static struct timer_list serial_timer;