Patchwork Patch from IBM

login
register
mail settings
Submitter Roman Rakus
Date April 14, 2008, 1:06 p.m.
Message ID <480356BC.70906@redhat.com>
Download mbox | patch
Permalink /patch/22967/
State Superseded
Headers show

Comments

Roman Rakus - April 14, 2008, 1:06 p.m.
Hi.
I have bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=439116
with patch (see attach).
Is this patch acceptable?
Is there any other necessary things that I forgot?
David Woodhouse - April 14, 2008, 1:40 p.m.
On Mon, 2008-04-14 at 15:06 +0200, Roman Rakus wrote:
> Hi.
> I have bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=439116
> with patch (see attach).
> Is this patch acceptable?
> Is there any other necessary things that I forgot?

Isn't this already in git?
Paul Nasrat - April 15, 2008, 6:44 a.m.
On 14 Apr 2008, at 14:40, David Woodhouse wrote:
> On Mon, 2008-04-14 at 15:06 +0200, Roman Rakus wrote:
>> Hi.
>> I have bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=439116
>> with patch (see attach).
>> Is this patch acceptable?
>> Is there any other necessary things that I forgot?
>
> Isn't this already in git?

Yes although the guarded check of ibm,client-architecture-support- 
reboots wasn't

I've commited Mikes patch for that now and pushed.

Pajul

Patch

diff -ur yaboot-1.3.13.orig/include/prom.h yaboot-1.3.13/include/prom.h
--- yaboot-1.3.13.orig/include/prom.h	2008-03-17 15:37:57.000000000 -0500
+++ yaboot-1.3.13/include/prom.h	2008-03-18 15:41:58.000000000 -0500
@@ -36,6 +36,8 @@ 
 #define PROM_INVALID_HANDLE	((prom_handle)-1UL)
 #define BOOTDEVSZ		 (2048) /* iscsi args can be in excess of 1040 bytes */
 #define TOK_ISCSI		 "iscsi"
+#define BOOTLASTSZ             1024
+#define FW_NBR_REBOOTSZ                4
 
 struct prom_args;
 typedef int (*prom_entry)(struct prom_args *);
@@ -93,6 +95,7 @@ 
 prom_handle prom_finddevice (char *name);
 prom_handle prom_findpackage (char *path);
 int prom_getprop (prom_handle dev, char *name, void *buf, int len);
+int prom_setprop (prom_handle dev, char *name, void *buf, int len);
 int prom_get_devtype (char *device);
 
 /* misc */
@@ -108,6 +111,7 @@ 
 
 int prom_get_chosen (char *name, void *mem, int len);
 int prom_get_options (char *name, void *mem, int len);
+int prom_set_options (char *name, void *mem, int len);
 
 extern int prom_getms(void);
 extern void prom_pause(void);
Only in yaboot-1.3.13/include: prom.h.orig
Only in yaboot-1.3.13/include: prom.h.rej
Only in yaboot-1.3.13/second: addnote
diff -ur yaboot-1.3.13.orig/second/prom.c yaboot-1.3.13/second/prom.c
--- yaboot-1.3.13.orig/second/prom.c	2008-03-17 15:37:57.000000000 -0500
+++ yaboot-1.3.13/second/prom.c	2008-03-18 15:43:31.000000000 -0500
@@ -154,6 +154,13 @@ 
 }
 
 int
+prom_setprop (prom_handle pack, char *name, void *mem, int len)
+{
+     return (int)call_prom ("setprop", 4, 1, pack, name, mem, len);
+}
+
+
+int
 prom_get_chosen (char *name, void *mem, int len)
 {
      return prom_getprop (prom_chosen, name, mem, len);
@@ -168,6 +175,15 @@ 
 }
 
 int
+prom_set_options (char *name, void *mem, int len)
+{
+     if (prom_options == (void *)-1)
+          return -1;
+     return prom_setprop (prom_options, name, mem, len);
+}
+
+
+int
 prom_get_devtype (char *device)
 {
      phandle    dev;
diff -ur yaboot-1.3.13.orig/second/yaboot.c yaboot-1.3.13/second/yaboot.c
--- yaboot-1.3.13.orig/second/yaboot.c	2008-03-17 15:37:57.000000000 -0500
+++ yaboot-1.3.13/second/yaboot.c	2008-03-18 15:54:21.000000000 -0500
@@ -113,6 +113,9 @@ 
 int useconf = 0;
 char bootdevice[BOOTDEVSZ];
 char bootargs[1024];
+char bootlastlabel[BOOTLASTSZ] = {0};
+char fw_nbr_reboots[FW_NBR_REBOOTSZ] = {0};
+long  fw_reboot_cnt = 0;
 char *password = NULL;
 struct boot_fspec_t boot;
 int _machine = _MACH_Pmac;
@@ -595,7 +598,7 @@ 
     
      cmdinit();
 
-     if (first) {
+     if (first && !fw_reboot_cnt) {
 	  first = 0;
 	  imagename = bootargs;
 	  word_split(&imagename, &params->args);
@@ -610,6 +613,13 @@ 
 	       timeout = simple_strtol(q, NULL, 0);
      }
 
+     /* If this is a reboot due to FW detecting CAS changes then 
+      * set timeout to 1.  The last kernel booted will be booted 
+      * again automatically.  It should seem seamless to the user
+     */
+     if (fw_reboot_cnt) 
+          timeout = 1;
+
      prom_printf("boot: ");
      c = -1;
      if (timeout != -1) {
@@ -644,6 +654,9 @@ 
 
      if (c == '\n' || c == '\r') {
 	  if (!imagename)
+             if (bootlastlabel[0] != 0)
+                imagename = bootlastlabel;
+             else
 	       imagename = cfg_get_default();
 	  if (imagename)
 	       prom_printf("%s", imagename);
@@ -663,6 +676,9 @@ 
      if ( useconf && (!imagename || imagename[0] == 0 ))
 	  imagename = cfg_get_default();
 
+     /* write the imagename out so it can be reused on reboot if necessary */
+     prom_set_options("boot-last-label", imagename, strlen(imagename));
+
      label = 0;
      defdevice = boot.dev;
 
@@ -1447,6 +1463,7 @@ 
 yaboot_main(void)
 {
      char *ptype;
+     char *endp;
      int conf_given = 0;
      char conf_path[1024];
 
@@ -1457,6 +1474,13 @@ 
      DEBUG_F("/chosen/bootargs = %s\n", bootargs);
      prom_get_chosen("bootpath", bootdevice, BOOTDEVSZ);
      DEBUG_F("/chosen/bootpath = %s\n", bootdevice);
+     if (prom_get_options("ibm,client-architecture-support-reboot",fw_nbr_reboots, FW_NBR_REBOOTSZ) == -1 )
+        if (prom_get_options("ibm,fw-nbr-reboots",fw_nbr_reboots, FW_NBR_REBOOTSZ) == -1 ) 
+           fw_nbr_reboots[0] = NULL;
+        
+     fw_reboot_cnt = simple_strtol(fw_nbr_reboots,&endp,10);
+     if (fw_reboot_cnt > 0L)
+          prom_get_options("boot-last-label", bootlastlabel, BOOTLASTSZ);
 
      /* If conf= specified on command line, it overrides */
      if (!strncmp(bootargs, "conf=", 5)) {