Patchwork [v2,4/5] S390: BIOS boot from given device

login
register
mail settings
Submitter Dominik Dingel
Date April 29, 2013, 2:52 p.m.
Message ID <1367247128-22409-5-git-send-email-dingel@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/240387/
State New
Headers show

Comments

Dominik Dingel - April 29, 2013, 2:52 p.m.
Use the passed device, if there is no device, use the first applicable device.

Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
Alexander Graf - April 30, 2013, 10:23 a.m.
On 29.04.2013, at 16:52, Dominik Dingel wrote:

> Use the passed device, if there is no device, use the first applicable device.
> 
> Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
> 
> diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
> index fd40fa5..206979f 100644
> --- a/pc-bios/s390-ccw/main.c
> +++ b/pc-bios/s390-ccw/main.c
> @@ -12,6 +12,7 @@
> 
> struct subchannel_id blk_schid;
> char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
> +uint64_t boot_value;
> 
> void virtio_panic(const char *string)
> {
> @@ -20,15 +21,20 @@ void virtio_panic(const char *string)
>     while (1) { }
> }
> 
> -static void virtio_setup(void)
> +static void virtio_setup(uint64_t dev_info)
> {
>     struct schib schib;
>     int i;
>     int r;
>     bool found = false;
> -
> +    uint16_t dev_no;
>     blk_schid.one = 1;
> 
> +    if (dev_info != -1) {
> +        dev_no = dev_info & 0xffff; 
> +        debug_print_int("device no. ", dev_no);

It'd be nice if you could make this a bit more obvious.

bool check_devno = false

if (dev_info != -1) {
    check_devno = true;
    ...
}

> +    }
> +
>     for (i = 0; i < 0x10000; i++) {
>         blk_schid.sch_no = i;
>         r = stsch_err(blk_schid, &schib);
> @@ -36,9 +42,14 @@ static void virtio_setup(void)
>             break;
>         }
>         if (schib.pmcw.dnv) {
> -            if (virtio_is_blk(blk_schid)) {
> -                found = true;
> -                break;
> +            if (dev_info != -1 && schib.pmcw.dev != dev_no) {

if (check_devno && ...)

> +                continue;
> +            }
> +            else {

} else {

But really in this case there's no need for that either, since the branch will have continue'd anyway. Just close the branch.

> +                if (virtio_is_blk(blk_schid)) {
> +                    found = true;
> +                    break;
> +                }
>             }
>         }
>     }
> @@ -53,7 +64,9 @@ static void virtio_setup(void)
> int main(void)
> {
>     sclp_setup();
> -    virtio_setup();
> +    debug_print_int("boot reg[7]\n", boot_value);

\n?


Alex

> +    virtio_setup(boot_value);
> +    
>     if (zipl_load() < 0)
>         sclp_print("Failed to load OS from hard disk\n");
>     disabled_wait();
> diff --git a/pc-bios/s390-ccw/start.S b/pc-bios/s390-ccw/start.S
> index 09deee7..5d5df0d 100644
> --- a/pc-bios/s390-ccw/start.S
> +++ b/pc-bios/s390-ccw/start.S
> @@ -14,6 +14,8 @@
> _start:
> 
> larl	%r15, stack + 0x8000    /* Set up stack */
> +larl    %r6, boot_value
> +stg     %r7, 0(%r6)     /* save the boot_value before any function calls */
> j	main                    /* And call C */
> 
> /*
> -- 
> 1.7.9.5
>

Patch

diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index fd40fa5..206979f 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -12,6 +12,7 @@ 
 
 struct subchannel_id blk_schid;
 char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
+uint64_t boot_value;
 
 void virtio_panic(const char *string)
 {
@@ -20,15 +21,20 @@  void virtio_panic(const char *string)
     while (1) { }
 }
 
-static void virtio_setup(void)
+static void virtio_setup(uint64_t dev_info)
 {
     struct schib schib;
     int i;
     int r;
     bool found = false;
-
+    uint16_t dev_no;
     blk_schid.one = 1;
 
+    if (dev_info != -1) {
+        dev_no = dev_info & 0xffff; 
+        debug_print_int("device no. ", dev_no);
+    }
+
     for (i = 0; i < 0x10000; i++) {
         blk_schid.sch_no = i;
         r = stsch_err(blk_schid, &schib);
@@ -36,9 +42,14 @@  static void virtio_setup(void)
             break;
         }
         if (schib.pmcw.dnv) {
-            if (virtio_is_blk(blk_schid)) {
-                found = true;
-                break;
+            if (dev_info != -1 && schib.pmcw.dev != dev_no) {
+                continue;
+            }
+            else {
+                if (virtio_is_blk(blk_schid)) {
+                    found = true;
+                    break;
+                }
             }
         }
     }
@@ -53,7 +64,9 @@  static void virtio_setup(void)
 int main(void)
 {
     sclp_setup();
-    virtio_setup();
+    debug_print_int("boot reg[7]\n", boot_value);
+    virtio_setup(boot_value);
+    
     if (zipl_load() < 0)
         sclp_print("Failed to load OS from hard disk\n");
     disabled_wait();
diff --git a/pc-bios/s390-ccw/start.S b/pc-bios/s390-ccw/start.S
index 09deee7..5d5df0d 100644
--- a/pc-bios/s390-ccw/start.S
+++ b/pc-bios/s390-ccw/start.S
@@ -14,6 +14,8 @@ 
 _start:
 
 larl	%r15, stack + 0x8000    /* Set up stack */
+larl    %r6, boot_value
+stg     %r7, 0(%r6)     /* save the boot_value before any function calls */
 j	main                    /* And call C */
 
 /*