OpenWrt Forum Archive

Topic: kexec working on brcm47xx (Asus WL500gP V2)!

The content of this topic has been archived on 30 Mar 2018. There are no obvious gaps in this topic, but there may still be some posts missing at the end.

I wanted to create the system allowing me to develop drivers and applications for my Asus WL500gP V2 without continuous reflashing.
The system was supposed to consist of a small kernel+system flashed into the AP, and able only to mount
the USB disk, and then to boot another kernel from that disk and mount the rootfs from the disk.

A few people have reported success, but their description was not very detailed
(e.g. … 587#p82587

I have tried to utilize the patch mentioned in both above threads:, described in … #a22158033,
however it didn't applied cleanly to the kernel, used in the newest trunk.
After some investigations, I have found, that one modification from the above patch is sufficient
to get the kexec working in Asus WL500gP V2:
In file /arch/mips/kernel/machine_kexec.c

@@ -52,7 +73,9 @@ machine_kexec(struct kimage *image)
     reboot_code_buffer =
       (unsigned long)page_address(image->control_code_page);
-    kexec_start_address = image->start;
+     kexec_start_address =
+        (unsigned long) phys_to_virt(image->start);
     kexec_indirection_page =
         (unsigned long) phys_to_virt(image->head & PAGE_MASK);

I have compile the trunk with the above modification (of course I had also to select the kexec-tools
package in "make menuconfig" in "Utilities" section, and to enable the "Kexec system call" after
"make kernel_menuconfig" in "Kernel type" section).
In fact for tests I have compiled the ramdisk image, so I had also to compile the USB and ext2fs
support into the kernel and to unselect as much other options (e.g. wireless, netfilter and others) to keep
the size of  kernel+ramdisk below 4MB.

Therefore I was able to test my kexec-enabled image without reflashing, just from CFE:
CFE> ifconfig eth0 -addr=
CFE> boot -elf

After booting of such kernel I was able to mount the USB disk:
#mkdir /tmp/d ; mount /dev/sda1 /tmp/d
and boot the kernel from it:

# kexec --command-line="root=/dev/sda1 rootfstype=ext2 noinitrd console=ttyS0,115200" -l vmlinux.elf
# kexec -e

The kernel booted successfully, however it is not able yet to find the root file system on the USB disk.
Probably I need to compile the final image also with ramdisk, allowing the kernel to properly
initialize the USB storage.

booting a kernel (with wl500gp v1) already works with trunk. only finding rootfs was the problem.
i ll try your methode.

Does it mean that the patch for mips kexec system call has been added?

I have finished description of my method. You can find it in the thread
"Asus WL500gP V2 working with kernel and rootfs loaded from USB disk!"

(Last edited by wzab on 14 Mar 2010, 19:50)

The discussion might have continued from here.