aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/x86/image
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/x86/image')
-rw-r--r--target/linux/x86/image/Config.in106
-rw-r--r--target/linux/x86/image/Makefile256
-rwxr-xr-xtarget/linux/x86/image/gen_image_generic.sh39
-rwxr-xr-xtarget/linux/x86/image/gen_image_grub.sh13
-rwxr-xr-xtarget/linux/x86/image/gen_image_olpc.sh35
-rw-r--r--target/linux/x86/image/grub-early.cfg1
-rw-r--r--target/linux/x86/image/grub.cfg13
-rw-r--r--target/linux/x86/image/menu.lst15
-rw-r--r--target/linux/x86/image/olpc.fth5
9 files changed, 483 insertions, 0 deletions
diff --git a/target/linux/x86/image/Config.in b/target/linux/x86/image/Config.in
new file mode 100644
index 000000000..08880e580
--- /dev/null
+++ b/target/linux/x86/image/Config.in
@@ -0,0 +1,106 @@
+config X86_ETHERBOOT_IMAGES
+ bool "Build Etherboot image"
+ depends TARGET_x86 && TARGET_x86_thincan_DBE61
+ default y
+ help
+ Builds network bootable image for ThinCan DBE61 (Etherboot BIOS)
+
+config X86_ETHERBOOT_BOOTOPTS
+ string "Extra kernel boot options"
+ depends X86_ETHERBOOT_IMAGES
+ default "ip=dhcp nbdport=2000 " if TARGET_ROOTFS_SQUASHFS
+ default "ip=dhcp root=/dev/nfs nfsroot=192.168.0.1:/srv/dbe61"
+ help
+ Kernel arguments to pass to the kernel eg. NFS root location etc.
+
+config X86_GRUB_IMAGES
+ bool "Build GRUB images (Linux x86 or x86_64 host only)"
+ depends TARGET_x86 && !TARGET_x86_olpc
+ depends TARGET_ROOTFS_EXT4FS || TARGET_ROOTFS_ISO || TARGET_ROOTFS_JFFS2 || TARGET_ROOTFS_SQUASHFS
+ select PACKAGE_grub if !X86_USE_GRUB2
+ default y
+
+config X86_USE_GRUB2
+ bool "Use grub2"
+ depends X86_GRUB_IMAGES
+ select PACKAGE_grub2
+
+config X86_GRUB_CONSOLE
+ bool "Use Console Terminal (in addition to Serial)"
+ depends X86_GRUB_IMAGES
+ default n if (TARGET_x86_generic_Soekris45xx || TARGET_x86_generic_Soekris48xx || TARGET_x86_net5501 || TARGET_x86_geos || TARGET_x86_alix2)
+ default y
+
+config X86_GRUB_SERIAL
+ string "Serial port device"
+ depends X86_GRUB_IMAGES
+ default "hvc0" if TARGET_x86_xen_domu
+ default "ttyS0" if ! TARGET_x86_xen_domu
+
+config X86_GRUB_BAUDRATE
+ int "Serial port baud rate"
+ depends X86_GRUB_IMAGES
+ default 19200 if TARGET_x86_generic_Soekris45xx || TARGET_x86_generic_Soekris48xx || TARGET_x86_net5501
+ default 38400 if TARGET_x86_alix2
+ default 115200 if TARGET_x86_geos || TARGET_x86_kvm_guest
+ default 38400
+
+config X86_GRUB_BOOTOPTS
+ string "Extra kernel boot options"
+ depends X86_GRUB_IMAGES
+ default "xencons=hvc" if TARGET_x86_xen_domu
+ help
+ If you don't know, just leave it blank.
+
+config X86_GRUB_TIMEOUT
+ string "Seconds to wait before booting the default entry"
+ depends X86_GRUB_IMAGES
+ default "5"
+ help
+ If you don't know, 5 seconds is a reasonable default.
+
+config X86_VDI_IMAGES
+ bool "Build VirtualBox image files (VDI)"
+ depends X86_GRUB_IMAGES
+ depends TARGET_x86
+ depends TARGET_ROOTFS_EXT4FS
+ select PACKAGE_kmod-pcnet32
+
+config X86_VMDK_IMAGES
+ bool "Build VMware image files (VMDK)"
+ depends X86_GRUB_IMAGES
+ depends TARGET_x86
+ depends TARGET_ROOTFS_EXT4FS
+ select PACKAGE_kmod-e1000
+
+
+config OLPC_BOOTSCRIPT_IMAGES
+ bool "Build images with bootscript"
+ depends TARGET_x86_olpc
+ depends TARGET_ROOTFS_EXT4FS || TARGET_ROOTFS_ISO || TARGET_ROOTFS_JFFS2 || TARGET_ROOTFS_SQUASHFS
+ default TARGET_x86_olpc
+
+
+config TARGET_IMAGES_PAD
+ bool "Pad images to filesystem size (for JFFS2)"
+ depends OLPC_BOOTSCRIPT_IMAGES || X86_GRUB_IMAGES
+
+config TARGET_IMAGES_GZIP
+ bool "GZip images"
+ depends TARGET_IMAGES_PAD || TARGET_ROOTFS_EXT4FS
+ default y
+
+config TARGET_KERNEL_PARTSIZE
+ int "Kernel partition size (in MB)"
+ depends OLPC_BOOTSCRIPT_IMAGES || X86_GRUB_IMAGES
+ default 4
+
+config TARGET_ROOTFS_PARTNAME
+ string "Root partition on target device"
+ depends OLPC_BOOTSCRIPT_IMAGES || X86_GRUB_IMAGES
+ default "/dev/vda2" if TARGET_x86_kvm_guest
+ default "/dev/xvda2" if TARGET_x86_xen_domu
+ default "/dev/sda2" if ! (TARGET_x86_kvm_guest || TARGET_x86_xen_domu)
+ help
+ The root partition on the final device. If you don't know,
+ you probably want the default (/dev/sda2).
diff --git a/target/linux/x86/image/Makefile b/target/linux/x86/image/Makefile
new file mode 100644
index 000000000..547f0839f
--- /dev/null
+++ b/target/linux/x86/image/Makefile
@@ -0,0 +1,256 @@
+#
+# Copyright (C) 2006-2012 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/image.mk
+
+export PATH=$(TARGET_PATH):/sbin
+
+GRUB2_MODULES = at_keyboard biosdisk boot chain configfile ext2 linux ls part_msdos reboot serial vga
+GRUB_TERMINALS =
+GRUB_SERIAL_CONFIG =
+GRUB_TERMINAL_CONFIG =
+GRUB_CONSOLE_CMDLINE =
+
+ifneq ($(CONFIG_X86_GRUB_CONSOLE),)
+ GRUB_CONSOLE_CMDLINE += console=tty0
+ GRUB_TERMINALS += console
+endif
+
+ifneq ($(CONFIG_X86_GRUB_SERIAL),)
+ GRUB_CONSOLE_CMDLINE += console=$(call qstrip,$(CONFIG_X86_GRUB_SERIAL)),$(CONFIG_X86_GRUB_BAUDRATE)n8
+ GRUB_SERIAL_CONFIG := serial --unit=0 --speed=$(CONFIG_X86_GRUB_BAUDRATE) --word=8 --parity=no --stop=1
+ GRUB_TERMINALS += serial
+endif
+
+ifneq ($(GRUB_TERMINALS),)
+ ifneq ($(CONFIG_X86_USE_GRUB2),)
+ GRUB_TERMINAL_CONFIG := terminal_input $(GRUB_TERMINALS); terminal_output $(GRUB_TERMINALS)
+ else
+ GRUB_TERMINAL_CONFIG := terminal --timeout=2 $(GRUB_TERMINALS)
+ endif
+endif
+
+ROOTPART:=$(call qstrip,$(CONFIG_TARGET_ROOTFS_PARTNAME))
+
+GRUB_TIMEOUT:=$(call qstrip,$(CONFIG_X86_GRUB_TIMEOUT))
+
+ifneq ($(CONFIG_X86_GRUB_IMAGES),)
+
+ BOOTOPTS:=$(call qstrip,$(CONFIG_X86_GRUB_BOOTOPTS))
+
+ define Image/cmdline/ext4
+ root=$(ROOTPART) rootfstype=ext4 rootwait
+ endef
+
+ define Image/cmdline/jffs2-64k
+ block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootwait
+ endef
+
+ define Image/cmdline/jffs2-128k
+ block2mtd.block2mtd=$(ROOTPART),131072,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootwait
+ endef
+
+ define Image/cmdline/squashfs
+ block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=squashfs rootwait
+ endef
+
+ define Image/Build/grub
+ # left here because the image builder doesnt need these
+ $(INSTALL_DIR) $(KDIR)/root.grub/boot/grub
+ $(CP) \
+ $(KDIR)/stage1 \
+ $(KDIR)/stage2 \
+ $(KDIR)/e2fs_stage1_5 \
+ $(KDIR)/root.grub/boot/grub/
+ $(CP) $(KDIR)/bzImage $(KDIR)/root.grub/boot/vmlinuz
+ sed \
+ -e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
+ -e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
+ -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
+ -e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
+ ./menu.lst > $(KDIR)/root.grub/boot/grub/menu.lst
+ PADDING="$(CONFIG_TARGET_IMAGES_PAD)" PATH="$(TARGET_PATH)" ./gen_image_grub.sh \
+ $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
+ $(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.grub \
+ $(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1)
+ $(call Image/Build/grub/$(1))
+ endef
+
+ define Image/Prepare/grub
+ # for the image builder
+ $(CP) \
+ $(STAGING_DIR)/usr/lib/grub/i386-openwrt/stage1 \
+ $(STAGING_DIR)/usr/lib/grub/i386-openwrt/stage2 \
+ $(STAGING_DIR)/usr/lib/grub/i386-openwrt/stage2_eltorito \
+ $(STAGING_DIR)/usr/lib/grub/i386-openwrt/e2fs_stage1_5 \
+ $(KDIR)/
+ endef
+
+ define Image/Build/grub2
+ # left here because the image builder doesnt need these
+ $(INSTALL_DIR) $(KDIR)/root.grub/boot/grub $(KDIR)/grub2
+ $(CP) $(KDIR)/bzImage $(KDIR)/root.grub/boot/vmlinuz
+ grub-mkimage \
+ -o $(KDIR)/grub2/core.img \
+ -O i386-pc \
+ -c ./grub-early.cfg \
+ $(GRUB2_MODULES)
+ $(CP) $(STAGING_DIR_HOST)/lib/grub/i386-pc/*.img $(KDIR)/grub2/
+ echo '(hd0) $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img' > $(KDIR)/grub2/device.map
+ sed \
+ -e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
+ -e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
+ -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
+ -e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
+ ./grub.cfg > $(KDIR)/root.grub/boot/grub/grub.cfg
+ PADDING="$(CONFIG_TARGET_IMAGES_PAD)" PATH="$(TARGET_PATH)" ./gen_image_generic.sh \
+ $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
+ $(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.grub \
+ $(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1) \
+ 256
+ grub-bios-setup \
+ --device-map="$(KDIR)/grub2/device.map" \
+ -d "$(KDIR)/grub2" \
+ -r "hd0,msdos1" \
+ "$(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img"
+ $(call Image/Build/grub/$(1))
+ endef
+endif
+
+ROOTDELAY=10
+
+ifneq ($(CONFIG_OLPC_BOOTSCRIPT_IMAGES),)
+
+ define Image/cmdline/ext4
+ root=$(ROOTPART) rootfstype=ext4 rootwait
+ endef
+
+ define Image/cmdline/jffs2-64k
+ block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootdelay=$(ROOTDELAY)
+ endef
+
+ define Image/cmdline/jffs2-128k
+ block2mtd.block2mtd=$(ROOTPART),131072,rootfs root=/dev/mtdblock0 rootfstype=jffs2 rootdelay=$(ROOTDELAY)
+ endef
+
+ define Image/cmdline/squashfs
+ block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=squashfs rootdelay=$(ROOTDELAY)
+ endef
+
+ define Image/Build/bootscript
+ # left here because the image builder doesnt need these
+ $(INSTALL_DIR) $(KDIR)/root.bootscript/boot
+ $(CP) $(KDIR)/bzImage $(KDIR)/root.bootscript/boot/vmlinuz
+ sed -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1))) $(BOOTOPTS)#g' \
+ ./olpc.fth > $(KDIR)/root.bootscript/boot/olpc.fth
+ PADDING="$(CONFIG_TARGET_IMAGES_PAD)" PATH="$(TARGET_PATH)" ./gen_image_olpc.sh \
+ $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
+ $(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.bootscript \
+ $(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1)
+ endef
+
+endif
+
+define Image/Build/squashfs
+ $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
+endef
+
+define Image/Build/iso
+ $(INSTALL_DIR) $(KDIR)/root.grub/boot/grub
+ $(CP) \
+ $(KDIR)/stage2_eltorito \
+ $(KDIR)/root.grub/boot/grub/
+ sed \
+ -e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
+ -e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
+ -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
+ -e 's#(hd0,0)#(cd)#g' \
+ ./menu.lst > $(KDIR)/root.grub/boot/grub/menu.lst
+ $(CP) $(KDIR)/bzImage $(KDIR)/root.grub/boot/vmlinuz
+ mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table \
+ -o $(KDIR)/root.iso $(KDIR)/root.grub
+endef
+
+ifneq ($(CONFIG_X86_VDI_IMAGES),)
+ define Image/Build/vdi
+ # left here because the image builder doesnt need these
+ ifeq ($(1),ext4)
+ rm $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vdi || true
+ qemu-img convert -f raw -O vdi \
+ $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
+ $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vdi
+ # XXX: VBoxManage insists on setting perms to 0600
+ chmod 0644 $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vdi
+ endif
+ endef
+endif
+
+ifneq ($(CONFIG_X86_VMDK_IMAGES),)
+ define Image/Build/vmdk
+ # left here because the image builder doesnt need these
+ ifeq ($(1),ext4)
+ rm $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vmdk || true
+ qemu-img convert -f raw -O vmdk \
+ $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
+ $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vmdk
+ endif
+ endef
+endif
+
+define Image/Build/gzip
+ gzip -f9 $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img
+ gzip -f9 $(BIN_DIR)/$(IMG_PREFIX)-rootfs-$(1).img
+endef
+
+ifneq ($(CONFIG_TARGET_IMAGES_GZIP),)
+ define Image/Build/gzip/ext4
+ $(call Image/Build/gzip,ext4)
+ endef
+ ifneq ($(CONFIG_TARGET_IMAGES_PAD),)
+ define Image/Build/gzip/squashfs
+ $(call Image/Build/gzip,squashfs)
+ endef
+ define Image/Build/gzip/jffs2-64k
+ $(call Image/Build/gzip,jffs2-64k)
+ endef
+ define Image/Build/gzip/jffs2-128k
+ $(call Image/Build/gzip,jffs2-128k)
+ endef
+ endif
+endif
+
+define Image/BuildKernel
+ $(CP) $(KDIR)/bzImage $(BIN_DIR)/$(IMG_PREFIX)-vmlinuz
+ ifneq ($(CONFIG_X86_ETHERBOOT_IMAGES),)
+ rm -f $(BIN_DIR)/$(IMG_PREFIX)-etherboot
+ $(STAGING_DIR_HOST)/bin/mkelfImage \
+ --append=$(CONFIG_X86_ETHERBOOT_BOOTOPTS) \
+ $(KDIR)/bzImage \
+ $(BIN_DIR)/$(IMG_PREFIX)-etherboot
+ endif
+endef
+
+define Image/Prepare
+ $(CP) $(LINUX_DIR)/arch/x86/boot/bzImage $(KDIR)/bzImage
+ $(call Image/Prepare/bootscript)
+ $(call Image/Prepare/$(if $(CONFIG_X86_USE_GRUB2),grub2,grub))
+endef
+
+define Image/Build
+ $(call Image/Build/$(1))
+ $(call Image/Build/bootscript,$(1))
+ ifneq ($(1),iso)
+ $(call Image/Build/$(if $(CONFIG_X86_USE_GRUB2),grub2,grub),$(1))
+ $(call Image/Build/vdi,$(1))
+ $(call Image/Build/vmdk,$(1))
+ endif
+ $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-rootfs-$(1).img
+ $(CP) $(KDIR)/bzImage $(BIN_DIR)/$(IMG_PREFIX)-vmlinuz
+ $(call Image/Build/gzip/$(1))
+endef
+
+$(eval $(call BuildImage))
diff --git a/target/linux/x86/image/gen_image_generic.sh b/target/linux/x86/image/gen_image_generic.sh
new file mode 100755
index 000000000..9d11efbb0
--- /dev/null
+++ b/target/linux/x86/image/gen_image_generic.sh
@@ -0,0 +1,39 @@
+#!/usr/bin/env bash
+# Copyright (C) 2006-2012 OpenWrt.org
+set -x
+[ $# == 5 -o $# == 6 ] || {
+ echo "SYNTAX: $0 <file> <kernel size> <kernel directory> <rootfs size> <rootfs image> [<align>]"
+ exit 1
+}
+
+OUTPUT="$1"
+KERNELSIZE="$2"
+KERNELDIR="$3"
+ROOTFSSIZE="$4"
+ROOTFSIMAGE="$5"
+ALIGN="$6"
+
+rm -f "$OUTPUT"
+
+head=16
+sect=63
+cyl=$(( ($KERNELSIZE + $ROOTFSSIZE) * 1024 * 1024 / ($head * $sect * 512)))
+
+# create partition table
+set `ptgen -o "$OUTPUT" -h $head -s $sect -p ${KERNELSIZE}m -p ${ROOTFSSIZE}m ${ALIGN:+-l $ALIGN}`
+
+KERNELOFFSET="$(($1 / 512))"
+KERNELSIZE="$(($2 / 512))"
+ROOTFSOFFSET="$(($3 / 512))"
+ROOTFSSIZE="$(($4 / 512))"
+
+BLOCKS="$((($KERNELSIZE / 2) - 1))"
+
+[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc count="$ROOTFSSIZE"
+dd if="$ROOTFSIMAGE" of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc
+
+[ -n "$NOGRUB" ] && exit 0
+
+genext2fs -d "$KERNELDIR" -b "$BLOCKS" "$OUTPUT.kernel"
+dd if="$OUTPUT.kernel" of="$OUTPUT" bs=512 seek="$KERNELOFFSET" conv=notrunc
+rm -f "$OUTPUT.kernel"
diff --git a/target/linux/x86/image/gen_image_grub.sh b/target/linux/x86/image/gen_image_grub.sh
new file mode 100755
index 000000000..9a84322f4
--- /dev/null
+++ b/target/linux/x86/image/gen_image_grub.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+# Copyright (C) 2006-2010 OpenWrt.org
+. ./gen_image_generic.sh
+
+which chpax >/dev/null && chpax -zp $(which grub)
+grub --batch --no-curses --no-floppy --device-map=/dev/null <<EOF
+device (hd0) $OUTPUT
+geometry (hd0) $cyl $head $sect
+root (hd0,0)
+setup (hd0)
+quit
+EOF
+
diff --git a/target/linux/x86/image/gen_image_olpc.sh b/target/linux/x86/image/gen_image_olpc.sh
new file mode 100755
index 000000000..82bc4ed95
--- /dev/null
+++ b/target/linux/x86/image/gen_image_olpc.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+# Copyright (C) 2006-2010 OpenWrt.org
+set -x
+[ $# == 5 ] || {
+ echo "SYNTAX: $0 <file> <kernel size> <kernel directory> <rootfs size> <rootfs image>"
+ exit 1
+}
+
+OUTPUT="$1"
+KERNELSIZE="$2"
+KERNELDIR="$3"
+ROOTFSSIZE="$4"
+ROOTFSIMAGE="$5"
+
+rm -f "$OUTPUT"
+
+head=16
+sect=63
+cyl=$(( ($KERNELSIZE + $ROOTFSSIZE) * 1024 * 1024 / ($head * $sect * 512)))
+
+# create partition table
+set `ptgen -o "$OUTPUT" -h $head -s $sect -p ${KERNELSIZE}m -p ${ROOTFSSIZE}m`
+
+KERNELOFFSET="$(($1 / 512))"
+KERNELSIZE="$(($2 / 512))"
+ROOTFSOFFSET="$(($3 / 512))"
+ROOTFSSIZE="$(($4 / 512))"
+
+BLOCKS="$((($KERNELSIZE / 2) - 1))"
+
+genext2fs -d "$KERNELDIR" -b "$BLOCKS" "$OUTPUT.kernel"
+dd if="$OUTPUT.kernel" of="$OUTPUT" bs=512 seek="$KERNELOFFSET" conv=notrunc
+[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc count="$ROOTFSSIZE"
+dd if="$ROOTFSIMAGE" of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc
+rm -f "$OUTPUT.kernel"
diff --git a/target/linux/x86/image/grub-early.cfg b/target/linux/x86/image/grub-early.cfg
new file mode 100644
index 000000000..4a5b5a609
--- /dev/null
+++ b/target/linux/x86/image/grub-early.cfg
@@ -0,0 +1 @@
+configfile (hd0,msdos1)/boot/grub/grub.cfg
diff --git a/target/linux/x86/image/grub.cfg b/target/linux/x86/image/grub.cfg
new file mode 100644
index 000000000..4e55dcfa6
--- /dev/null
+++ b/target/linux/x86/image/grub.cfg
@@ -0,0 +1,13 @@
+@SERIAL_CONFIG@
+@TERMINAL_CONFIG@
+
+set default="0"
+set timeout="@TIMEOUT@"
+set root='(hd0,msdos1)'
+
+menuentry "OpenWrt" {
+ linux /boot/vmlinuz @CMDLINE@ noinitrd reboot=bios
+}
+menuentry "OpenWrt (failsafe)" {
+ linux /boot/vmlinuz failsafe=true @CMDLINE@ noinitrd reboot=bios
+}
diff --git a/target/linux/x86/image/menu.lst b/target/linux/x86/image/menu.lst
new file mode 100644
index 000000000..5af1e955b
--- /dev/null
+++ b/target/linux/x86/image/menu.lst
@@ -0,0 +1,15 @@
+@SERIAL_CONFIG@
+@TERMINAL_CONFIG@
+
+default 0
+timeout @TIMEOUT@
+
+title OpenWrt
+root (hd0,0)
+kernel /boot/vmlinuz @CMDLINE@ noinitrd reboot=bios
+boot
+
+title OpenWrt (failsafe)
+root (hd0,0)
+kernel /boot/vmlinuz failsafe=true @CMDLINE@ noinitrd reboot=bios
+boot
diff --git a/target/linux/x86/image/olpc.fth b/target/linux/x86/image/olpc.fth
new file mode 100644
index 000000000..5914be660
--- /dev/null
+++ b/target/linux/x86/image/olpc.fth
@@ -0,0 +1,5 @@
+\ Boot script
+" u:\boot\vmlinuz" to boot-device
+" @CMDLINE@ noinitrd console=ttyS0,115200 console=tty0" to boot-file
+unfreeze
+boot