mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-target-arm-20220428' of https://git.linaro.org/people/pmaydell/qemu-arm into staging
target-arm queue: * refactor to use tcg_constant where appropriate * Advertise support for FEAT_TTL and FEAT_BBM level 2 * smmuv3: Cache event fault record * smmuv3: Add space in guest error message * smmuv3: Advertise support for SMMUv3.2-BBML2 # -----BEGIN PGP SIGNATURE----- # # iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmJqpu4ZHHBldGVyLm1h # eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3pOQD/9G190+ntJm4Vndz0I6bCDP # svDrWwsioOJ4q5Pah6517JACkwN5sx0adMGyAeRC3Kcbz5B2141vv9hJOnJmLB1D # l6KbH8XZaftC0B8fXsPkaH6XEdBHGz6YbOZaLOTwmFqF9d18OFW4d8+CAvfldZRc # +DYeolEhoL9eLTS16BlXPxb0LajQHhbN1Xdu3t8CGh31C52ZrG4h8cus6YMEDjfA # rfBthh/2QvVFmDedIfX4QrlImCTs+bTaSkhUBmX6qakWII0QykItgQTEZ8IHEr8/ # QmG+xlkP1MmffyHU3F4inEVXpjCSzula4ycZpNVGsrTHYxLBzsTSD+EzicLHMZSt # 64tQhLxPjAzC1MEHp7bJHyQXon7REWd6u1jPRlMWTGpZqbMMchBPjFrsxK3YPdvi # a/8KIulXuX+GjzbOIHnpttIy+U0UrjTEyxjpk+Ay2iZ+U6+hA3i2ni++dzq9dYb6 # IiCl+o29r/7fNaWpG3b38kn9vpxjwAAw+qfwwSqyM+8/KMirgJ8rpEmUPei/h7fy # vqpNlVxd1+Tzb3ljCXNRriZ05xo5I9LIb+dLAig1orENS7w3SzW/GnM+S7raOwQb # u9mxNmbQJ1MhkjNC/6wzniBre6EBs31X2GIWeuiWe/js2YFPQC06b1WwIc/bYNUv # anbECOS34mtxbExFfdlxUQ== # =IPEn # -----END PGP SIGNATURE----- # gpg: Signature made Thu 28 Apr 2022 07:38:38 AM PDT # gpg: using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE # gpg: issuer "peter.maydell@linaro.org" # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [full] # gpg: aka "Peter Maydell <pmaydell@gmail.com>" [full] # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [full] * tag 'pull-target-arm-20220428' of https://git.linaro.org/people/pmaydell/qemu-arm: (54 commits) hw/arm/smmuv3: Advertise support for SMMUv3.2-BBML2 target/arm: Advertise support for FEAT_BBM level 2 target/arm: Advertise support for FEAT_TTL hw/arm/smmuv3: Add space in guest error message hw/arm/smmuv3: Cache event fault record target/arm: Use field names for accessing DBGWCRn target/arm: Disable cryptographic instructions when neon is disabled target/arm: Use tcg_constant for vector descriptor target/arm: Use tcg_constant for do_brk{2,3} target/arm: Use tcg_constant for predicate descriptors target/arm: Use tcg_constant in do_zzi_{sat, ool}, do_fp_imm target/arm: Use tcg_constant in SUBR target/arm: Use tcg_constant in LD1, ST1 target/arm: Use tcg_constant in WHILE target/arm: Use tcg_constant in do_clast_scalar target/arm: Use tcg_constant in {incr, wrap}_last_active target/arm: Use tcg_constant in FCPY, CPY target/arm: Use tcg_constant in SINCDEC, INCDEC target/arm: Use tcg_constant for trans_INDEX_* target/arm: Use tcg_constant in trans_CSEL ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
@@ -9,6 +9,7 @@ the following architecture extensions:
|
||||
- FEAT_AA32HPD (AArch32 hierarchical permission disables)
|
||||
- FEAT_AA32I8MM (AArch32 Int8 matrix multiplication instructions)
|
||||
- FEAT_AES (AESD and AESE instructions)
|
||||
- FEAT_BBM at level 2 (Translation table break-before-make levels)
|
||||
- FEAT_BF16 (AArch64 BFloat16 instructions)
|
||||
- FEAT_BTI (Branch Target Identification)
|
||||
- FEAT_DIT (Data Independent Timing instructions)
|
||||
@@ -54,6 +55,7 @@ the following architecture extensions:
|
||||
- FEAT_TLBIOS (TLB invalidate instructions in Outer Shareable domain)
|
||||
- FEAT_TLBIRANGE (TLB invalidate range instructions)
|
||||
- FEAT_TTCNP (Translation table Common not private translations)
|
||||
- FEAT_TTL (Translation Table Level)
|
||||
- FEAT_TTST (Small translation tables)
|
||||
- FEAT_UAO (Unprivileged Access Override control)
|
||||
- FEAT_VHE (Virtualization Host Extensions)
|
||||
|
||||
@@ -56,6 +56,7 @@ REG32(IDR2, 0x8)
|
||||
REG32(IDR3, 0xc)
|
||||
FIELD(IDR3, HAD, 2, 1);
|
||||
FIELD(IDR3, RIL, 10, 1);
|
||||
FIELD(IDR3, BBML, 11, 2);
|
||||
REG32(IDR4, 0x10)
|
||||
REG32(IDR5, 0x14)
|
||||
FIELD(IDR5, OAS, 0, 3);
|
||||
@@ -387,7 +388,6 @@ typedef struct SMMUEventInfo {
|
||||
SMMUEventType type;
|
||||
uint32_t sid;
|
||||
bool recorded;
|
||||
bool record_trans_faults;
|
||||
bool inval_ste_allowed;
|
||||
union {
|
||||
struct {
|
||||
|
||||
+9
-8
@@ -259,6 +259,7 @@ static void smmuv3_init_regs(SMMUv3State *s)
|
||||
|
||||
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
|
||||
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, HAD, 1);
|
||||
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, BBML, 2);
|
||||
|
||||
/* 4K, 16K and 64K granule support */
|
||||
s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN4K, 1);
|
||||
@@ -527,7 +528,7 @@ static int decode_cd(SMMUTransCfg *cfg, CD *cd, SMMUEventInfo *event)
|
||||
trace_smmuv3_decode_cd_tt(i, tt->tsz, tt->ttb, tt->granule_sz, tt->had);
|
||||
}
|
||||
|
||||
event->record_trans_faults = CD_R(cd);
|
||||
cfg->record_faults = CD_R(cd);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -680,7 +681,7 @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
|
||||
|
||||
tt = select_tt(cfg, addr);
|
||||
if (!tt) {
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_TRANSLATION;
|
||||
event.u.f_translation.addr = addr;
|
||||
event.u.f_translation.rnw = flag & 0x1;
|
||||
@@ -696,7 +697,7 @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
|
||||
if (cached_entry) {
|
||||
if ((flag & IOMMU_WO) && !(cached_entry->entry.perm & IOMMU_WO)) {
|
||||
status = SMMU_TRANS_ERROR;
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_PERMISSION;
|
||||
event.u.f_permission.addr = addr;
|
||||
event.u.f_permission.rnw = flag & 0x1;
|
||||
@@ -720,28 +721,28 @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
|
||||
event.u.f_walk_eabt.addr2 = ptw_info.addr;
|
||||
break;
|
||||
case SMMU_PTW_ERR_TRANSLATION:
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_TRANSLATION;
|
||||
event.u.f_translation.addr = addr;
|
||||
event.u.f_translation.rnw = flag & 0x1;
|
||||
}
|
||||
break;
|
||||
case SMMU_PTW_ERR_ADDR_SIZE:
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_ADDR_SIZE;
|
||||
event.u.f_addr_size.addr = addr;
|
||||
event.u.f_addr_size.rnw = flag & 0x1;
|
||||
}
|
||||
break;
|
||||
case SMMU_PTW_ERR_ACCESS:
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_ACCESS;
|
||||
event.u.f_access.addr = addr;
|
||||
event.u.f_access.rnw = flag & 0x1;
|
||||
}
|
||||
break;
|
||||
case SMMU_PTW_ERR_PERMISSION:
|
||||
if (event.record_trans_faults) {
|
||||
if (cfg->record_faults) {
|
||||
event.type = SMMU_EVT_F_PERMISSION;
|
||||
event.u.f_permission.addr = addr;
|
||||
event.u.f_permission.rnw = flag & 0x1;
|
||||
@@ -786,7 +787,7 @@ epilogue:
|
||||
break;
|
||||
case SMMU_TRANS_ERROR:
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s translation failed for iova=0x%"PRIx64"(%s)\n",
|
||||
"%s translation failed for iova=0x%"PRIx64" (%s)\n",
|
||||
mr->parent_obj.name, addr, smmu_event_string(event.type));
|
||||
smmuv3_record_event(s, &event);
|
||||
break;
|
||||
|
||||
@@ -71,6 +71,7 @@ typedef struct SMMUTransCfg {
|
||||
bool disabled; /* smmu is disabled */
|
||||
bool bypassed; /* translation is bypassed */
|
||||
bool aborted; /* translation is aborted */
|
||||
bool record_faults; /* record fault events */
|
||||
uint64_t ttb; /* TT base address */
|
||||
uint8_t oas; /* output address width */
|
||||
uint8_t tbi; /* Top Byte Ignore */
|
||||
|
||||
@@ -1587,6 +1587,12 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||
unset_feature(env, ARM_FEATURE_NEON);
|
||||
|
||||
t = cpu->isar.id_aa64isar0;
|
||||
t = FIELD_DP64(t, ID_AA64ISAR0, AES, 0);
|
||||
t = FIELD_DP64(t, ID_AA64ISAR0, SHA1, 0);
|
||||
t = FIELD_DP64(t, ID_AA64ISAR0, SHA2, 0);
|
||||
t = FIELD_DP64(t, ID_AA64ISAR0, SHA3, 0);
|
||||
t = FIELD_DP64(t, ID_AA64ISAR0, SM3, 0);
|
||||
t = FIELD_DP64(t, ID_AA64ISAR0, SM4, 0);
|
||||
t = FIELD_DP64(t, ID_AA64ISAR0, DP, 0);
|
||||
cpu->isar.id_aa64isar0 = t;
|
||||
|
||||
@@ -1601,6 +1607,9 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||
cpu->isar.id_aa64pfr0 = t;
|
||||
|
||||
u = cpu->isar.id_isar5;
|
||||
u = FIELD_DP32(u, ID_ISAR5, AES, 0);
|
||||
u = FIELD_DP32(u, ID_ISAR5, SHA1, 0);
|
||||
u = FIELD_DP32(u, ID_ISAR5, SHA2, 0);
|
||||
u = FIELD_DP32(u, ID_ISAR5, RDM, 0);
|
||||
u = FIELD_DP32(u, ID_ISAR5, VCMA, 0);
|
||||
cpu->isar.id_isar5 = u;
|
||||
|
||||
@@ -839,6 +839,8 @@ static void aarch64_max_initfn(Object *obj)
|
||||
t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1); /* TTCNP */
|
||||
t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* TTST */
|
||||
t = FIELD_DP64(t, ID_AA64MMFR2, VARANGE, 1); /* FEAT_LVA */
|
||||
t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1); /* FEAT_TTL */
|
||||
t = FIELD_DP64(t, ID_AA64MMFR2, BBM, 2); /* FEAT_BBM at level 2 */
|
||||
cpu->isar.id_aa64mmfr2 = t;
|
||||
|
||||
t = cpu->isar.id_aa64zfr0;
|
||||
|
||||
@@ -143,9 +143,9 @@ static bool bp_wp_matches(ARMCPU *cpu, int n, bool is_wp)
|
||||
* Non-Secure to simplify the code slightly compared to the full
|
||||
* table in the ARM ARM.
|
||||
*/
|
||||
pac = extract64(cr, 1, 2);
|
||||
hmc = extract64(cr, 13, 1);
|
||||
ssc = extract64(cr, 14, 2);
|
||||
pac = FIELD_EX64(cr, DBGWCR, PAC);
|
||||
hmc = FIELD_EX64(cr, DBGWCR, HMC);
|
||||
ssc = FIELD_EX64(cr, DBGWCR, SSC);
|
||||
|
||||
switch (ssc) {
|
||||
case 0:
|
||||
@@ -184,8 +184,8 @@ static bool bp_wp_matches(ARMCPU *cpu, int n, bool is_wp)
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
wt = extract64(cr, 20, 1);
|
||||
lbn = extract64(cr, 16, 4);
|
||||
wt = FIELD_EX64(cr, DBGWCR, WT);
|
||||
lbn = FIELD_EX64(cr, DBGWCR, LBN);
|
||||
|
||||
if (wt && !linked_bp_matches(cpu, lbn)) {
|
||||
return false;
|
||||
|
||||
+4
-4
@@ -6320,12 +6320,12 @@ void hw_watchpoint_update(ARMCPU *cpu, int n)
|
||||
env->cpu_watchpoint[n] = NULL;
|
||||
}
|
||||
|
||||
if (!extract64(wcr, 0, 1)) {
|
||||
if (!FIELD_EX64(wcr, DBGWCR, E)) {
|
||||
/* E bit clear : watchpoint disabled */
|
||||
return;
|
||||
}
|
||||
|
||||
switch (extract64(wcr, 3, 2)) {
|
||||
switch (FIELD_EX64(wcr, DBGWCR, LSC)) {
|
||||
case 0:
|
||||
/* LSC 00 is reserved and must behave as if the wp is disabled */
|
||||
return;
|
||||
@@ -6344,7 +6344,7 @@ void hw_watchpoint_update(ARMCPU *cpu, int n)
|
||||
* CONSTRAINED UNPREDICTABLE; we opt to ignore BAS in this case,
|
||||
* thus generating a watchpoint for every byte in the masked region.
|
||||
*/
|
||||
mask = extract64(wcr, 24, 4);
|
||||
mask = FIELD_EX64(wcr, DBGWCR, MASK);
|
||||
if (mask == 1 || mask == 2) {
|
||||
/* Reserved values of MASK; we must act as if the mask value was
|
||||
* some non-reserved value, or as if the watchpoint were disabled.
|
||||
@@ -6361,7 +6361,7 @@ void hw_watchpoint_update(ARMCPU *cpu, int n)
|
||||
wvr &= ~(len - 1);
|
||||
} else {
|
||||
/* Watchpoint covers bytes defined by the byte address select bits */
|
||||
int bas = extract64(wcr, 5, 8);
|
||||
int bas = FIELD_EX64(wcr, DBGWCR, BAS);
|
||||
int basstart;
|
||||
|
||||
if (extract64(wvr, 2, 1)) {
|
||||
|
||||
@@ -81,6 +81,18 @@ FIELD(V7M_EXCRET, RES1, 7, 25) /* including the must-be-1 prefix */
|
||||
*/
|
||||
#define FNC_RETURN_MIN_MAGIC 0xfefffffe
|
||||
|
||||
/* Bit definitions for DBGWCRn and DBGWCRn_EL1 */
|
||||
FIELD(DBGWCR, E, 0, 1)
|
||||
FIELD(DBGWCR, PAC, 1, 2)
|
||||
FIELD(DBGWCR, LSC, 3, 2)
|
||||
FIELD(DBGWCR, BAS, 5, 8)
|
||||
FIELD(DBGWCR, HMC, 13, 1)
|
||||
FIELD(DBGWCR, SSC, 14, 2)
|
||||
FIELD(DBGWCR, LBN, 16, 4)
|
||||
FIELD(DBGWCR, WT, 20, 1)
|
||||
FIELD(DBGWCR, MASK, 24, 5)
|
||||
FIELD(DBGWCR, SSCE, 29, 1)
|
||||
|
||||
/* We use a few fake FSR values for internal purposes in M profile.
|
||||
* M profile cores don't have A/R format FSRs, but currently our
|
||||
* get_phys_addr() code assumes A/R profile and reports failures via
|
||||
|
||||
+7
-7
@@ -208,7 +208,7 @@ static int insert_hw_watchpoint(target_ulong addr,
|
||||
target_ulong len, int type)
|
||||
{
|
||||
HWWatchpoint wp = {
|
||||
.wcr = 1, /* E=1, enable */
|
||||
.wcr = R_DBGWCR_E_MASK, /* E=1, enable */
|
||||
.wvr = addr & (~0x7ULL),
|
||||
.details = { .vaddr = addr, .len = len }
|
||||
};
|
||||
@@ -221,19 +221,19 @@ static int insert_hw_watchpoint(target_ulong addr,
|
||||
* HMC=0 SSC=0 PAC=3 will hit EL0 or EL1, any security state,
|
||||
* valid whether EL3 is implemented or not
|
||||
*/
|
||||
wp.wcr = deposit32(wp.wcr, 1, 2, 3);
|
||||
wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, PAC, 3);
|
||||
|
||||
switch (type) {
|
||||
case GDB_WATCHPOINT_READ:
|
||||
wp.wcr = deposit32(wp.wcr, 3, 2, 1);
|
||||
wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, LSC, 1);
|
||||
wp.details.flags = BP_MEM_READ;
|
||||
break;
|
||||
case GDB_WATCHPOINT_WRITE:
|
||||
wp.wcr = deposit32(wp.wcr, 3, 2, 2);
|
||||
wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, LSC, 2);
|
||||
wp.details.flags = BP_MEM_WRITE;
|
||||
break;
|
||||
case GDB_WATCHPOINT_ACCESS:
|
||||
wp.wcr = deposit32(wp.wcr, 3, 2, 3);
|
||||
wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, LSC, 3);
|
||||
wp.details.flags = BP_MEM_ACCESS;
|
||||
break;
|
||||
default:
|
||||
@@ -252,8 +252,8 @@ static int insert_hw_watchpoint(target_ulong addr,
|
||||
int bits = ctz64(len);
|
||||
|
||||
wp.wvr &= ~((1 << bits) - 1);
|
||||
wp.wcr = deposit32(wp.wcr, 24, 4, bits);
|
||||
wp.wcr = deposit32(wp.wcr, 5, 8, 0xff);
|
||||
wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, MASK, bits);
|
||||
wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, BAS, 0xff);
|
||||
} else {
|
||||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
+90
-211
File diff suppressed because it is too large
Load Diff
+70
-132
File diff suppressed because it is too large
Load Diff
+81
-163
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user