mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-15 13:51:24 +00: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_RO 0x200 /* HW read-only bit */
|
||||||
#define _PAGE_INVALID 0x400 /* HW invalid 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 */
|
/* EBCDIC handling */
|
||||||
|
@ -348,6 +348,7 @@ int mmu_translate(CPUState *env, target_ulong vaddr, int rw, uint64_t asc,
|
|||||||
target_ulong *raddr, int *flags)
|
target_ulong *raddr, int *flags)
|
||||||
{
|
{
|
||||||
int r = -1;
|
int r = -1;
|
||||||
|
uint8_t *sk;
|
||||||
|
|
||||||
*flags = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
*flags = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
|
||||||
vaddr &= TARGET_PAGE_MASK;
|
vaddr &= TARGET_PAGE_MASK;
|
||||||
@ -390,6 +391,17 @@ out:
|
|||||||
*raddr = *raddr + env->psa;
|
*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;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2761,7 +2761,6 @@ uint64_t HELPER(iske)(uint64_t r2)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX maybe use qemu's internal keys? */
|
|
||||||
return env->storage_keys[addr / TARGET_PAGE_SIZE];
|
return env->storage_keys[addr / TARGET_PAGE_SIZE];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user