Various fixes/improvements, and support for the new 81/82
facility bits. -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJaZdEGAAoJEN7Pa5PG8C+vVq4P/04/hQMMhlYjscydro35dwLT 8pjhJ1QNxoAhfCd3Mmb9finl+rC1KQHbxDwJlzbtjNUVVP6y6k4lAFaISwL5Gqui b/L5luBBdSpBBsL7IWIfXnL+yJUTgkvt6goc3x0rlLm7SCKjzBbPbXKPYvrfRLFO Km6kMMx4zwG7qJEmDrrdDSeGGw1lviyWuGiRutxLYR52Mvd+U6m1/G/53e5oqj2v XZLbS1mPty/jbFENm850dAXiDY7DHgIawYuqLcdjA50KYymCyaZP/dOvrf0pAeUc /eVp6xAz7S4bqW9/rM8/PUpyqx3Mug1TFk0ePbJEtt+/JtN2AC7wKFXvTi56n9aa RFLV+2WaDnY8+vcOhZkb5ptAKsDBkAzJw5hbXKM/elnUjPk8o326fDMrCyoMhj84 JyyqLWEeVCdiCP1xdz0D8WnBq33+FDqJ7P2YHWBpcSyodG+udS1Qttc38JxUKstH 9olJk+atnAdmTU+KmZuF6CnBbGIBxXqJrIXnroMT3Ycp6qdQzHmNq4UrTv/tQM+B PLR14kWNvEiGVEGBPc65JUJjLM3MoXzmnY5c/C7cmSGRMgLCSjnpSW6tBNEn470J nTfca/PLaUzhbIjPDwmB+AYjKZ/y+Pl5pz8e5rY6qt+7C8/qaOYrPtVy0VRt2smW ki1fawgWY6I00i9a1z5l =bvX/ -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20180122' into staging Various fixes/improvements, and support for the new 81/82 facility bits. # gpg: Signature made Mon 22 Jan 2018 11:54:46 GMT # gpg: using RSA key 0xDECF6B93C6F02FAF # gpg: Good signature from "Cornelia Huck <conny@cornelia-huck.de>" # gpg: aka "Cornelia Huck <huckc@linux.vnet.ibm.com>" # gpg: aka "Cornelia Huck <cornelia.huck@de.ibm.com>" # gpg: aka "Cornelia Huck <cohuck@kernel.org>" # gpg: aka "Cornelia Huck <cohuck@redhat.com>" # Primary key fingerprint: C3D0 D66D C362 4FF6 A8C0 18CE DECF 6B93 C6F0 2FAF * remotes/cohuck/tags/s390x-20180122: s390x/kvm: provide stfle.81 s390x/kvm: Handle bpb feature linux-headers: update s390x/tcg: fixup TEST PROTECTION s390x: fix storage attributes migration for non-small guests hw/s390x: Replace fprintf(stderr, "*\n" with qemu_log_mask() s390x/sclp: fix missing be conversion s390x/tcg: implement TEST PROTECTION s390x/sclp: fixup highest CPU address Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
238e2d93c9
@ -116,7 +116,7 @@ static void kvm_s390_stattrib_synchronize(S390StAttribState *sa)
|
||||
for (cx = 0; cx + len <= max; cx += len) {
|
||||
clog.start_gfn = cx;
|
||||
clog.count = len;
|
||||
clog.values = (uint64_t)(sas->incoming_buffer + cx * len);
|
||||
clog.values = (uint64_t)(sas->incoming_buffer + cx);
|
||||
r = kvm_vm_ioctl(kvm_state, KVM_S390_SET_CMMA_BITS, &clog);
|
||||
if (r) {
|
||||
error_report("KVM_S390_SET_CMMA_BITS failed: %s", strerror(-r));
|
||||
@ -126,7 +126,7 @@ static void kvm_s390_stattrib_synchronize(S390StAttribState *sa)
|
||||
if (cx < max) {
|
||||
clog.start_gfn = cx;
|
||||
clog.count = max - cx;
|
||||
clog.values = (uint64_t)(sas->incoming_buffer + cx * len);
|
||||
clog.values = (uint64_t)(sas->incoming_buffer + cx);
|
||||
r = kvm_vm_ioctl(kvm_state, KVM_S390_SET_CMMA_BITS, &clog);
|
||||
if (r) {
|
||||
error_report("KVM_S390_SET_CMMA_BITS failed: %s", strerror(-r));
|
||||
|
@ -67,7 +67,7 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
|
||||
prepare_cpu_entries(sclp, read_info->entries, &cpu_count);
|
||||
read_info->entries_cpu = cpu_to_be16(cpu_count);
|
||||
read_info->offset_cpu = cpu_to_be16(offsetof(ReadInfo, entries));
|
||||
read_info->highest_cpu = cpu_to_be16(max_cpus);
|
||||
read_info->highest_cpu = cpu_to_be16(max_cpus - 1);
|
||||
|
||||
read_info->ibc_val = cpu_to_be32(s390_get_ibc_val());
|
||||
|
||||
@ -233,7 +233,7 @@ static void assign_storage(SCLPDevice *sclp, SCCB *sccb)
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_INVALID_SCLP_COMMAND);
|
||||
return;
|
||||
}
|
||||
assign_addr = (assign_info->rn - 1) * mhd->rzm;
|
||||
assign_addr = (be16_to_cpu(assign_info->rn) - 1) * mhd->rzm;
|
||||
|
||||
if ((assign_addr % MEM_SECTION_SIZE == 0) &&
|
||||
(assign_addr >= mhd->padded_ram_size)) {
|
||||
@ -292,7 +292,7 @@ static void unassign_storage(SCLPDevice *sclp, SCCB *sccb)
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_INVALID_SCLP_COMMAND);
|
||||
return;
|
||||
}
|
||||
unassign_addr = (assign_info->rn - 1) * mhd->rzm;
|
||||
unassign_addr = (be16_to_cpu(assign_info->rn) - 1) * mhd->rzm;
|
||||
|
||||
/* if the addr is a multiple of 256 MB */
|
||||
if ((unassign_addr % MEM_SECTION_SIZE == 0) &&
|
||||
|
@ -426,8 +426,9 @@ static int virtio_ccw_cb(SubchDev *sch, CCW1 ccw)
|
||||
* passes us zeroes for those we don't support.
|
||||
*/
|
||||
if (features.features) {
|
||||
fprintf(stderr, "Guest bug: features[%i]=%x (expected 0)\n",
|
||||
features.index, features.features);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"Guest bug: features[%i]=%x (expected 0)",
|
||||
features.index, features.features);
|
||||
/* XXX: do a unit check here? */
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,9 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
|
||||
/*
|
||||
* Definitions for virtio-ccw devices.
|
||||
*
|
||||
* Copyright IBM Corp. 2013
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License (version 2 only)
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
|
||||
*/
|
||||
#ifndef __KVM_VIRTIO_CCW_H
|
||||
|
@ -443,6 +443,31 @@ struct kvm_ppc_rmmu_info {
|
||||
__u32 ap_encodings[8];
|
||||
};
|
||||
|
||||
/* For KVM_PPC_GET_CPU_CHAR */
|
||||
struct kvm_ppc_cpu_char {
|
||||
__u64 character; /* characteristics of the CPU */
|
||||
__u64 behaviour; /* recommended software behaviour */
|
||||
__u64 character_mask; /* valid bits in character */
|
||||
__u64 behaviour_mask; /* valid bits in behaviour */
|
||||
};
|
||||
|
||||
/*
|
||||
* Values for character and character_mask.
|
||||
* These are identical to the values used by H_GET_CPU_CHARACTERISTICS.
|
||||
*/
|
||||
#define KVM_PPC_CPU_CHAR_SPEC_BAR_ORI31 (1ULL << 63)
|
||||
#define KVM_PPC_CPU_CHAR_BCCTRL_SERIALISED (1ULL << 62)
|
||||
#define KVM_PPC_CPU_CHAR_L1D_FLUSH_ORI30 (1ULL << 61)
|
||||
#define KVM_PPC_CPU_CHAR_L1D_FLUSH_TRIG2 (1ULL << 60)
|
||||
#define KVM_PPC_CPU_CHAR_L1D_THREAD_PRIV (1ULL << 59)
|
||||
#define KVM_PPC_CPU_CHAR_BR_HINT_HONOURED (1ULL << 58)
|
||||
#define KVM_PPC_CPU_CHAR_MTTRIG_THR_RECONF (1ULL << 57)
|
||||
#define KVM_PPC_CPU_CHAR_COUNT_CACHE_DIS (1ULL << 56)
|
||||
|
||||
#define KVM_PPC_CPU_BEHAV_FAVOUR_SECURITY (1ULL << 63)
|
||||
#define KVM_PPC_CPU_BEHAV_L1D_FLUSH_PR (1ULL << 62)
|
||||
#define KVM_PPC_CPU_BEHAV_BNDS_CHK_SPEC_BAR (1ULL << 61)
|
||||
|
||||
/* Per-vcpu XICS interrupt controller state */
|
||||
#define KVM_REG_PPC_ICP_STATE (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8c)
|
||||
|
||||
|
@ -6,10 +6,6 @@
|
||||
*
|
||||
* Copyright IBM Corp. 2008
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License (version 2 only)
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* Author(s): Carsten Otte <cotte@de.ibm.com>
|
||||
* Christian Borntraeger <borntraeger@de.ibm.com>
|
||||
*/
|
||||
@ -228,6 +224,7 @@ struct kvm_guest_debug_arch {
|
||||
#define KVM_SYNC_RICCB (1UL << 7)
|
||||
#define KVM_SYNC_FPRS (1UL << 8)
|
||||
#define KVM_SYNC_GSCB (1UL << 9)
|
||||
#define KVM_SYNC_BPBC (1UL << 10)
|
||||
/* length and alignment of the sdnx as a power of two */
|
||||
#define SDNXC 8
|
||||
#define SDNXL (1UL << SDNXC)
|
||||
@ -251,7 +248,9 @@ struct kvm_sync_regs {
|
||||
};
|
||||
__u8 reserved[512]; /* for future vector expansion */
|
||||
__u32 fpc; /* valid on KVM_SYNC_VRS or KVM_SYNC_FPRS */
|
||||
__u8 padding1[52]; /* riccb needs to be 64byte aligned */
|
||||
__u8 bpbc : 1; /* bp mode */
|
||||
__u8 reserved2 : 7;
|
||||
__u8 padding1[51]; /* riccb needs to be 64byte aligned */
|
||||
__u8 riccb[64]; /* runtime instrumentation controls block */
|
||||
__u8 padding2[192]; /* sdnx needs to be 256byte aligned */
|
||||
union {
|
||||
|
@ -4,9 +4,5 @@
|
||||
*
|
||||
* Copyright IBM Corp. 2008
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License (version 2 only)
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
|
||||
*/
|
||||
|
@ -630,9 +630,9 @@ struct kvm_s390_irq {
|
||||
|
||||
struct kvm_s390_irq_state {
|
||||
__u64 buf;
|
||||
__u32 flags;
|
||||
__u32 flags; /* will stay unused for compatibility reasons */
|
||||
__u32 len;
|
||||
__u32 reserved[4];
|
||||
__u32 reserved[4]; /* will stay unused for compatibility reasons */
|
||||
};
|
||||
|
||||
/* for KVM_SET_GUEST_DEBUG */
|
||||
@ -932,6 +932,8 @@ struct kvm_ppc_resize_hpt {
|
||||
#define KVM_CAP_HYPERV_SYNIC2 148
|
||||
#define KVM_CAP_HYPERV_VP_INDEX 149
|
||||
#define KVM_CAP_S390_AIS_MIGRATION 150
|
||||
#define KVM_CAP_PPC_GET_CPU_CHAR 151
|
||||
#define KVM_CAP_S390_BPB 152
|
||||
|
||||
#ifdef KVM_CAP_IRQ_ROUTING
|
||||
|
||||
@ -1261,6 +1263,8 @@ struct kvm_s390_ucas_mapping {
|
||||
#define KVM_PPC_CONFIGURE_V3_MMU _IOW(KVMIO, 0xaf, struct kvm_ppc_mmuv3_cfg)
|
||||
/* Available with KVM_CAP_PPC_RADIX_MMU */
|
||||
#define KVM_PPC_GET_RMMU_INFO _IOW(KVMIO, 0xb0, struct kvm_ppc_rmmu_info)
|
||||
/* Available with KVM_CAP_PPC_GET_CPU_CHAR */
|
||||
#define KVM_PPC_GET_CPU_CHAR _IOR(KVMIO, 0xb1, struct kvm_ppc_cpu_char)
|
||||
|
||||
/* ioctl for vm fd */
|
||||
#define KVM_CREATE_DEVICE _IOWR(KVMIO, 0xe0, struct kvm_create_device)
|
||||
|
@ -89,6 +89,7 @@ static void s390_cpu_reset(CPUState *s)
|
||||
CPUS390XState *env = &cpu->env;
|
||||
|
||||
env->pfault_token = -1UL;
|
||||
env->bpbc = false;
|
||||
scc->parent_reset(s);
|
||||
cpu->env.sigp_order = 0;
|
||||
s390_cpu_set_state(CPU_STATE_STOPPED, cpu);
|
||||
|
@ -93,6 +93,7 @@ struct CPUS390XState {
|
||||
|
||||
uint32_t fpc; /* floating-point control register */
|
||||
uint32_t cc_op;
|
||||
bool bpbc; /* branch prediction blocking */
|
||||
|
||||
float_status fpu_status; /* passed to softfloat lib */
|
||||
|
||||
@ -759,6 +760,8 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
|
||||
s390_cpu_virt_mem_rw(cpu, laddr, ar, dest, len, false)
|
||||
#define s390_cpu_virt_mem_write(cpu, laddr, ar, dest, len) \
|
||||
s390_cpu_virt_mem_rw(cpu, laddr, ar, dest, len, true)
|
||||
#define s390_cpu_virt_mem_check_read(cpu, laddr, ar, len) \
|
||||
s390_cpu_virt_mem_rw(cpu, laddr, ar, NULL, len, false)
|
||||
#define s390_cpu_virt_mem_check_write(cpu, laddr, ar, len) \
|
||||
s390_cpu_virt_mem_rw(cpu, laddr, ar, NULL, len, true)
|
||||
void s390_cpu_virt_mem_handle_exc(S390CPU *cpu, uintptr_t ra);
|
||||
|
@ -89,6 +89,8 @@ static const S390FeatDef s390_features[] = {
|
||||
FEAT_INIT("msa4-base", S390_FEAT_TYPE_STFL, 77, "Message-security-assist-extension-4 facility (excluding subfunctions)"),
|
||||
FEAT_INIT("edat2", S390_FEAT_TYPE_STFL, 78, "Enhanced-DAT facility 2"),
|
||||
FEAT_INIT("dfppc", S390_FEAT_TYPE_STFL, 80, "Decimal-floating-point packed-conversion facility"),
|
||||
FEAT_INIT("ppa15", S390_FEAT_TYPE_STFL, 81, "PPA15 is installed"),
|
||||
FEAT_INIT("bpb", S390_FEAT_TYPE_STFL, 82, "Branch prediction blocking"),
|
||||
FEAT_INIT("vx", S390_FEAT_TYPE_STFL, 129, "Vector facility"),
|
||||
FEAT_INIT("iep", S390_FEAT_TYPE_STFL, 130, "Instruction-execution-protection facility"),
|
||||
FEAT_INIT("sea_esop2", S390_FEAT_TYPE_STFL, 131, "Side-effect-access facility and Enhanced-suppression-on-protection facility 2"),
|
||||
|
@ -80,6 +80,8 @@ typedef enum {
|
||||
S390_FEAT_MSA_EXT_4,
|
||||
S390_FEAT_EDAT_2,
|
||||
S390_FEAT_DFP_PACKED_CONVERSION,
|
||||
S390_FEAT_PPA15,
|
||||
S390_FEAT_BPB,
|
||||
S390_FEAT_VECTOR,
|
||||
S390_FEAT_INSTRUCTION_EXEC_PROT,
|
||||
S390_FEAT_SIDE_EFFECT_ACCESS_ESOP2,
|
||||
|
@ -352,6 +352,8 @@ static uint16_t base_GEN14_GA1[] = {
|
||||
* support these features yet.
|
||||
*/
|
||||
static uint16_t full_GEN7_GA1[] = {
|
||||
S390_FEAT_PPA15,
|
||||
S390_FEAT_BPB,
|
||||
S390_FEAT_SIE_F2,
|
||||
S390_FEAT_SIE_SKEY,
|
||||
S390_FEAT_SIE_GPERE,
|
||||
|
@ -137,7 +137,7 @@ DEF_HELPER_FLAGS_4(lctlg, TCG_CALL_NO_WG, void, env, i32, i64, i32)
|
||||
DEF_HELPER_FLAGS_4(stctl, TCG_CALL_NO_WG, void, env, i32, i64, i32)
|
||||
DEF_HELPER_FLAGS_4(stctg, TCG_CALL_NO_WG, void, env, i32, i64, i32)
|
||||
DEF_HELPER_FLAGS_2(testblock, TCG_CALL_NO_WG, i32, env, i64)
|
||||
DEF_HELPER_FLAGS_2(tprot, TCG_CALL_NO_RWG, i32, i64, i64)
|
||||
DEF_HELPER_FLAGS_3(tprot, TCG_CALL_NO_WG, i32, env, i64, i64)
|
||||
DEF_HELPER_FLAGS_2(iske, TCG_CALL_NO_RWG_SE, i64, env, i64)
|
||||
DEF_HELPER_FLAGS_3(sske, TCG_CALL_NO_RWG, void, env, i64, i64)
|
||||
DEF_HELPER_FLAGS_2(rrbe, TCG_CALL_NO_RWG, i32, env, i64)
|
||||
|
@ -490,6 +490,11 @@ int kvm_arch_put_registers(CPUState *cs, int level)
|
||||
cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GSCB;
|
||||
}
|
||||
|
||||
if (can_sync_regs(cs, KVM_SYNC_BPBC)) {
|
||||
cs->kvm_run->s.regs.bpbc = env->bpbc;
|
||||
cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_BPBC;
|
||||
}
|
||||
|
||||
/* Finally the prefix */
|
||||
if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
|
||||
cs->kvm_run->s.regs.prefix = env->psa;
|
||||
@ -600,6 +605,10 @@ int kvm_arch_get_registers(CPUState *cs)
|
||||
memcpy(env->gscb, cs->kvm_run->s.regs.gscb, 32);
|
||||
}
|
||||
|
||||
if (can_sync_regs(cs, KVM_SYNC_BPBC)) {
|
||||
env->bpbc = cs->kvm_run->s.regs.bpbc;
|
||||
}
|
||||
|
||||
/* pfault parameters */
|
||||
if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
|
||||
env->pfault_token = cs->kvm_run->s.regs.pft;
|
||||
@ -2278,6 +2287,11 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
||||
clear_bit(S390_FEAT_CMM_NT, model->features);
|
||||
}
|
||||
|
||||
/* bpb needs kernel support for migration, VSIE and reset */
|
||||
if (!kvm_check_extension(kvm_state, KVM_CAP_S390_BPB)) {
|
||||
clear_bit(S390_FEAT_BPB, model->features);
|
||||
}
|
||||
|
||||
/* We emulate a zPCI bus and AEN, therefore we don't need HW support */
|
||||
if (pci_available) {
|
||||
set_bit(S390_FEAT_ZPCI, model->features);
|
||||
|
@ -194,6 +194,22 @@ const VMStateDescription vmstate_gscb = {
|
||||
}
|
||||
};
|
||||
|
||||
static bool bpbc_needed(void *opaque)
|
||||
{
|
||||
return s390_has_feat(S390_FEAT_BPB);
|
||||
}
|
||||
|
||||
const VMStateDescription vmstate_bpbc = {
|
||||
.name = "cpu/bpbc",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.needed = bpbc_needed,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_BOOL(env.bpbc, S390CPU),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
const VMStateDescription vmstate_s390_cpu = {
|
||||
.name = "cpu",
|
||||
.post_load = cpu_post_load,
|
||||
@ -228,6 +244,7 @@ const VMStateDescription vmstate_s390_cpu = {
|
||||
&vmstate_riccb,
|
||||
&vmstate_exval,
|
||||
&vmstate_gscb,
|
||||
&vmstate_bpbc,
|
||||
NULL
|
||||
},
|
||||
};
|
||||
|
@ -1717,10 +1717,44 @@ uint32_t HELPER(testblock)(CPUS390XState *env, uint64_t real_addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t HELPER(tprot)(uint64_t a1, uint64_t a2)
|
||||
uint32_t HELPER(tprot)(CPUS390XState *env, uint64_t a1, uint64_t a2)
|
||||
{
|
||||
/* XXX implement */
|
||||
return 0;
|
||||
S390CPU *cpu = s390_env_get_cpu(env);
|
||||
CPUState *cs = CPU(cpu);
|
||||
|
||||
/*
|
||||
* TODO: we currently don't handle all access protection types
|
||||
* (including access-list and key-controlled) as well as AR mode.
|
||||
*/
|
||||
if (!s390_cpu_virt_mem_check_write(cpu, a1, 0, 1)) {
|
||||
/* Fetching permitted; storing permitted */
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (env->int_pgm_code == PGM_PROTECTION) {
|
||||
/* retry if reading is possible */
|
||||
cs->exception_index = 0;
|
||||
if (!s390_cpu_virt_mem_check_read(cpu, a1, 0, 1)) {
|
||||
/* Fetching permitted; storing not permitted */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
switch (env->int_pgm_code) {
|
||||
case PGM_PROTECTION:
|
||||
/* Fetching not permitted; storing not permitted */
|
||||
cs->exception_index = 0;
|
||||
return 2;
|
||||
case PGM_ADDRESSING:
|
||||
case PGM_TRANS_SPEC:
|
||||
/* exceptions forwarded to the guest */
|
||||
s390_cpu_virt_mem_handle_exc(cpu, GETPC());
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Translation not available */
|
||||
cs->exception_index = 0;
|
||||
return 3;
|
||||
}
|
||||
|
||||
/* insert storage key extended */
|
||||
|
@ -4532,7 +4532,7 @@ static ExitStatus op_testblock(DisasContext *s, DisasOps *o)
|
||||
|
||||
static ExitStatus op_tprot(DisasContext *s, DisasOps *o)
|
||||
{
|
||||
gen_helper_tprot(cc_op, o->addr1, o->in2);
|
||||
gen_helper_tprot(cc_op, cpu_env, o->addr1, o->in2);
|
||||
set_cc_static(s);
|
||||
return NO_EXIT;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user