mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-31 14:02:05 -06:00
target/s390x: remove some Linux assumptions from IPTE
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> Message-Id: <20170531220129.27724-3-aurelien@aurel32.net> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
51a718bf3d
commit
8a4719f527
3 changed files with 12 additions and 9 deletions
|
@ -1035,6 +1035,8 @@ struct sysib_322 {
|
||||||
#define _SEGMENT_ENTRY_RO 0x200 /* page protection bit */
|
#define _SEGMENT_ENTRY_RO 0x200 /* page protection bit */
|
||||||
#define _SEGMENT_ENTRY_INV 0x20 /* invalid segment table entry */
|
#define _SEGMENT_ENTRY_INV 0x20 /* invalid segment table entry */
|
||||||
|
|
||||||
|
#define VADDR_PX 0xff000 /* page index bits */
|
||||||
|
|
||||||
#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 _PAGE_RES0 0x800 /* bit must be zero */
|
#define _PAGE_RES0 0x800 /* bit must be zero */
|
||||||
|
|
|
@ -1073,19 +1073,22 @@ uint32_t HELPER(mvcp)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* invalidate pte */
|
/* invalidate pte */
|
||||||
void HELPER(ipte)(CPUS390XState *env, uint64_t pte_addr, uint64_t vaddr)
|
void HELPER(ipte)(CPUS390XState *env, uint64_t pto, uint64_t vaddr)
|
||||||
{
|
{
|
||||||
CPUState *cs = CPU(s390_env_get_cpu(env));
|
CPUState *cs = CPU(s390_env_get_cpu(env));
|
||||||
uint64_t page = vaddr & TARGET_PAGE_MASK;
|
uint64_t page = vaddr & TARGET_PAGE_MASK;
|
||||||
uint64_t pte = 0;
|
uint64_t pte_addr, pte;
|
||||||
|
|
||||||
/* XXX broadcast to other CPUs */
|
/* XXX broadcast to other CPUs */
|
||||||
|
|
||||||
/* XXX Linux is nice enough to give us the exact pte address.
|
/* Compute the page table entry address */
|
||||||
According to spec we'd have to find it out ourselves */
|
pte_addr = (pto & _SEGMENT_ENTRY_ORIGIN);
|
||||||
/* XXX Linux is fine with overwriting the pte, the spec requires
|
pte_addr += (vaddr & _VADDR_PX) >> 9;
|
||||||
us to only set the invalid bit */
|
|
||||||
stq_phys(cs->as, pte_addr, pte | _PAGE_INVALID);
|
/* Mark the page table entry as invalid */
|
||||||
|
pte = ldq_phys(cs->as, pte_addr);
|
||||||
|
pte |= _PAGE_INVALID;
|
||||||
|
stq_phys(cs->as, pte_addr, pte);
|
||||||
|
|
||||||
/* XXX we exploit the fact that Linux passes the exact virtual
|
/* XXX we exploit the fact that Linux passes the exact virtual
|
||||||
address here - it's not obliged to! */
|
address here - it's not obliged to! */
|
||||||
|
|
|
@ -143,8 +143,6 @@ static int mmu_translate_pte(CPUS390XState *env, target_ulong vaddr,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VADDR_PX 0xff000 /* Page index bits */
|
|
||||||
|
|
||||||
/* Decode segment table entry */
|
/* Decode segment table entry */
|
||||||
static int mmu_translate_segment(CPUS390XState *env, target_ulong vaddr,
|
static int mmu_translate_segment(CPUS390XState *env, target_ulong vaddr,
|
||||||
uint64_t asc, uint64_t st_entry,
|
uint64_t asc, uint64_t st_entry,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue