Open Source & Linux Lab

It's better when it's simple

User Tools

Site Tools


etc:users:jcmvbkbc:xtensa-linux

This is an old revision of the document!


Booting xtensa linux on qemu

It boots:

parse_bootparam(phys_tag:fe000020): 
Linux version 2.6.29-rc7-ga0f0129-dirty (dumb@octofox.metropolis) (gcc version 4.4.5 (GCC) ) #7 Mon Jun 20 01:45:39 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
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
Warning: unable to open an initial console.
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.

Issues

wrong address generated for jump in kernel_exception_return

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...
etc/users/jcmvbkbc/xtensa-linux.1308527373.txt.gz · Last modified: 2011/06/20 03:49 (external edit)