KVM: PPC: Book3S HV: Add infrastructure to support 2nd DAWR
KVM code assumes single DAWR everywhere. Add code to support 2nd DAWR. DAWR is a hypervisor resource and thus H_SET_MODE hcall is used to set/ unset it. Introduce new case H_SET_MODE_RESOURCE_SET_DAWR1 for 2nd DAWR. Also, KVM will support 2nd DAWR only if CPU_FTR_DAWR1 is set. Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
This commit is contained in:
Родитель
122954ed7d
Коммит
bd1de1a0e6
|
@ -2276,6 +2276,8 @@ registers, find a list below:
|
||||||
PPC KVM_REG_PPC_PSSCR 64
|
PPC KVM_REG_PPC_PSSCR 64
|
||||||
PPC KVM_REG_PPC_DEC_EXPIRY 64
|
PPC KVM_REG_PPC_DEC_EXPIRY 64
|
||||||
PPC KVM_REG_PPC_PTCR 64
|
PPC KVM_REG_PPC_PTCR 64
|
||||||
|
PPC KVM_REG_PPC_DAWR1 64
|
||||||
|
PPC KVM_REG_PPC_DAWRX1 64
|
||||||
PPC KVM_REG_PPC_TM_GPR0 64
|
PPC KVM_REG_PPC_TM_GPR0 64
|
||||||
...
|
...
|
||||||
PPC KVM_REG_PPC_TM_GPR31 64
|
PPC KVM_REG_PPC_TM_GPR31 64
|
||||||
|
|
|
@ -569,16 +569,22 @@ struct hv_guest_state {
|
||||||
u64 pidr;
|
u64 pidr;
|
||||||
u64 cfar;
|
u64 cfar;
|
||||||
u64 ppr;
|
u64 ppr;
|
||||||
|
/* Version 1 ends here */
|
||||||
|
u64 dawr1;
|
||||||
|
u64 dawrx1;
|
||||||
|
/* Version 2 ends here */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Latest version of hv_guest_state structure */
|
/* Latest version of hv_guest_state structure */
|
||||||
#define HV_GUEST_STATE_VERSION 1
|
#define HV_GUEST_STATE_VERSION 2
|
||||||
|
|
||||||
static inline int hv_guest_state_size(unsigned int version)
|
static inline int hv_guest_state_size(unsigned int version)
|
||||||
{
|
{
|
||||||
switch (version) {
|
switch (version) {
|
||||||
case 1:
|
case 1:
|
||||||
return offsetofend(struct hv_guest_state, ppr);
|
return offsetofend(struct hv_guest_state, ppr);
|
||||||
|
case 2:
|
||||||
|
return offsetofend(struct hv_guest_state, dawrx1);
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -306,6 +306,7 @@ struct kvm_arch {
|
||||||
u8 svm_enabled;
|
u8 svm_enabled;
|
||||||
bool threads_indep;
|
bool threads_indep;
|
||||||
bool nested_enable;
|
bool nested_enable;
|
||||||
|
bool dawr1_enabled;
|
||||||
pgd_t *pgtable;
|
pgd_t *pgtable;
|
||||||
u64 process_table;
|
u64 process_table;
|
||||||
struct dentry *debugfs_dir;
|
struct dentry *debugfs_dir;
|
||||||
|
@ -585,6 +586,8 @@ struct kvm_vcpu_arch {
|
||||||
ulong dabr;
|
ulong dabr;
|
||||||
ulong dawr0;
|
ulong dawr0;
|
||||||
ulong dawrx0;
|
ulong dawrx0;
|
||||||
|
ulong dawr1;
|
||||||
|
ulong dawrx1;
|
||||||
ulong ciabr;
|
ulong ciabr;
|
||||||
ulong cfar;
|
ulong cfar;
|
||||||
ulong ppr;
|
ulong ppr;
|
||||||
|
|
|
@ -644,6 +644,8 @@ struct kvm_ppc_cpu_char {
|
||||||
#define KVM_REG_PPC_MMCR3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc1)
|
#define KVM_REG_PPC_MMCR3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc1)
|
||||||
#define KVM_REG_PPC_SIER2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc2)
|
#define KVM_REG_PPC_SIER2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc2)
|
||||||
#define KVM_REG_PPC_SIER3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc3)
|
#define KVM_REG_PPC_SIER3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc3)
|
||||||
|
#define KVM_REG_PPC_DAWR1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc4)
|
||||||
|
#define KVM_REG_PPC_DAWRX1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc5)
|
||||||
|
|
||||||
/* Transactional Memory checkpointed state:
|
/* Transactional Memory checkpointed state:
|
||||||
* This is all GPRs, all VSX regs and a subset of SPRs
|
* This is all GPRs, all VSX regs and a subset of SPRs
|
||||||
|
|
|
@ -528,6 +528,8 @@ int main(void)
|
||||||
OFFSET(VCPU_DABRX, kvm_vcpu, arch.dabrx);
|
OFFSET(VCPU_DABRX, kvm_vcpu, arch.dabrx);
|
||||||
OFFSET(VCPU_DAWR0, kvm_vcpu, arch.dawr0);
|
OFFSET(VCPU_DAWR0, kvm_vcpu, arch.dawr0);
|
||||||
OFFSET(VCPU_DAWRX0, kvm_vcpu, arch.dawrx0);
|
OFFSET(VCPU_DAWRX0, kvm_vcpu, arch.dawrx0);
|
||||||
|
OFFSET(VCPU_DAWR1, kvm_vcpu, arch.dawr1);
|
||||||
|
OFFSET(VCPU_DAWRX1, kvm_vcpu, arch.dawrx1);
|
||||||
OFFSET(VCPU_CIABR, kvm_vcpu, arch.ciabr);
|
OFFSET(VCPU_CIABR, kvm_vcpu, arch.ciabr);
|
||||||
OFFSET(VCPU_HFLAGS, kvm_vcpu, arch.hflags);
|
OFFSET(VCPU_HFLAGS, kvm_vcpu, arch.hflags);
|
||||||
OFFSET(VCPU_DEC, kvm_vcpu, arch.dec);
|
OFFSET(VCPU_DEC, kvm_vcpu, arch.dec);
|
||||||
|
|
|
@ -785,6 +785,22 @@ static int kvmppc_h_set_mode(struct kvm_vcpu *vcpu, unsigned long mflags,
|
||||||
vcpu->arch.dawr0 = value1;
|
vcpu->arch.dawr0 = value1;
|
||||||
vcpu->arch.dawrx0 = value2;
|
vcpu->arch.dawrx0 = value2;
|
||||||
return H_SUCCESS;
|
return H_SUCCESS;
|
||||||
|
case H_SET_MODE_RESOURCE_SET_DAWR1:
|
||||||
|
if (!kvmppc_power8_compatible(vcpu))
|
||||||
|
return H_P2;
|
||||||
|
if (!ppc_breakpoint_available())
|
||||||
|
return H_P2;
|
||||||
|
if (!cpu_has_feature(CPU_FTR_DAWR1))
|
||||||
|
return H_P2;
|
||||||
|
if (!vcpu->kvm->arch.dawr1_enabled)
|
||||||
|
return H_FUNCTION;
|
||||||
|
if (mflags)
|
||||||
|
return H_UNSUPPORTED_FLAG_START;
|
||||||
|
if (value2 & DABRX_HYP)
|
||||||
|
return H_P4;
|
||||||
|
vcpu->arch.dawr1 = value1;
|
||||||
|
vcpu->arch.dawrx1 = value2;
|
||||||
|
return H_SUCCESS;
|
||||||
case H_SET_MODE_RESOURCE_ADDR_TRANS_MODE:
|
case H_SET_MODE_RESOURCE_ADDR_TRANS_MODE:
|
||||||
/* KVM does not support mflags=2 (AIL=2) */
|
/* KVM does not support mflags=2 (AIL=2) */
|
||||||
if (mflags != 0 && mflags != 3)
|
if (mflags != 0 && mflags != 3)
|
||||||
|
@ -1764,6 +1780,12 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
|
||||||
case KVM_REG_PPC_DAWRX:
|
case KVM_REG_PPC_DAWRX:
|
||||||
*val = get_reg_val(id, vcpu->arch.dawrx0);
|
*val = get_reg_val(id, vcpu->arch.dawrx0);
|
||||||
break;
|
break;
|
||||||
|
case KVM_REG_PPC_DAWR1:
|
||||||
|
*val = get_reg_val(id, vcpu->arch.dawr1);
|
||||||
|
break;
|
||||||
|
case KVM_REG_PPC_DAWRX1:
|
||||||
|
*val = get_reg_val(id, vcpu->arch.dawrx1);
|
||||||
|
break;
|
||||||
case KVM_REG_PPC_CIABR:
|
case KVM_REG_PPC_CIABR:
|
||||||
*val = get_reg_val(id, vcpu->arch.ciabr);
|
*val = get_reg_val(id, vcpu->arch.ciabr);
|
||||||
break;
|
break;
|
||||||
|
@ -1996,6 +2018,12 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
|
||||||
case KVM_REG_PPC_DAWRX:
|
case KVM_REG_PPC_DAWRX:
|
||||||
vcpu->arch.dawrx0 = set_reg_val(id, *val) & ~DAWRX_HYP;
|
vcpu->arch.dawrx0 = set_reg_val(id, *val) & ~DAWRX_HYP;
|
||||||
break;
|
break;
|
||||||
|
case KVM_REG_PPC_DAWR1:
|
||||||
|
vcpu->arch.dawr1 = set_reg_val(id, *val);
|
||||||
|
break;
|
||||||
|
case KVM_REG_PPC_DAWRX1:
|
||||||
|
vcpu->arch.dawrx1 = set_reg_val(id, *val) & ~DAWRX_HYP;
|
||||||
|
break;
|
||||||
case KVM_REG_PPC_CIABR:
|
case KVM_REG_PPC_CIABR:
|
||||||
vcpu->arch.ciabr = set_reg_val(id, *val);
|
vcpu->arch.ciabr = set_reg_val(id, *val);
|
||||||
/* Don't allow setting breakpoints in hypervisor code */
|
/* Don't allow setting breakpoints in hypervisor code */
|
||||||
|
@ -3453,6 +3481,13 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit,
|
||||||
unsigned long host_dawrx0 = mfspr(SPRN_DAWRX0);
|
unsigned long host_dawrx0 = mfspr(SPRN_DAWRX0);
|
||||||
unsigned long host_psscr = mfspr(SPRN_PSSCR);
|
unsigned long host_psscr = mfspr(SPRN_PSSCR);
|
||||||
unsigned long host_pidr = mfspr(SPRN_PID);
|
unsigned long host_pidr = mfspr(SPRN_PID);
|
||||||
|
unsigned long host_dawr1 = 0;
|
||||||
|
unsigned long host_dawrx1 = 0;
|
||||||
|
|
||||||
|
if (cpu_has_feature(CPU_FTR_DAWR1)) {
|
||||||
|
host_dawr1 = mfspr(SPRN_DAWR1);
|
||||||
|
host_dawrx1 = mfspr(SPRN_DAWRX1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* P8 and P9 suppress the HDEC exception when LPCR[HDICE] = 0,
|
* P8 and P9 suppress the HDEC exception when LPCR[HDICE] = 0,
|
||||||
|
@ -3491,6 +3526,10 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit,
|
||||||
if (dawr_enabled()) {
|
if (dawr_enabled()) {
|
||||||
mtspr(SPRN_DAWR0, vcpu->arch.dawr0);
|
mtspr(SPRN_DAWR0, vcpu->arch.dawr0);
|
||||||
mtspr(SPRN_DAWRX0, vcpu->arch.dawrx0);
|
mtspr(SPRN_DAWRX0, vcpu->arch.dawrx0);
|
||||||
|
if (cpu_has_feature(CPU_FTR_DAWR1)) {
|
||||||
|
mtspr(SPRN_DAWR1, vcpu->arch.dawr1);
|
||||||
|
mtspr(SPRN_DAWRX1, vcpu->arch.dawrx1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mtspr(SPRN_CIABR, vcpu->arch.ciabr);
|
mtspr(SPRN_CIABR, vcpu->arch.ciabr);
|
||||||
mtspr(SPRN_IC, vcpu->arch.ic);
|
mtspr(SPRN_IC, vcpu->arch.ic);
|
||||||
|
@ -3544,6 +3583,10 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit,
|
||||||
mtspr(SPRN_CIABR, host_ciabr);
|
mtspr(SPRN_CIABR, host_ciabr);
|
||||||
mtspr(SPRN_DAWR0, host_dawr0);
|
mtspr(SPRN_DAWR0, host_dawr0);
|
||||||
mtspr(SPRN_DAWRX0, host_dawrx0);
|
mtspr(SPRN_DAWRX0, host_dawrx0);
|
||||||
|
if (cpu_has_feature(CPU_FTR_DAWR1)) {
|
||||||
|
mtspr(SPRN_DAWR1, host_dawr1);
|
||||||
|
mtspr(SPRN_DAWRX1, host_dawrx1);
|
||||||
|
}
|
||||||
mtspr(SPRN_PID, host_pidr);
|
mtspr(SPRN_PID, host_pidr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -49,6 +49,8 @@ void kvmhv_save_hv_regs(struct kvm_vcpu *vcpu, struct hv_guest_state *hr)
|
||||||
hr->pidr = vcpu->arch.pid;
|
hr->pidr = vcpu->arch.pid;
|
||||||
hr->cfar = vcpu->arch.cfar;
|
hr->cfar = vcpu->arch.cfar;
|
||||||
hr->ppr = vcpu->arch.ppr;
|
hr->ppr = vcpu->arch.ppr;
|
||||||
|
hr->dawr1 = vcpu->arch.dawr1;
|
||||||
|
hr->dawrx1 = vcpu->arch.dawrx1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void byteswap_pt_regs(struct pt_regs *regs)
|
static void byteswap_pt_regs(struct pt_regs *regs)
|
||||||
|
@ -91,6 +93,8 @@ static void byteswap_hv_regs(struct hv_guest_state *hr)
|
||||||
hr->pidr = swab64(hr->pidr);
|
hr->pidr = swab64(hr->pidr);
|
||||||
hr->cfar = swab64(hr->cfar);
|
hr->cfar = swab64(hr->cfar);
|
||||||
hr->ppr = swab64(hr->ppr);
|
hr->ppr = swab64(hr->ppr);
|
||||||
|
hr->dawr1 = swab64(hr->dawr1);
|
||||||
|
hr->dawrx1 = swab64(hr->dawrx1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void save_hv_return_state(struct kvm_vcpu *vcpu, int trap,
|
static void save_hv_return_state(struct kvm_vcpu *vcpu, int trap,
|
||||||
|
@ -138,6 +142,7 @@ static void sanitise_hv_regs(struct kvm_vcpu *vcpu, struct hv_guest_state *hr)
|
||||||
|
|
||||||
/* Don't let data address watchpoint match in hypervisor state */
|
/* Don't let data address watchpoint match in hypervisor state */
|
||||||
hr->dawrx0 &= ~DAWRX_HYP;
|
hr->dawrx0 &= ~DAWRX_HYP;
|
||||||
|
hr->dawrx1 &= ~DAWRX_HYP;
|
||||||
|
|
||||||
/* Don't let completed instruction address breakpt match in HV state */
|
/* Don't let completed instruction address breakpt match in HV state */
|
||||||
if ((hr->ciabr & CIABR_PRIV) == CIABR_PRIV_HYPER)
|
if ((hr->ciabr & CIABR_PRIV) == CIABR_PRIV_HYPER)
|
||||||
|
@ -167,6 +172,8 @@ static void restore_hv_regs(struct kvm_vcpu *vcpu, struct hv_guest_state *hr)
|
||||||
vcpu->arch.pid = hr->pidr;
|
vcpu->arch.pid = hr->pidr;
|
||||||
vcpu->arch.cfar = hr->cfar;
|
vcpu->arch.cfar = hr->cfar;
|
||||||
vcpu->arch.ppr = hr->ppr;
|
vcpu->arch.ppr = hr->ppr;
|
||||||
|
vcpu->arch.dawr1 = hr->dawr1;
|
||||||
|
vcpu->arch.dawrx1 = hr->dawrx1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvmhv_restore_hv_return_state(struct kvm_vcpu *vcpu,
|
void kvmhv_restore_hv_return_state(struct kvm_vcpu *vcpu,
|
||||||
|
|
|
@ -57,6 +57,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
|
||||||
#define STACK_SLOT_HFSCR (SFS-72)
|
#define STACK_SLOT_HFSCR (SFS-72)
|
||||||
#define STACK_SLOT_AMR (SFS-80)
|
#define STACK_SLOT_AMR (SFS-80)
|
||||||
#define STACK_SLOT_UAMOR (SFS-88)
|
#define STACK_SLOT_UAMOR (SFS-88)
|
||||||
|
#define STACK_SLOT_DAWR1 (SFS-96)
|
||||||
|
#define STACK_SLOT_DAWRX1 (SFS-104)
|
||||||
/* the following is used by the P9 short path */
|
/* the following is used by the P9 short path */
|
||||||
#define STACK_SLOT_NVGPRS (SFS-152) /* 18 gprs */
|
#define STACK_SLOT_NVGPRS (SFS-152) /* 18 gprs */
|
||||||
|
|
||||||
|
@ -715,6 +717,12 @@ BEGIN_FTR_SECTION
|
||||||
std r7, STACK_SLOT_DAWRX0(r1)
|
std r7, STACK_SLOT_DAWRX0(r1)
|
||||||
std r8, STACK_SLOT_IAMR(r1)
|
std r8, STACK_SLOT_IAMR(r1)
|
||||||
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
||||||
|
BEGIN_FTR_SECTION
|
||||||
|
mfspr r6, SPRN_DAWR1
|
||||||
|
mfspr r7, SPRN_DAWRX1
|
||||||
|
std r6, STACK_SLOT_DAWR1(r1)
|
||||||
|
std r7, STACK_SLOT_DAWRX1(r1)
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S | CPU_FTR_DAWR1)
|
||||||
|
|
||||||
mfspr r5, SPRN_AMR
|
mfspr r5, SPRN_AMR
|
||||||
std r5, STACK_SLOT_AMR(r1)
|
std r5, STACK_SLOT_AMR(r1)
|
||||||
|
@ -805,6 +813,12 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
|
||||||
ld r6, VCPU_DAWRX0(r4)
|
ld r6, VCPU_DAWRX0(r4)
|
||||||
mtspr SPRN_DAWR0, r5
|
mtspr SPRN_DAWR0, r5
|
||||||
mtspr SPRN_DAWRX0, r6
|
mtspr SPRN_DAWRX0, r6
|
||||||
|
BEGIN_FTR_SECTION
|
||||||
|
ld r5, VCPU_DAWR1(r4)
|
||||||
|
ld r6, VCPU_DAWRX1(r4)
|
||||||
|
mtspr SPRN_DAWR1, r5
|
||||||
|
mtspr SPRN_DAWRX1, r6
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_DAWR1)
|
||||||
1:
|
1:
|
||||||
ld r7, VCPU_CIABR(r4)
|
ld r7, VCPU_CIABR(r4)
|
||||||
ld r8, VCPU_TAR(r4)
|
ld r8, VCPU_TAR(r4)
|
||||||
|
@ -1769,6 +1783,12 @@ BEGIN_FTR_SECTION
|
||||||
mtspr SPRN_DAWR0, r6
|
mtspr SPRN_DAWR0, r6
|
||||||
mtspr SPRN_DAWRX0, r7
|
mtspr SPRN_DAWRX0, r7
|
||||||
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
||||||
|
BEGIN_FTR_SECTION
|
||||||
|
ld r6, STACK_SLOT_DAWR1(r1)
|
||||||
|
ld r7, STACK_SLOT_DAWRX1(r1)
|
||||||
|
mtspr SPRN_DAWR1, r6
|
||||||
|
mtspr SPRN_DAWRX1, r7
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S | CPU_FTR_DAWR1)
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
ld r5, STACK_SLOT_TID(r1)
|
ld r5, STACK_SLOT_TID(r1)
|
||||||
ld r6, STACK_SLOT_PSSCR(r1)
|
ld r6, STACK_SLOT_PSSCR(r1)
|
||||||
|
@ -3343,6 +3363,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
|
||||||
mtspr SPRN_IAMR, r0
|
mtspr SPRN_IAMR, r0
|
||||||
mtspr SPRN_CIABR, r0
|
mtspr SPRN_CIABR, r0
|
||||||
mtspr SPRN_DAWRX0, r0
|
mtspr SPRN_DAWRX0, r0
|
||||||
|
BEGIN_FTR_SECTION
|
||||||
|
mtspr SPRN_DAWRX1, r0
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_DAWR1)
|
||||||
|
|
||||||
BEGIN_MMU_FTR_SECTION
|
BEGIN_MMU_FTR_SECTION
|
||||||
b 4f
|
b 4f
|
||||||
|
|
|
@ -644,6 +644,8 @@ struct kvm_ppc_cpu_char {
|
||||||
#define KVM_REG_PPC_MMCR3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc1)
|
#define KVM_REG_PPC_MMCR3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc1)
|
||||||
#define KVM_REG_PPC_SIER2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc2)
|
#define KVM_REG_PPC_SIER2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc2)
|
||||||
#define KVM_REG_PPC_SIER3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc3)
|
#define KVM_REG_PPC_SIER3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc3)
|
||||||
|
#define KVM_REG_PPC_DAWR1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc4)
|
||||||
|
#define KVM_REG_PPC_DAWRX1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc5)
|
||||||
|
|
||||||
/* Transactional Memory checkpointed state:
|
/* Transactional Memory checkpointed state:
|
||||||
* This is all GPRs, all VSX regs and a subset of SPRs
|
* This is all GPRs, all VSX regs and a subset of SPRs
|
||||||
|
|
Загрузка…
Ссылка в новой задаче