s390/kvm: Move bitfields for dat tables
Move and improve the struct definitions for DAT tables from gaccess.c to a new header. Once in a separate header, the structs become available everywhere. One possible usecase is to merge them in the s390 pte_t and p?d_t definitions, which is left as an exercise for the reader. Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> Reviewed-by: Nico Boehr <nrb@linux.ibm.com> Link: https://lore.kernel.org/r/20240703155900.103783-3-imbrenda@linux.ibm.com Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
parent
723ac2d6ba
commit
275d05ce06
170
arch/s390/include/asm/dat-bits.h
Normal file
170
arch/s390/include/asm/dat-bits.h
Normal file
@ -0,0 +1,170 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* DAT table and related structures
|
||||
*
|
||||
* Copyright IBM Corp. 2024
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _S390_DAT_BITS_H
|
||||
#define _S390_DAT_BITS_H
|
||||
|
||||
union asce {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long rsto: 52;/* Region- or Segment-Table Origin */
|
||||
unsigned long : 2;
|
||||
unsigned long g : 1; /* Subspace Group control */
|
||||
unsigned long p : 1; /* Private Space control */
|
||||
unsigned long s : 1; /* Storage-Alteration-Event control */
|
||||
unsigned long x : 1; /* Space-Switch-Event control */
|
||||
unsigned long r : 1; /* Real-Space control */
|
||||
unsigned long : 1;
|
||||
unsigned long dt : 2; /* Designation-Type control */
|
||||
unsigned long tl : 2; /* Region- or Segment-Table Length */
|
||||
};
|
||||
};
|
||||
|
||||
enum {
|
||||
ASCE_TYPE_SEGMENT = 0,
|
||||
ASCE_TYPE_REGION3 = 1,
|
||||
ASCE_TYPE_REGION2 = 2,
|
||||
ASCE_TYPE_REGION1 = 3
|
||||
};
|
||||
|
||||
union region1_table_entry {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long rto: 52;/* Region-Table Origin */
|
||||
unsigned long : 2;
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tf : 2; /* Region-Second-Table Offset */
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long tl : 2; /* Region-Second-Table Length */
|
||||
};
|
||||
};
|
||||
|
||||
union region2_table_entry {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long rto: 52;/* Region-Table Origin */
|
||||
unsigned long : 2;
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tf : 2; /* Region-Third-Table Offset */
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long tl : 2; /* Region-Third-Table Length */
|
||||
};
|
||||
};
|
||||
|
||||
struct region3_table_entry_fc0 {
|
||||
unsigned long sto: 52;/* Segment-Table Origin */
|
||||
unsigned long : 1;
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tf : 2; /* Segment-Table Offset */
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long cr : 1; /* Common-Region Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long tl : 2; /* Segment-Table Length */
|
||||
};
|
||||
|
||||
struct region3_table_entry_fc1 {
|
||||
unsigned long rfaa: 33;/* Region-Frame Absolute Address */
|
||||
unsigned long : 14;
|
||||
unsigned long av : 1; /* ACCF-Validity Control */
|
||||
unsigned long acc : 4; /* Access-Control Bits */
|
||||
unsigned long f : 1; /* Fetch-Protection Bit */
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long iep : 1; /* Instruction-Execution-Protection */
|
||||
unsigned long : 2;
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long cr : 1; /* Common-Region Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
|
||||
union region3_table_entry {
|
||||
unsigned long val;
|
||||
struct region3_table_entry_fc0 fc0;
|
||||
struct region3_table_entry_fc1 fc1;
|
||||
struct {
|
||||
unsigned long : 53;
|
||||
unsigned long fc: 1; /* Format-Control */
|
||||
unsigned long : 4;
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long cr: 1; /* Common-Region Bit */
|
||||
unsigned long tt: 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
};
|
||||
|
||||
struct segment_table_entry_fc0 {
|
||||
unsigned long pto: 53;/* Page-Table Origin */
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long : 3;
|
||||
unsigned long i : 1; /* Segment-Invalid Bit */
|
||||
unsigned long cs : 1; /* Common-Segment Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
|
||||
struct segment_table_entry_fc1 {
|
||||
unsigned long sfaa: 44;/* Segment-Frame Absolute Address */
|
||||
unsigned long : 3;
|
||||
unsigned long av : 1; /* ACCF-Validity Control */
|
||||
unsigned long acc : 4; /* Access-Control Bits */
|
||||
unsigned long f : 1; /* Fetch-Protection Bit */
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long iep : 1; /* Instruction-Execution-Protection */
|
||||
unsigned long : 2;
|
||||
unsigned long i : 1; /* Segment-Invalid Bit */
|
||||
unsigned long cs : 1; /* Common-Segment Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
|
||||
union segment_table_entry {
|
||||
unsigned long val;
|
||||
struct segment_table_entry_fc0 fc0;
|
||||
struct segment_table_entry_fc1 fc1;
|
||||
struct {
|
||||
unsigned long : 53;
|
||||
unsigned long fc: 1; /* Format-Control */
|
||||
unsigned long : 4;
|
||||
unsigned long i : 1; /* Segment-Invalid Bit */
|
||||
unsigned long cs: 1; /* Common-Segment Bit */
|
||||
unsigned long tt: 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
};
|
||||
|
||||
union page_table_entry {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long pfra: 52;/* Page-Frame Real Address */
|
||||
unsigned long z : 1; /* Zero Bit */
|
||||
unsigned long i : 1; /* Page-Invalid Bit */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long iep : 1; /* Instruction-Execution-Protection */
|
||||
unsigned long : 8;
|
||||
};
|
||||
};
|
||||
|
||||
enum {
|
||||
TABLE_TYPE_SEGMENT = 0,
|
||||
TABLE_TYPE_REGION3 = 1,
|
||||
TABLE_TYPE_REGION2 = 2,
|
||||
TABLE_TYPE_REGION1 = 3
|
||||
};
|
||||
|
||||
#endif /* _S390_DAT_BITS_H */
|
@ -14,167 +14,10 @@
|
||||
#include <asm/access-regs.h>
|
||||
#include <asm/fault.h>
|
||||
#include <asm/gmap.h>
|
||||
#include <asm/dat-bits.h>
|
||||
#include "kvm-s390.h"
|
||||
#include "gaccess.h"
|
||||
|
||||
union asce {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long origin : 52; /* Region- or Segment-Table Origin */
|
||||
unsigned long : 2;
|
||||
unsigned long g : 1; /* Subspace Group Control */
|
||||
unsigned long p : 1; /* Private Space Control */
|
||||
unsigned long s : 1; /* Storage-Alteration-Event Control */
|
||||
unsigned long x : 1; /* Space-Switch-Event Control */
|
||||
unsigned long r : 1; /* Real-Space Control */
|
||||
unsigned long : 1;
|
||||
unsigned long dt : 2; /* Designation-Type Control */
|
||||
unsigned long tl : 2; /* Region- or Segment-Table Length */
|
||||
};
|
||||
};
|
||||
|
||||
enum {
|
||||
ASCE_TYPE_SEGMENT = 0,
|
||||
ASCE_TYPE_REGION3 = 1,
|
||||
ASCE_TYPE_REGION2 = 2,
|
||||
ASCE_TYPE_REGION1 = 3
|
||||
};
|
||||
|
||||
union region1_table_entry {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long rto: 52;/* Region-Table Origin */
|
||||
unsigned long : 2;
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tf : 2; /* Region-Second-Table Offset */
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long tl : 2; /* Region-Second-Table Length */
|
||||
};
|
||||
};
|
||||
|
||||
union region2_table_entry {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long rto: 52;/* Region-Table Origin */
|
||||
unsigned long : 2;
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tf : 2; /* Region-Third-Table Offset */
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long tl : 2; /* Region-Third-Table Length */
|
||||
};
|
||||
};
|
||||
|
||||
struct region3_table_entry_fc0 {
|
||||
unsigned long sto: 52;/* Segment-Table Origin */
|
||||
unsigned long : 1;
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long : 1;
|
||||
unsigned long tf : 2; /* Segment-Table Offset */
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long cr : 1; /* Common-Region Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long tl : 2; /* Segment-Table Length */
|
||||
};
|
||||
|
||||
struct region3_table_entry_fc1 {
|
||||
unsigned long rfaa : 33; /* Region-Frame Absolute Address */
|
||||
unsigned long : 14;
|
||||
unsigned long av : 1; /* ACCF-Validity Control */
|
||||
unsigned long acc: 4; /* Access-Control Bits */
|
||||
unsigned long f : 1; /* Fetch-Protection Bit */
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long iep: 1; /* Instruction-Execution-Protection */
|
||||
unsigned long : 2;
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long cr : 1; /* Common-Region Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
|
||||
union region3_table_entry {
|
||||
unsigned long val;
|
||||
struct region3_table_entry_fc0 fc0;
|
||||
struct region3_table_entry_fc1 fc1;
|
||||
struct {
|
||||
unsigned long : 53;
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long : 4;
|
||||
unsigned long i : 1; /* Region-Invalid Bit */
|
||||
unsigned long cr : 1; /* Common-Region Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
};
|
||||
|
||||
struct segment_entry_fc0 {
|
||||
unsigned long pto: 53;/* Page-Table Origin */
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long : 3;
|
||||
unsigned long i : 1; /* Segment-Invalid Bit */
|
||||
unsigned long cs : 1; /* Common-Segment Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
|
||||
struct segment_entry_fc1 {
|
||||
unsigned long sfaa : 44; /* Segment-Frame Absolute Address */
|
||||
unsigned long : 3;
|
||||
unsigned long av : 1; /* ACCF-Validity Control */
|
||||
unsigned long acc: 4; /* Access-Control Bits */
|
||||
unsigned long f : 1; /* Fetch-Protection Bit */
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long iep: 1; /* Instruction-Execution-Protection */
|
||||
unsigned long : 2;
|
||||
unsigned long i : 1; /* Segment-Invalid Bit */
|
||||
unsigned long cs : 1; /* Common-Segment Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
|
||||
union segment_table_entry {
|
||||
unsigned long val;
|
||||
struct segment_entry_fc0 fc0;
|
||||
struct segment_entry_fc1 fc1;
|
||||
struct {
|
||||
unsigned long : 53;
|
||||
unsigned long fc : 1; /* Format-Control */
|
||||
unsigned long : 4;
|
||||
unsigned long i : 1; /* Segment-Invalid Bit */
|
||||
unsigned long cs : 1; /* Common-Segment Bit */
|
||||
unsigned long tt : 2; /* Table-Type Bits */
|
||||
unsigned long : 2;
|
||||
};
|
||||
};
|
||||
|
||||
enum {
|
||||
TABLE_TYPE_SEGMENT = 0,
|
||||
TABLE_TYPE_REGION3 = 1,
|
||||
TABLE_TYPE_REGION2 = 2,
|
||||
TABLE_TYPE_REGION1 = 3
|
||||
};
|
||||
|
||||
union page_table_entry {
|
||||
unsigned long val;
|
||||
struct {
|
||||
unsigned long pfra : 52; /* Page-Frame Real Address */
|
||||
unsigned long z : 1; /* Zero Bit */
|
||||
unsigned long i : 1; /* Page-Invalid Bit */
|
||||
unsigned long p : 1; /* DAT-Protection Bit */
|
||||
unsigned long iep: 1; /* Instruction-Execution-Protection */
|
||||
unsigned long : 8;
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* vaddress union in order to easily decode a virtual address into its
|
||||
* region first index, region second index etc. parts.
|
||||
@ -632,7 +475,7 @@ static unsigned long guest_translate(struct kvm_vcpu *vcpu, unsigned long gva,
|
||||
iep = ctlreg0.iep && test_kvm_facility(vcpu->kvm, 130);
|
||||
if (asce.r)
|
||||
goto real_address;
|
||||
ptr = asce.origin * PAGE_SIZE;
|
||||
ptr = asce.rsto * PAGE_SIZE;
|
||||
switch (asce.dt) {
|
||||
case ASCE_TYPE_REGION1:
|
||||
if (vaddr.rfx01 > asce.tl)
|
||||
@ -1379,7 +1222,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
|
||||
parent = sg->parent;
|
||||
vaddr.addr = saddr;
|
||||
asce.val = sg->orig_asce;
|
||||
ptr = asce.origin * PAGE_SIZE;
|
||||
ptr = asce.rsto * PAGE_SIZE;
|
||||
if (asce.r) {
|
||||
*fake = 1;
|
||||
ptr = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user