diff mbox series

target/s390x/tcg: SPX: check validity of new prefix

Message ID 20220627131251.2832076-1-scgl@linux.ibm.com (mailing list archive)
State New, archived
Headers show
Series target/s390x/tcg: SPX: check validity of new prefix | expand

Commit Message

Janis Schoetterl-Glausch June 27, 2022, 1:12 p.m. UTC
According to the architecture, SET PREFIX must try to access the new
prefix area and recognize an addressing exception if the area is not
accessible.
For qemu this check prevents a crash in cpu_map_lowcore after an
inaccessible prefix area has been set.

Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
---


Is there a stricter check to see if the memory is accessible?


 target/s390x/tcg/misc_helper.c | 4 ++++
 1 file changed, 4 insertions(+)


base-commit: 3a821c52e1a30ecd9a436f2c67cc66b5628c829f

Comments

David Hildenbrand June 27, 2022, 4:27 p.m. UTC | #1
On 27.06.22 15:12, Janis Schoetterl-Glausch wrote:
> According to the architecture, SET PREFIX must try to access the new
> prefix area and recognize an addressing exception if the area is not
> accessible.
> For qemu this check prevents a crash in cpu_map_lowcore after an
> inaccessible prefix area has been set.

I don't think that's possible. Our memory increments are 1 MiB and one
would have to cross a 1~MiB range with the second page to trigger that.
IIRC that's impossible with SPX address alignment requirements?


> 
> Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
> ---
> 
> 
> Is there a stricter check to see if the memory is accessible?
> 
> 
>  target/s390x/tcg/misc_helper.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c
> index aab9c47747..c8447b36fc 100644
> --- a/target/s390x/tcg/misc_helper.c
> +++ b/target/s390x/tcg/misc_helper.c
> @@ -158,6 +158,10 @@ void HELPER(spx)(CPUS390XState *env, uint64_t a1)
>      if (prefix == old_prefix) {
>          return;
>      }
> +    if (!mmu_absolute_addr_valid(prefix, true) ||
> +        !mmu_absolute_addr_valid(prefix + TARGET_PAGE_SIZE, true)) {
> +        tcg_s390_program_interrupt(env, PGM_ADDRESSING, GETPC());
> +    }
>  
>      env->psa = prefix;
>      HELPER_LOG("prefix: %#x\n", prefix);
> 
> base-commit: 3a821c52e1a30ecd9a436f2c67cc66b5628c829f
Janis Schoetterl-Glausch June 27, 2022, 5:06 p.m. UTC | #2
On 6/27/22 18:27, David Hildenbrand wrote:
> On 27.06.22 15:12, Janis Schoetterl-Glausch wrote:
>> According to the architecture, SET PREFIX must try to access the new
>> prefix area and recognize an addressing exception if the area is not
>> accessible.
>> For qemu this check prevents a crash in cpu_map_lowcore after an
>> inaccessible prefix area has been set.
> 
> I don't think that's possible. Our memory increments are 1 MiB and one
> would have to cross a 1~MiB range with the second page to trigger that.
> IIRC that's impossible with SPX address alignment requirements?
> 
Are you saying that checking the first page is sufficient?
I'm not sure that this the case for the architecture in general,
but I guess it is true for tcg. Do you want me to remove the second check?
> 
>>
>> Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
>> ---
>>
>>
>> Is there a stricter check to see if the memory is accessible?
>>
>>
>>  target/s390x/tcg/misc_helper.c | 4 ++++
>>  1 file changed, 4 insertions(+)
>>
>> diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c
>> index aab9c47747..c8447b36fc 100644
>> --- a/target/s390x/tcg/misc_helper.c
>> +++ b/target/s390x/tcg/misc_helper.c
>> @@ -158,6 +158,10 @@ void HELPER(spx)(CPUS390XState *env, uint64_t a1)
>>      if (prefix == old_prefix) {
>>          return;
>>      }
>> +    if (!mmu_absolute_addr_valid(prefix, true) ||
>> +        !mmu_absolute_addr_valid(prefix + TARGET_PAGE_SIZE, true)) {
>> +        tcg_s390_program_interrupt(env, PGM_ADDRESSING, GETPC());
>> +    }
>>  
>>      env->psa = prefix;
>>      HELPER_LOG("prefix: %#x\n", prefix);
>>
>> base-commit: 3a821c52e1a30ecd9a436f2c67cc66b5628c829f
> 
>
David Hildenbrand June 27, 2022, 5:10 p.m. UTC | #3
On 27.06.22 19:06, Janis Schoetterl-Glausch wrote:
> On 6/27/22 18:27, David Hildenbrand wrote:
>> On 27.06.22 15:12, Janis Schoetterl-Glausch wrote:
>>> According to the architecture, SET PREFIX must try to access the new
>>> prefix area and recognize an addressing exception if the area is not
>>> accessible.
>>> For qemu this check prevents a crash in cpu_map_lowcore after an
>>> inaccessible prefix area has been set.
>>
>> I don't think that's possible. Our memory increments are 1 MiB and one
>> would have to cross a 1~MiB range with the second page to trigger that.
>> IIRC that's impossible with SPX address alignment requirements?
>>
> Are you saying that checking the first page is sufficient?

Yes, unless I'm wrong. :)

/* Due to alignment and QEMU memory sizes, it's sufficient to check the
first page only. */

> I'm not sure that this the case for the architecture in general,
> but I guess it is true for tcg. Do you want me to remove the second check?

Should have been clearer (and I somehow thought we'd be checking the
first page already :))

Reviewed-by: David Hildenbrand <david@redhat.com>
diff mbox series

Patch

diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c
index aab9c47747..c8447b36fc 100644
--- a/target/s390x/tcg/misc_helper.c
+++ b/target/s390x/tcg/misc_helper.c
@@ -158,6 +158,10 @@  void HELPER(spx)(CPUS390XState *env, uint64_t a1)
     if (prefix == old_prefix) {
         return;
     }
+    if (!mmu_absolute_addr_valid(prefix, true) ||
+        !mmu_absolute_addr_valid(prefix + TARGET_PAGE_SIZE, true)) {
+        tcg_s390_program_interrupt(env, PGM_ADDRESSING, GETPC());
+    }
 
     env->psa = prefix;
     HELPER_LOG("prefix: %#x\n", prefix);