mirror of
https://github.com/qemu/qemu.git
synced 2024-11-25 03:43:37 +08:00
s390x: update R and C bits in storage key
When the s390x maps a page or writes happen to a page, the R and C bits get updated. The easiest way to implement this in qemu is to simply update them whenever we map a TLB translation and act according to the permissions. Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
09ed75f784
commit
b995913853
@ -819,6 +819,10 @@ struct sysib_322 {
|
||||
#define _PAGE_RO 0x200 /* HW read-only bit */
|
||||
#define _PAGE_INVALID 0x400 /* HW invalid bit */
|
||||
|
||||
#define SK_C (0x1 << 1)
|
||||
#define SK_R (0x1 << 2)
|
||||
#define SK_F (0x1 << 3)
|
||||
#define SK_ACC_MASK (0xf << 4)
|
||||
|
||||
|
||||
/* EBCDIC handling */
|
||||
|
@ -348,6 +348,7 @@ int mmu_translate(CPUState *env, target_ulong vaddr, int rw, uint64_t asc,
|
||||
target_ulong *raddr, int *flags)
|
||||
{
|
||||
int r = -1;
|
||||
uint8_t *sk;
|
||||
|
||||
*flags = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||
vaddr &= TARGET_PAGE_MASK;
|
||||
@ -390,6 +391,17 @@ out:
|
||||
*raddr = *raddr + env->psa;
|
||||
}
|
||||
|
||||
if (*raddr <= ram_size) {
|
||||
sk = &env->storage_keys[*raddr / TARGET_PAGE_SIZE];
|
||||
if (*flags & PAGE_READ) {
|
||||
*sk |= SK_R;
|
||||
}
|
||||
|
||||
if (*flags & PAGE_WRITE) {
|
||||
*sk |= SK_C;
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -2761,7 +2761,6 @@ uint64_t HELPER(iske)(uint64_t r2)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* XXX maybe use qemu's internal keys? */
|
||||
return env->storage_keys[addr / TARGET_PAGE_SIZE];
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user