kexecboot: add new (beta) release 0.4 and add patches from upstream
authorAndrea Adami <andrea.adami@gmail.com>
Mon, 26 Jan 2009 23:25:39 +0000 (00:25 +0100)
committerAndrea Adami <andrea.adami@gmail.com>
Tue, 27 Jan 2009 22:26:25 +0000 (23:26 +0100)
packages/kexecboot/kexecboot-0.4/add-reboot-option.patch [new file with mode: 0644]
packages/kexecboot/kexecboot-0.4/add-sleep.patch [new file with mode: 0644]
packages/kexecboot/kexecboot-0.4/graphical-no-devices.patch [new file with mode: 0644]
packages/kexecboot/kexecboot-0.4/scan_devices-top.patch [new file with mode: 0644]
packages/kexecboot/kexecboot-0.4/silent-output-hack.patch [new file with mode: 0644]
packages/kexecboot/kexecboot-0.4/switch-cursor-off.patch [new file with mode: 0644]
packages/kexecboot/kexecboot_0.4.bb [new file with mode: 0644]

diff --git a/packages/kexecboot/kexecboot-0.4/add-reboot-option.patch b/packages/kexecboot/kexecboot-0.4/add-reboot-option.patch
new file mode 100644 (file)
index 0000000..5261922
--- /dev/null
@@ -0,0 +1,41 @@
+--- a/kexecboot.c
++++ b/kexecboot.c
+@@ -536,11 +536,23 @@ int main(int argc, char **argv)
+                       fread(&evt, sizeof(struct input_event), 1, f);
+               while(evt.type != EV_KEY || evt.value != 0);
+
+-              if(evt.code == KEY_UP && choice >0)
+-                      choice--;
+-              if(evt.code == KEY_DOWN && choice < bl->size-1)
+-                      choice++;
+-      //      printf("%d %d\n",choice, evt.code);
++              switch (evt.code) {
++              case KEY_UP:
++                      if (choice > 0) choice--;
++                      break;
++              case KEY_DOWN:
++                      if ( choice < (bl->size - 1) ) choice++;
++                      break;
++              case KEY_R:
++                      /* FIXME: Should work while no boot devices is found */
++                      sync();
++                      sleep(1);
++                      /* if ( -1 == reboot(LINUX_REBOOT_CMD_RESTART) ) { */
++                      if ( -1 == reboot(RB_AUTOBOOT) ) {
++                              perror("Can't initiate reboot");
++                      }
++                      break;
++              }
+
+       }while(evt.code != 87 && evt.code != 63);
+       fclose(f);
+--- a/kexecboot.h
++++ b/kexecboot.h
+@@ -29,6 +29,7 @@
+ #include <sys/wait.h>
+ #include <ctype.h>
+ #include <errno.h>
++#include <sys/reboot.h>
+ #include "fb.h"
+ #include "devicescan.h"
+ #include "res/logo-img.h"
diff --git a/packages/kexecboot/kexecboot-0.4/add-sleep.patch b/packages/kexecboot/kexecboot-0.4/add-sleep.patch
new file mode 100644 (file)
index 0000000..8f41b0e
--- /dev/null
@@ -0,0 +1,12 @@
+--- a/kexecboot.c      2009-01-24 14:11:17.000000000 +0100
++++ b/kexecboot.c      2009-01-24 14:15:03.000000000 +0100
+@@ -427,6 +427,9 @@
+
+               DPRINTF("I'm the init-process!\n");
+
++              /* extra delay for initializing slow SD/CF */
++              sleep(1);
++
+               /* Mount procfs */
+               if ( -1 == mount("proc", "/proc", "proc",
+                               0, NULL) ) {
diff --git a/packages/kexecboot/kexecboot-0.4/graphical-no-devices.patch b/packages/kexecboot/kexecboot-0.4/graphical-no-devices.patch
new file mode 100644 (file)
index 0000000..b2cb214
--- /dev/null
@@ -0,0 +1,20 @@
+--- a/kexecboot.c
++++ b/kexecboot.c
+@@ -66,8 +66,15 @@ void display_menu(FB *fb, struct bootlist *bl, int current)
+                     LOGO_IMG_WIDTH,
+                     LOGO_IMG_HEIGHT,
+                     LOGO_IMG_BYTES_PER_PIXEL, LOGO_IMG_RLE_PIXEL_DATA);
+-      fb_draw_text (fb, LOGO_IMG_WIDTH + margin, margin, 0, 0, 0, &radeon_font,
+-                      "Make your choice by selecting\nan item with the cursor keys\nand press OK to continue");
++      /* If no devices found print a message */
++      if (0 == bl->size) {
++              fb_draw_text (fb, LOGO_IMG_WIDTH + margin, margin, 0, 0, 0, &radeon_font,
++                      "No bootable devices found.\nInsert bootable device\nand press 'R' to reboot.");
++      } else {
++              fb_draw_text (fb, LOGO_IMG_WIDTH + margin, margin, 0, 0, 0, &radeon_font,
++                      "Make your choice by selecting\nan item with the cursor keys\nand press OK to continue.\nPress 'R' to reboot.");
++      }
++
+       if(current < firstslot)
+               firstslot=current;
+       if(current > firstslot + slots -1)
diff --git a/packages/kexecboot/kexecboot-0.4/scan_devices-top.patch b/packages/kexecboot/kexecboot-0.4/scan_devices-top.patch
new file mode 100644 (file)
index 0000000..6b21d03
--- /dev/null
@@ -0,0 +1,39 @@
+--- a/kexecboot.c
++++ b/kexecboot.c
+@@ -508,28 +508,27 @@ int main(int argc, char **argv)
+       if ((fb = fb_new(angle)) == NULL)
+               exit(-1);
+
+-      bl = scan_devices();
+-
+-      if(!bl->size){
+-              puts("No bootable device found");
+-              exit(-1);
+-      }
+-
+       f = fopen(eventif,"r");
+       if(!f){
+           perror(eventif);
+           exit(3);
+       }
+
+-
+       // deactivate terminal input
+-
+       tcgetattr(fileno(stdin), &old);
+       new = old;
+       new.c_lflag &= ~ECHO;
+ //    new.c_cflag &=~CREAD;
+       tcsetattr(fileno(stdin), TCSANOW, &new);
+
++      bl = scan_devices();
++/*
++      if(!bl->size){
++              puts("No bootable device found");
++              exit(-1);
++      }
++*/
++
+       do{
+               display_menu(fb, bl, choice);
+               do
diff --git a/packages/kexecboot/kexecboot-0.4/silent-output-hack.patch b/packages/kexecboot/kexecboot-0.4/silent-output-hack.patch
new file mode 100644 (file)
index 0000000..abe8e84
--- /dev/null
@@ -0,0 +1,79 @@
+--- a/devicescan.c     2009-01-17 00:51:35.000000000 +0100
++++ b/devicescan.c     2009-01-24 22:13:45.000000000 +0100
+@@ -120,14 +120,14 @@
+                   malloc((strlen(split) + strlen("/dev/") +
+                           1) * sizeof(char));
+               sprintf(device, "/dev/%s", split);
+-              printf("Probing %s\n",device);
++              /* printf("Probing %s\n",device); */
+               int fd = open(device, O_RDONLY);
+               if (fd < 0) {
+                       perror(device);
+                       free(device);
+                       continue;
+               }
+-              printf("Device %s is opened\n", device);
++              /* printf("Device %s is opened\n", device); */
+               if (-1 == identify_fs(fd, &fstype, NULL, 0)) {
+                       free(device);
+                       continue;
+@@ -137,33 +137,33 @@
+                       free(device);
+                       continue;
+               }
+-              printf("FS on device %s is %s\n", device, fstype);
++              /* printf("FS on device %s is %s\n", device, fstype); */
+               // no unknown filesystems
+               if (contains(fstype, fl) == -1) {
+                       free(device);
+                       continue;
+               }
+-              printf("found %s (%s)\n",device, fstype);
++              /* printf("found %s (%s)\n",device, fstype); */
+               // mount fs
+               if (mount(device, "/mnt", fstype, MS_RDONLY, NULL)) {
+-                      printf("mount failed\n");
++                      /* printf("mount failed\n"); */
+                       perror(device);
+                       free(device);
+                       continue;
+               }
+-              printf("mount successful\n");
++              /* printf("mount successful\n"); */
+               if ( (g = fopen("/mnt/zImage", "r")) )
+                       kernelpath = "/mnt/zImage";
+               else if ( (g = fopen("/mnt/boot/zImage", "r")) )
+                       kernelpath = "/mnt/boot/zImage";
+               else {
+-                      printf("%s no kernel found, umounting\n", device);
++                      /* printf("%s no kernel found, umounting\n", device); */
+                       free(device);
+                       umount("/mnt");
+                       continue;
+               }
+               fclose(g);
+-              printf("found kernel\n");
++              /* printf("found kernel\n"); */
+               bl->list[count] = malloc(sizeof(struct boot));
+               bl->list[count]->device = device;
+               bl->list[count]->fstype = fstype;
+@@ -174,7 +174,7 @@
+                       fgets(bl->list[count]->cmdline, COMMAND_LINE_SIZE,
+                             g);
+                       fclose(g);
+-                      printf("found command line\n");
++                      /* printf("found command line\n"); */
+                       bl->list[count]->cmdline[strlen(bl->list[count]->cmdline)-1] = '\0';
+               } else
+                       bl->list[count]->cmdline = NULL;
+--- a/kexecboot.c      2009-01-25 10:41:04.000000000 +0100
++++ b/kexecboot.c      2009-01-24 22:13:45.000000000 +0100
+@@ -558,7 +558,7 @@
+               case KEY_R:
+                       /* FIXME: Should work while no boot devices is found */
+                       sync();
+-                      sleep(1);
++                      /* REMOVE: we sleep on boot     sleep(1); */
+                       /* if ( -1 == reboot(LINUX_REBOOT_CMD_RESTART) ) { */
+                       if ( -1 == reboot(RB_AUTOBOOT) ) {
+                               perror("Can't initiate reboot");
diff --git a/packages/kexecboot/kexecboot-0.4/switch-cursor-off.patch b/packages/kexecboot/kexecboot-0.4/switch-cursor-off.patch
new file mode 100644 (file)
index 0000000..632cc6a
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/kexecboot.c
++++ b/kexecboot.c
+@@ -512,6 +512,9 @@ int main(int argc, char **argv)
+       DPRINTF("FB angle is %d, input device is %s\n", angle, eventif);
+       DPRINTF("Going to fb mode\n");
+
++      /* Switch cursor off. NOTE: works only when master-console is tty */
++      printf("\033[?25l\n");
++
+       if ((fb = fb_new(angle)) == NULL)
+               exit(-1);
diff --git a/packages/kexecboot/kexecboot_0.4.bb b/packages/kexecboot/kexecboot_0.4.bb
new file mode 100644 (file)
index 0000000..557c5be
--- /dev/null
@@ -0,0 +1,41 @@
+LICENSE = "GPL"
+PR = "r0"
+DEPENDS = "klibc"
+RDEPENDS = "kexec-static"
+
+inherit autotools
+
+# You can create your own *-img.h by doing
+# ./make-image-header.sh <file>.png HAND
+
+SRC_URI = "http://projects.linuxtogo.org/~jay7/kexecboot-${PV}.tar.gz \
+       file://add-reboot-option.patch;patch=1 \
+       file://scan_devices-top.patch;patch=1 \
+       file://graphical-no-devices.patch;patch=1 \
+       file://switch-cursor-off.patch;patch=1 \
+       file://add-sleep.patch;patch=1 \
+       file://silent-output-hack.patch;patch=1 \
+       "
+
+S = "${WORKDIR}/kexecboot-${PV}"
+
+export CC=${TARGET_PREFIX}klcc
+
+# standard oe cflags don't work with klcc
+export CFLAGS = ""
+export CPPFLAGS = ""
+export LDFLAGS = ""
+
+do_install () {
+       install -d ${D}${bindir}
+       install -m 0755 kexecboot ${D}${bindir}/
+
+       install -d ${D}/proc
+       install -d ${D}/mnt
+}
+
+FILES_${PN} += " ${bindir}/kexecboot /init /proc /mnt"
+
+pkg_postinst_${PN} () {
+       ln -sf ${bindir}/kexecboot $D/init
+}