Instructions are always fetched from primary address space, except when
in home address mode. Perform the selection directly in cpu_mmu_index().
get_mem_index() is only used to perform data access, instructions are
fetched via cpu_lduw_code(), which translates to cpu_mmu_index(env, true).
We don't care about restricting the access permissions of the TLB
entries anymore, as we no longer enter PRIMARY entries into the
SECONDARY MMU. Cleanup related code a bit.
Signed-off-by: David Hildenbrand <david@redhat.com>
---
target/s390x/cpu.h | 7 +++++++
target/s390x/mmu_helper.c | 35 ++++++++++++++---------------------
2 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index a606547b4d..c34992bb2e 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -332,6 +332,13 @@ static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
return MMU_REAL_IDX;
}
+ if (ifetch) {
+ if ((env->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) {
+ return MMU_HOME_IDX;
+ }
+ return MMU_PRIMARY_IDX;
+ }
+
switch (env->psw.mask & PSW_MASK_ASC) {
case PSW_ASC_PRIMARY:
return MMU_PRIMARY_IDX;
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
index 6e9c4d6151..2c9bb3acc0 100644
--- a/target/s390x/mmu_helper.c
+++ b/target/s390x/mmu_helper.c
@@ -349,6 +349,7 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
{
static S390SKeysState *ss;
static S390SKeysClass *skeyclass;
+ uint64_t asce;
int r = -1;
uint8_t key;
@@ -381,35 +382,21 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
if (!(env->psw.mask & PSW_MASK_DAT)) {
*raddr = vaddr;
r = 0;
- goto out;
+ goto nodat;
}
switch (asc) {
case PSW_ASC_PRIMARY:
PTE_DPRINTF("%s: asc=primary\n", __func__);
- r = mmu_translate_asce(env, vaddr, asc, env->cregs[1], raddr, flags,
- rw, exc);
+ asce = env->cregs[1];
break;
case PSW_ASC_HOME:
PTE_DPRINTF("%s: asc=home\n", __func__);
- r = mmu_translate_asce(env, vaddr, asc, env->cregs[13], raddr, flags,
- rw, exc);
+ asce = env->cregs[13];
break;
case PSW_ASC_SECONDARY:
PTE_DPRINTF("%s: asc=secondary\n", __func__);
- /*
- * Instruction: Primary
- * Data: Secondary
- */
- if (rw == MMU_INST_FETCH) {
- r = mmu_translate_asce(env, vaddr, PSW_ASC_PRIMARY, env->cregs[1],
- raddr, flags, rw, exc);
- *flags &= ~(PAGE_READ | PAGE_WRITE);
- } else {
- r = mmu_translate_asce(env, vaddr, PSW_ASC_SECONDARY, env->cregs[7],
- raddr, flags, rw, exc);
- *flags &= ~(PAGE_EXEC);
- }
+ asce = env->cregs[7];
break;
case PSW_ASC_ACCREG:
default:
@@ -417,11 +404,17 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
break;
}
- out:
+ /* perform the DAT translation */
+ r = mmu_translate_asce(env, vaddr, asc, asce, raddr, flags, rw, exc);
+ if (r) {
+ return r;
+ }
+
+nodat:
/* Convert real address -> absolute address */
*raddr = mmu_real2abs(env, *raddr);
- if (r == 0 && *raddr < ram_size) {
+ if (*raddr < ram_size) {
if (skeyclass->get_skeys(ss, *raddr / TARGET_PAGE_SIZE, 1, &key)) {
trace_get_skeys_nonzero(r);
return 0;
@@ -441,7 +434,7 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
}
}
- return r;
+ return 0;
}
/**
--
2.21.0
On Mon, 12 Aug 2019 13:27:33 +0200 David Hildenbrand <david@redhat.com> wrote: > Instructions are always fetched from primary address space, except when > in home address mode. Perform the selection directly in cpu_mmu_index(). > > get_mem_index() is only used to perform data access, instructions are > fetched via cpu_lduw_code(), which translates to cpu_mmu_index(env, true). > > We don't care about restricting the access permissions of the TLB > entries anymore, as we no longer enter PRIMARY entries into the > SECONDARY MMU. Cleanup related code a bit. > > Signed-off-by: David Hildenbrand <david@redhat.com> > --- > target/s390x/cpu.h | 7 +++++++ > target/s390x/mmu_helper.c | 35 ++++++++++++++--------------------- > 2 files changed, 21 insertions(+), 21 deletions(-) Looks sane to me; will wait for v2 to give a tag.
On 12.08.19 13:27, David Hildenbrand wrote:
> Instructions are always fetched from primary address space, except when
> in home address mode. Perform the selection directly in cpu_mmu_index().
>
> get_mem_index() is only used to perform data access, instructions are
> fetched via cpu_lduw_code(), which translates to cpu_mmu_index(env, true).
>
> We don't care about restricting the access permissions of the TLB
> entries anymore, as we no longer enter PRIMARY entries into the
> SECONDARY MMU. Cleanup related code a bit.
>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
> target/s390x/cpu.h | 7 +++++++
> target/s390x/mmu_helper.c | 35 ++++++++++++++---------------------
> 2 files changed, 21 insertions(+), 21 deletions(-)
>
> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> index a606547b4d..c34992bb2e 100644
> --- a/target/s390x/cpu.h
> +++ b/target/s390x/cpu.h
> @@ -332,6 +332,13 @@ static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
> return MMU_REAL_IDX;
> }
>
> + if (ifetch) {
> + if ((env->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) {
> + return MMU_HOME_IDX;
> + }
> + return MMU_PRIMARY_IDX;
> + }
> +
> switch (env->psw.mask & PSW_MASK_ASC) {
> case PSW_ASC_PRIMARY:
> return MMU_PRIMARY_IDX;
> diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
> index 6e9c4d6151..2c9bb3acc0 100644
> --- a/target/s390x/mmu_helper.c
> +++ b/target/s390x/mmu_helper.c
> @@ -349,6 +349,7 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
> {
> static S390SKeysState *ss;
> static S390SKeysClass *skeyclass;
> + uint64_t asce;
> int r = -1;
I can now stop initializing r.
> uint8_t key;
>
> @@ -381,35 +382,21 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
> if (!(env->psw.mask & PSW_MASK_DAT)) {
> *raddr = vaddr;
> r = 0;
and this can go as well.
> - goto out;
> + goto nodat;
> }
>
--
Thanks,
David / dhildenb
On Mon, 12 Aug 2019 15:37:39 +0200
David Hildenbrand <david@redhat.com> wrote:
> On 12.08.19 13:27, David Hildenbrand wrote:
> > Instructions are always fetched from primary address space, except when
> > in home address mode. Perform the selection directly in cpu_mmu_index().
> >
> > get_mem_index() is only used to perform data access, instructions are
> > fetched via cpu_lduw_code(), which translates to cpu_mmu_index(env, true).
> >
> > We don't care about restricting the access permissions of the TLB
> > entries anymore, as we no longer enter PRIMARY entries into the
> > SECONDARY MMU. Cleanup related code a bit.
> >
> > Signed-off-by: David Hildenbrand <david@redhat.com>
> > ---
> > target/s390x/cpu.h | 7 +++++++
> > target/s390x/mmu_helper.c | 35 ++++++++++++++---------------------
> > 2 files changed, 21 insertions(+), 21 deletions(-)
> >
> > diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> > index a606547b4d..c34992bb2e 100644
> > --- a/target/s390x/cpu.h
> > +++ b/target/s390x/cpu.h
> > @@ -332,6 +332,13 @@ static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
> > return MMU_REAL_IDX;
> > }
> >
> > + if (ifetch) {
> > + if ((env->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) {
> > + return MMU_HOME_IDX;
> > + }
> > + return MMU_PRIMARY_IDX;
> > + }
> > +
> > switch (env->psw.mask & PSW_MASK_ASC) {
> > case PSW_ASC_PRIMARY:
> > return MMU_PRIMARY_IDX;
> > diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
> > index 6e9c4d6151..2c9bb3acc0 100644
> > --- a/target/s390x/mmu_helper.c
> > +++ b/target/s390x/mmu_helper.c
> > @@ -349,6 +349,7 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
> > {
> > static S390SKeysState *ss;
> > static S390SKeysClass *skeyclass;
> > + uint64_t asce;
> > int r = -1;
>
> I can now stop initializing r.
>
> > uint8_t key;
> >
> > @@ -381,35 +382,21 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
> > if (!(env->psw.mask & PSW_MASK_DAT)) {
> > *raddr = vaddr;
> > r = 0;
>
> and this can go as well.
>
> > - goto out;
> > + goto nodat;
> > }
> >
>
>
So, there will be a v2?
On 13.08.19 14:52, Cornelia Huck wrote:
> On Mon, 12 Aug 2019 15:37:39 +0200
> David Hildenbrand <david@redhat.com> wrote:
>
>> On 12.08.19 13:27, David Hildenbrand wrote:
>>> Instructions are always fetched from primary address space, except when
>>> in home address mode. Perform the selection directly in cpu_mmu_index().
>>>
>>> get_mem_index() is only used to perform data access, instructions are
>>> fetched via cpu_lduw_code(), which translates to cpu_mmu_index(env, true).
>>>
>>> We don't care about restricting the access permissions of the TLB
>>> entries anymore, as we no longer enter PRIMARY entries into the
>>> SECONDARY MMU. Cleanup related code a bit.
>>>
>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>> ---
>>> target/s390x/cpu.h | 7 +++++++
>>> target/s390x/mmu_helper.c | 35 ++++++++++++++---------------------
>>> 2 files changed, 21 insertions(+), 21 deletions(-)
>>>
>>> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
>>> index a606547b4d..c34992bb2e 100644
>>> --- a/target/s390x/cpu.h
>>> +++ b/target/s390x/cpu.h
>>> @@ -332,6 +332,13 @@ static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
>>> return MMU_REAL_IDX;
>>> }
>>>
>>> + if (ifetch) {
>>> + if ((env->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) {
>>> + return MMU_HOME_IDX;
>>> + }
>>> + return MMU_PRIMARY_IDX;
>>> + }
>>> +
>>> switch (env->psw.mask & PSW_MASK_ASC) {
>>> case PSW_ASC_PRIMARY:
>>> return MMU_PRIMARY_IDX;
>>> diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
>>> index 6e9c4d6151..2c9bb3acc0 100644
>>> --- a/target/s390x/mmu_helper.c
>>> +++ b/target/s390x/mmu_helper.c
>>> @@ -349,6 +349,7 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
>>> {
>>> static S390SKeysState *ss;
>>> static S390SKeysClass *skeyclass;
>>> + uint64_t asce;
>>> int r = -1;
>>
>> I can now stop initializing r.
>>
>>> uint8_t key;
>>>
>>> @@ -381,35 +382,21 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
>>> if (!(env->psw.mask & PSW_MASK_DAT)) {
>>> *raddr = vaddr;
>>> r = 0;
>>
>> and this can go as well.
>>
>>> - goto out;
>>> + goto nodat;
>>> }
>>>
>>
>>
>
> So, there will be a v2?
Yes, but waiting for more feedback.
--
Thanks,
David / dhildenb
© 2016 - 2025 Red Hat, Inc.