From: Christian Borntraeger <borntraeger@de.ibm.com>
To: jjherne@linux.ibm.com, qemu-devel@nongnu.org,
qemu-s390x@nongnu.org, cohuck@redhat.com
Subject: Re: [PATCH] pc-bios/s390x: Pack ResetInfo struct
Date: Thu, 13 Feb 2020 19:24:08 +0100 [thread overview]
Message-ID: <941cc201-4c33-0ad3-ecc8-eab2709d350d@de.ibm.com> (raw)
In-Reply-To: <bf3f44b5-f0fe-59f4-9152-54edd8c9822e@linux.ibm.com>
On 13.02.20 19:02, Jason J. Herne wrote:
> On 2/6/20 5:09 AM, Christian Borntraeger wrote:
>>
>>
>> On 05.02.20 19:21, Jason J. Herne wrote:
>>> This fixes vfio-ccw when booting non-Linux operating systems. Without this
>>> struct being packed, a few extra bytes of low core memory get overwritten when
>>> we assign a value to memory address 0 in jump_to_IPL_2. This is enough to
>>> cause some non-Linux OSes of fail when booting.
>>>
>>> The problem was introduced by:
>>> 5c6f0d5f46a77d77 "pc-bios/s390x: Fix reset psw mask".
>>>
>>> The fix is to pack the struct thereby removing the 4 bytes of padding that get
>>> added at the end, likely to allow an array of these structs to naturally align
>>> on an 8-byte boundary.
>>>
>>> Fixes: 5c6f0d5f46a7 ("pc-bios/s390x: Fix reset psw mask")
>>> CC: Janosch Frank <frankja@linux.ibm.com>
>>> Signed-off-by: Jason J. Herne <jjherne@linux.ibm.com>
>>> ---
>>> pc-bios/s390-ccw/jump2ipl.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c
>>> index da13c43cc0..1e9eaa037f 100644
>>> --- a/pc-bios/s390-ccw/jump2ipl.c
>>> +++ b/pc-bios/s390-ccw/jump2ipl.c
>>> @@ -18,7 +18,7 @@
>>> typedef struct ResetInfo {
>>> uint64_t ipl_psw;
>>> uint32_t ipl_continue;
>>> -} ResetInfo;
>>> +} __attribute__((packed)) ResetInfo;
>>> static ResetInfo save;
>>
>> Just looked into that.
>>
>> We do save the old content in "save" and restore the old memory content.
>>
>> static void jump_to_IPL_2(void)
>> {
>> ResetInfo *current = 0;
>>
>> void (*ipl)(void) = (void *) (uint64_t) current->ipl_continue;
>> --->*current = save;
>> ipl(); /* should not return */
>> }
>>
>> void jump_to_IPL_code(uint64_t address)
>> {
>> /* store the subsystem information _after_ the bootmap was loaded */
>> write_subsystem_identification();
>>
>> /* prevent unknown IPL types in the guest */
>> if (iplb.pbt == S390_IPL_TYPE_QEMU_SCSI) {
>> iplb.pbt = S390_IPL_TYPE_CCW;
>> set_iplb(&iplb);
>> }
>>
>> /*
>> * The IPL PSW is at address 0. We also must not overwrite the
>> * content of non-BIOS memory after we loaded the guest, so we
>> * save the original content and restore it in jump_to_IPL_2.
>> */
>> ResetInfo *current = 0;
>>
>> --->save = *current;
>>
>>
>>
>> does something like
>>
>>
>> diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c
>> index da13c43cc0..8839226803 100644
>> --- a/pc-bios/s390-ccw/jump2ipl.c
>> +++ b/pc-bios/s390-ccw/jump2ipl.c
>> @@ -18,6 +18,7 @@
>> typedef struct ResetInfo {
>> uint64_t ipl_psw;
>> uint32_t ipl_continue;
>> + uint32_t pad;
>> } ResetInfo;
>> static ResetInfo save;
>>
>>
>> also work? If yes, both variants are valid. Either packed or explicit padding.
>>
>
> I don't believe this will work. I think the problem is that we're overwriting too much memory when we cast address 0 as a ResetInfo and then overwrite it (*current = save). I think we need the struct to be sized at 12-bytes instead of 16.
>
The idea of the code is that we _save_ the original content from address 0 to save and _restore_ it before jumping into final code. I do not yet understand why this does not work.
next prev parent reply other threads:[~2020-02-13 18:34 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-05 18:21 [PATCH] pc-bios/s390x: Pack ResetInfo struct Jason J. Herne
2020-02-06 9:55 ` Cornelia Huck
2020-02-06 10:09 ` Christian Borntraeger
2020-02-06 11:00 ` Thomas Huth
2020-02-07 11:28 ` Christian Borntraeger
2020-02-07 14:02 ` Jason J. Herne
2020-08-27 10:07 ` Thomas Huth
2020-09-01 13:02 ` Jason J. Herne
2020-02-13 18:02 ` Jason J. Herne
2020-02-13 18:24 ` Christian Borntraeger [this message]
2020-02-25 10:23 ` Jason J. Herne
2020-02-25 11:13 ` Christian Borntraeger
2020-02-25 12:58 ` Jason J. Herne
2020-02-25 15:00 ` Christian Borntraeger
2020-02-25 15:05 ` Christian Borntraeger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=941cc201-4c33-0ad3-ecc8-eab2709d350d@de.ibm.com \
--to=borntraeger@de.ibm.com \
--cc=cohuck@redhat.com \
--cc=jjherne@linux.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.