All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] pc-bios: s390x: fix corner cases in booting from ECKD
@ 2020-09-24  8:59 Marc Hartmayer
  2020-09-24  8:59 ` [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error Marc Hartmayer
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Marc Hartmayer @ 2020-09-24  8:59 UTC (permalink / raw
  To: qemu-devel
  Cc: Janosch Frank, qemu-s390x, Thomas Huth, Collin L. Walling,
	David Hildenbrand

The first patch fixes the scan for the string "zIPL" (which is used to
detect the start of the boot menu banner) in
`find_zipl_boot_menu_banner`. The second patch fixes the bug of not
booting the default entry if no zipl boot menu data was found.

For everybody's convenience there is a branch:
https://gitlab.com/mhartmay/qemu/-/tree/bios_fixes

Marc Hartmayer (3):
  pc-bios/s390-ccw: fix off-by-one error
  pc-bios/s390-ccw: break loop if a null block number is reached
  pc-bios/s390-ccw: Update s390-ccw.img bios binary

 pc-bios/s390-ccw.img       | Bin 42608 -> 42608 bytes
 pc-bios/s390-ccw/bootmap.c |   4 ++--
 2 files changed, 2 insertions(+), 2 deletions(-)

-- 
2.25.4



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error
  2020-09-24  8:59 [PATCH 0/3] pc-bios: s390x: fix corner cases in booting from ECKD Marc Hartmayer
@ 2020-09-24  8:59 ` Marc Hartmayer
  2020-09-24 10:02   ` Philippe Mathieu-Daudé
  2020-09-24 11:43   ` Thomas Huth
  2020-09-24  8:59 ` [PATCH 2/3] pc-bios/s390-ccw: break loop if a null block number is reached Marc Hartmayer
  2020-09-24  8:59 ` [PATCH 3/3] pc-bios/s390-ccw: Update s390-ccw.img bios binary Marc Hartmayer
  2 siblings, 2 replies; 9+ messages in thread
From: Marc Hartmayer @ 2020-09-24  8:59 UTC (permalink / raw
  To: qemu-devel
  Cc: Janosch Frank, qemu-s390x, Thomas Huth, Collin L. Walling,
	David Hildenbrand

This error takes effect when the magic value "zIPL" is located at the
end of a block. For example if s2_cur_blk = 0x7fe18000 and the magic
value "zIPL" is located at 0x7fe18ffc - 0x7fe18fff.

Fixes: ba831b25262a ("s390-ccw: read stage2 boot loader data to find menu")
Reviewed-by: Collin Walling <walling@linux.ibm.com>
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
---
 pc-bios/s390-ccw/bootmap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 97205674e59a..0d29dceaa3cc 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -163,7 +163,7 @@ static bool find_zipl_boot_menu_banner(int *offset)
     int i;
 
     /* Menu banner starts with "zIPL" */
-    for (i = 0; i < virtio_get_block_size() - 4; i++) {
+    for (i = 0; i < virtio_get_block_size() - 3; i++) {
         if (magic_match(s2_cur_blk + i, ZIPL_MAGIC_EBCDIC)) {
             *offset = i;
             return true;
-- 
2.25.4



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] pc-bios/s390-ccw: break loop if a null block number is reached
  2020-09-24  8:59 [PATCH 0/3] pc-bios: s390x: fix corner cases in booting from ECKD Marc Hartmayer
  2020-09-24  8:59 ` [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error Marc Hartmayer
@ 2020-09-24  8:59 ` Marc Hartmayer
  2020-09-24 11:49   ` Thomas Huth
  2020-09-24  8:59 ` [PATCH 3/3] pc-bios/s390-ccw: Update s390-ccw.img bios binary Marc Hartmayer
  2 siblings, 1 reply; 9+ messages in thread
From: Marc Hartmayer @ 2020-09-24  8:59 UTC (permalink / raw
  To: qemu-devel
  Cc: Janosch Frank, qemu-s390x, Thomas Huth, Collin L. Walling,
	David Hildenbrand

Break the loop if `cur_block_nr` is a null block number because this
means that the end of chunk is reached. In this case we will try to
boot the default entry.

Fixes: ba831b25262a ("s390-ccw: read stage2 boot loader data to find menu")
Reviewed-by: Collin Walling <walling@linux.ibm.com>
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
---
 pc-bios/s390-ccw/bootmap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 0d29dceaa3cc..08f16c5595a3 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -192,7 +192,7 @@ static int eckd_get_boot_menu_index(block_number_t s1b_block_nr)
     for (i = 0; i < STAGE2_BLK_CNT_MAX; i++) {
         cur_block_nr = eckd_block_num(&s1b->seek[i].chs);
 
-        if (!cur_block_nr) {
+        if (!cur_block_nr || is_null_block_number(cur_block_nr)) {
             break;
         }
 
-- 
2.25.4



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] pc-bios/s390-ccw: Update s390-ccw.img bios binary
  2020-09-24  8:59 [PATCH 0/3] pc-bios: s390x: fix corner cases in booting from ECKD Marc Hartmayer
  2020-09-24  8:59 ` [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error Marc Hartmayer
  2020-09-24  8:59 ` [PATCH 2/3] pc-bios/s390-ccw: break loop if a null block number is reached Marc Hartmayer
@ 2020-09-24  8:59 ` Marc Hartmayer
  2 siblings, 0 replies; 9+ messages in thread
From: Marc Hartmayer @ 2020-09-24  8:59 UTC (permalink / raw
  To: qemu-devel
  Cc: Janosch Frank, qemu-s390x, Thomas Huth, Collin L. Walling,
	David Hildenbrand

Contains the fixes "pc-bios/s390-ccw: fix off-by-one error" and
"pc-bios/s390-ccw: break loop if a null block number is reached".

Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
---
 pc-bios/s390-ccw.img | Bin 42608 -> 42608 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img
index 3074686a8c7448d943aa62f810d88d3e92865ef3..d166774ece9e2a3cd1d89e02acfffb68b370a363 100644
GIT binary patch
literal 42608
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
SyB(yr^to9k!M`Rv@&5p-)+3Yv

literal 42608
zcmeHw3v^V~)&H4fNJ0p3^JGF0?vMxpOqhgMK#`d|G$@bZr9o;TBm;@&WisLAgNRW<
zYYkC+RKGe}=ml(bK-+>ZV(Zu1R$GeoQCllIpww8M02L6({r~np_f94OB!9l|?^^%0
zoV6zB-1FFHzs^4U>~rp9ZPAP?A|fmz^obNH$QuRGL8II$)2IBLIz^s{5l%5s48U^~
zzE)X}GWqF|TH0i>nWDE4k@y<@B4oAbnPLR_F;l{ezI}}Hb0ixHK0aou&;#`&T=Dtw
z>oR?&M;htm^2mlZS<n3lsq^$B(DX4=rjKYd>0>}bMD$2S26q#o)LQO6I0t3XMtN@&
z1^wotu`%Ac=(FTWfMzNzW2-8cj;$)6I6k|fHamxF2}TmWkyp-IAjG(s2i{nJgZ{T0
zo_Q<nMgQW4Yge3>Fj#)X8|EwiSo(?<)u^NLKC{L?_ul#sZ(4H8BR}ka%j0kT-KaZf
z0);T>j@%#CC@NksKT))9vn*#m4?uYwKU)p9%62JT<*IBhBASu0gvukEjB+tV+*Dat
zB|J;Za!VV^L{;s|vf6r&K-p5W38l~OH=g8pq5jVv>Q)}Y@7Z9t@(_N{9`9bR8jpUH
z00Vxg+|0;wi_d7k!*67a_T%=-=N)Z5%FEkpgAS3Qozxv|2Zb1zPJb`{UK_@na<WYo
z;`>qi1_obH#6D~A4~oKV7P|bw7us5cxc<17Dugyl#1!PTi2NLXtd=G$+DQHD-BvM%
z+m3DX39;ZG)Gi>9wW4*@9TAZ+NG-e9iG<xk#A|7~-qr+oe`=2x(?pzGX%f^s(XnT3
zlhC|kRNE3jd0DfG$fQ9wd$F=aY*2+|%OL$kN`ezl+9*IkkBD&z!_oe7Z4L0aO+;#5
z{Zpc1N?)oSaESg|UJ59LNx-4Ri5Bg05rG~p0SA@wI2(#pr6!;_s!^MV5fh6YON7m}
zWs-ivmbk%*ai{5eO49BokxpYX%wrh0*`k!F@;T#6;^6h=#STT-61Tu&YD4pKwPtZ&
z`#9kc{k5T!TR0bovOU^Rdo<D)nd?^v96_JRFu2}_xb9MeK9>@Fr41-fxk8&RVo<xy
zCjt(T*0N6ocl(s~66BlO7l_M5oYq$i1a=N>jIg*C1h=`y1-I=Jif{}3wKxQ%6ro+I
ze@L8}{2_B@ktwkO*HG!S@m%U=+A_c+9X$FN+_1PE_9jp@)akG{BOQYDF5=q!FG?JW
z4Ylh7szRJ2S#^_?<gk=iKy}oJjST%d?WkTxxrE7We!zJFnA8Ux$Xc~a_3_Z0H=rv+
zTrLN&cY+E-$4=}S#=4QmeTQk;ka)9DO$pdnP`O%5auGkIe7{nrcP-`n2k5W(mDzgI
zBw%rv>nC&lTLFbI2q=n`{@&DrIdWA0C+TsU16&(IS|0#TqQy4f<!TWx&vBBbCL7ot
z)h0vcqeK%yi=TnM&k*#yqx5X~o(U)K^x5I)51VidT~%0DheB@6B1#)d^3d-LsDvYP
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
M*2pCE*Bnp$A1vB}761SM

-- 
2.25.4



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error
  2020-09-24  8:59 ` [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error Marc Hartmayer
@ 2020-09-24 10:02   ` Philippe Mathieu-Daudé
  2020-09-24 14:09     ` Marc Hartmayer
  2020-09-24 11:43   ` Thomas Huth
  1 sibling, 1 reply; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-24 10:02 UTC (permalink / raw
  To: Marc Hartmayer, qemu-devel
  Cc: Thomas Huth, qemu-s390x, Janosch Frank, Collin L. Walling,
	David Hildenbrand

Hi Marc,

On 9/24/20 10:59 AM, Marc Hartmayer wrote:
> This error takes effect when the magic value "zIPL" is located at the
> end of a block. For example if s2_cur_blk = 0x7fe18000 and the magic
> value "zIPL" is located at 0x7fe18ffc - 0x7fe18fff.
> 
> Fixes: ba831b25262a ("s390-ccw: read stage2 boot loader data to find menu")
> Reviewed-by: Collin Walling <walling@linux.ibm.com>
> Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
> ---
>  pc-bios/s390-ccw/bootmap.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
> index 97205674e59a..0d29dceaa3cc 100644
> --- a/pc-bios/s390-ccw/bootmap.c
> +++ b/pc-bios/s390-ccw/bootmap.c
> @@ -163,7 +163,7 @@ static bool find_zipl_boot_menu_banner(int *offset)
>      int i;
>  
>      /* Menu banner starts with "zIPL" */
> -    for (i = 0; i < virtio_get_block_size() - 4; i++) {
> +    for (i = 0; i < virtio_get_block_size() - 3; i++) {

Easier to review as:

       for (i = 0; i <= virtio_get_block_size() - 4; i++) {

Even easier defining ZIPL_MAGIC_SIZE instead of the magic '4'.

>          if (magic_match(s2_cur_blk + i, ZIPL_MAGIC_EBCDIC)) {
>              *offset = i;
>              return true;
> 



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error
  2020-09-24  8:59 ` [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error Marc Hartmayer
  2020-09-24 10:02   ` Philippe Mathieu-Daudé
@ 2020-09-24 11:43   ` Thomas Huth
  1 sibling, 0 replies; 9+ messages in thread
From: Thomas Huth @ 2020-09-24 11:43 UTC (permalink / raw
  To: Marc Hartmayer, qemu-devel
  Cc: qemu-s390x, Janosch Frank, Collin L. Walling, David Hildenbrand

On 24/09/2020 10.59, Marc Hartmayer wrote:
> This error takes effect when the magic value "zIPL" is located at the
> end of a block. For example if s2_cur_blk = 0x7fe18000 and the magic
> value "zIPL" is located at 0x7fe18ffc - 0x7fe18fff.
> 
> Fixes: ba831b25262a ("s390-ccw: read stage2 boot loader data to find menu")
> Reviewed-by: Collin Walling <walling@linux.ibm.com>
> Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
> ---
>  pc-bios/s390-ccw/bootmap.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
> index 97205674e59a..0d29dceaa3cc 100644
> --- a/pc-bios/s390-ccw/bootmap.c
> +++ b/pc-bios/s390-ccw/bootmap.c
> @@ -163,7 +163,7 @@ static bool find_zipl_boot_menu_banner(int *offset)
>      int i;
>  
>      /* Menu banner starts with "zIPL" */
> -    for (i = 0; i < virtio_get_block_size() - 4; i++) {
> +    for (i = 0; i < virtio_get_block_size() - 3; i++) {
>          if (magic_match(s2_cur_blk + i, ZIPL_MAGIC_EBCDIC)) {
>              *offset = i;
>              return true;

I agree with Philippe, i <= virtio_get_block_size() - 4 would be a
little bit nicer. Anyway:

Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] pc-bios/s390-ccw: break loop if a null block number is reached
  2020-09-24  8:59 ` [PATCH 2/3] pc-bios/s390-ccw: break loop if a null block number is reached Marc Hartmayer
@ 2020-09-24 11:49   ` Thomas Huth
  2020-09-24 14:10     ` Marc Hartmayer
  0 siblings, 1 reply; 9+ messages in thread
From: Thomas Huth @ 2020-09-24 11:49 UTC (permalink / raw
  To: Marc Hartmayer, qemu-devel
  Cc: qemu-s390x, Janosch Frank, Collin L. Walling, David Hildenbrand

On 24/09/2020 10.59, Marc Hartmayer wrote:
> Break the loop if `cur_block_nr` is a null block number because this
> means that the end of chunk is reached. In this case we will try to
> boot the default entry.
> 
> Fixes: ba831b25262a ("s390-ccw: read stage2 boot loader data to find menu")
> Reviewed-by: Collin Walling <walling@linux.ibm.com>
> Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
> ---
>  pc-bios/s390-ccw/bootmap.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
> index 0d29dceaa3cc..08f16c5595a3 100644
> --- a/pc-bios/s390-ccw/bootmap.c
> +++ b/pc-bios/s390-ccw/bootmap.c
> @@ -192,7 +192,7 @@ static int eckd_get_boot_menu_index(block_number_t s1b_block_nr)
>      for (i = 0; i < STAGE2_BLK_CNT_MAX; i++) {
>          cur_block_nr = eckd_block_num(&s1b->seek[i].chs);
>  
> -        if (!cur_block_nr) {
> +        if (!cur_block_nr || is_null_block_number(cur_block_nr)) {
>              break;
>          }

Reviewed-by: Thomas Huth <thuth@redhat.com>

I'll queue the two patches on my s390-ccw bios branch. Just let me know
if you'd like to have the "< ... - 3" changed into "<= ... - 4" in the
first patch, I can tweak it directly if you like.

 Thomas



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error
  2020-09-24 10:02   ` Philippe Mathieu-Daudé
@ 2020-09-24 14:09     ` Marc Hartmayer
  0 siblings, 0 replies; 9+ messages in thread
From: Marc Hartmayer @ 2020-09-24 14:09 UTC (permalink / raw
  To: Philippe Mathieu-Daudé, Marc Hartmayer, qemu-devel
  Cc: Thomas Huth, qemu-s390x, Janosch Frank, Collin L. Walling,
	David Hildenbrand

On Thu, Sep 24, 2020 at 12:02 PM +0200, Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> Hi Marc,
>
> On 9/24/20 10:59 AM, Marc Hartmayer wrote:
>> This error takes effect when the magic value "zIPL" is located at the
>> end of a block. For example if s2_cur_blk = 0x7fe18000 and the magic
>> value "zIPL" is located at 0x7fe18ffc - 0x7fe18fff.
>> 
>> Fixes: ba831b25262a ("s390-ccw: read stage2 boot loader data to find menu")
>> Reviewed-by: Collin Walling <walling@linux.ibm.com>
>> Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
>> ---
>>  pc-bios/s390-ccw/bootmap.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
>> index 97205674e59a..0d29dceaa3cc 100644
>> --- a/pc-bios/s390-ccw/bootmap.c
>> +++ b/pc-bios/s390-ccw/bootmap.c
>> @@ -163,7 +163,7 @@ static bool find_zipl_boot_menu_banner(int *offset)
>>      int i;
>>  
>>      /* Menu banner starts with "zIPL" */
>> -    for (i = 0; i < virtio_get_block_size() - 4; i++) {
>> +    for (i = 0; i < virtio_get_block_size() - 3; i++) {
>
> Easier to review as:
>
>        for (i = 0; i <= virtio_get_block_size() - 4; i++) {

Yep.

>
> Even easier defining ZIPL_MAGIC_SIZE instead of the magic '4'.

I thought about adding such a macro as well. Makes even more sense with
your proposed change.

>
>>          if (magic_match(s2_cur_blk + i, ZIPL_MAGIC_EBCDIC)) {
>>              *offset = i;
>>              return true;
>> 
>
-- 
Kind regards / Beste Grüße
   Marc Hartmayer

IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Gregor Pillen 
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] pc-bios/s390-ccw: break loop if a null block number is reached
  2020-09-24 11:49   ` Thomas Huth
@ 2020-09-24 14:10     ` Marc Hartmayer
  0 siblings, 0 replies; 9+ messages in thread
From: Marc Hartmayer @ 2020-09-24 14:10 UTC (permalink / raw
  To: Thomas Huth, Marc Hartmayer, qemu-devel
  Cc: qemu-s390x, Janosch Frank, Collin L. Walling, David Hildenbrand

On Thu, Sep 24, 2020 at 01:49 PM +0200, Thomas Huth <thuth@redhat.com> wrote:
> On 24/09/2020 10.59, Marc Hartmayer wrote:
>> Break the loop if `cur_block_nr` is a null block number because this
>> means that the end of chunk is reached. In this case we will try to
>> boot the default entry.
>> 
>> Fixes: ba831b25262a ("s390-ccw: read stage2 boot loader data to find menu")
>> Reviewed-by: Collin Walling <walling@linux.ibm.com>
>> Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
>> ---
>>  pc-bios/s390-ccw/bootmap.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
>> index 0d29dceaa3cc..08f16c5595a3 100644
>> --- a/pc-bios/s390-ccw/bootmap.c
>> +++ b/pc-bios/s390-ccw/bootmap.c
>> @@ -192,7 +192,7 @@ static int eckd_get_boot_menu_index(block_number_t s1b_block_nr)
>>      for (i = 0; i < STAGE2_BLK_CNT_MAX; i++) {
>>          cur_block_nr = eckd_block_num(&s1b->seek[i].chs);
>>  
>> -        if (!cur_block_nr) {
>> +        if (!cur_block_nr || is_null_block_number(cur_block_nr)) {
>>              break;
>>          }
>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
>
> I'll queue the two patches on my s390-ccw bios branch. Just let me know
> if you'd like to have the "< ... - 3" changed into "<= ... - 4" in the
> first patch, I can tweak it directly if you like.

Yes, please change it to <= … - 4. Thanks!

>
>  Thomas
>
-- 
Kind regards / Beste Grüße
   Marc Hartmayer

IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Gregor Pillen 
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-09-24 14:12 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-09-24  8:59 [PATCH 0/3] pc-bios: s390x: fix corner cases in booting from ECKD Marc Hartmayer
2020-09-24  8:59 ` [PATCH 1/3] pc-bios/s390-ccw: fix off-by-one error Marc Hartmayer
2020-09-24 10:02   ` Philippe Mathieu-Daudé
2020-09-24 14:09     ` Marc Hartmayer
2020-09-24 11:43   ` Thomas Huth
2020-09-24  8:59 ` [PATCH 2/3] pc-bios/s390-ccw: break loop if a null block number is reached Marc Hartmayer
2020-09-24 11:49   ` Thomas Huth
2020-09-24 14:10     ` Marc Hartmayer
2020-09-24  8:59 ` [PATCH 3/3] pc-bios/s390-ccw: Update s390-ccw.img bios binary Marc Hartmayer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.