mirror of https://gitee.com/openkylin/qemu.git
target-arm queue:
* accel/tcg: Use correct test when looking in victim TLB for code * bcm2835_aux: Swap RX and TX interrupt assignments * hw/arm/bcm2836: Mark the bcm2836 / bcm2837 devices with user_creatable = false * hw/intc/arm_gic: Fix handling of GICD_ITARGETSR * hw/intc/arm_gic: Check interrupt number in gic_deactivate_irq() * aspeed: Implement write-1-{set, clear} for AST2500 strapping * target/arm: Fix LD1W and LDFF1W (scalar plus vector) -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJbTMoMAAoJEDwlJe0UNgzeuUcQAIN8zicyj69ef1Ax0wNvLKFQ LYuLNkTuO8OHYGt/BlvsRJzZVMuESwQzc9Hx62+zhALLgNOwK4kBwthw5HDRzNFH XTaOj1uHejjFas2AT6PiIZqvupOJyX8ns7aQJL+OHyR0JrTVg7Ig4itWw3ePpIl2 mga8JUBf3Mxf7i1DpWDmtWs++CaXQg7fDjSDziAdeO5qyu17TLv+twyoFhynlhe1 q9EKm/Qmei09DnYizFrj525E7fEDfT3y9tv/QadO0vOwPdxAs1MQLs6ypEGTK5wR mkJnfTIls/Q6Pl6JebezmkGJ6r30A7IPDwwg2vaEAbB7DM0spkF7LZJrynu8IwLF XACcYfJbbFFUgdDFKce9BTkS9FyC99erot7F5OlqgCFhr4+A69MEKLxQSiQMqeo3 Q4JzO1aqqWyxkx8xJDJun98P7XcNefwnFizhr3NQm6UWs2miB+E03LiQumYA4ra0 Y5mqDm1LgBquDnS50sbA45oBpjLRmR/29LIKz5WYG5J7FclrnxFFhzWqt2kdoMJN QmOMzlzS4Z55Jym4CdNs7ZCRroL6vELXQwjXOVOjp2fdPcGl295v7dOFPqj1V0eB 7CQZmxGUV2OzLOsBSHiUq6t1snXzmNVd269sL7vUkdcO0od27cIJbrGDToSb4OnA 3zk5U0r/mF+kfd7AU55x =eKFb -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20180716' into staging target-arm queue: * accel/tcg: Use correct test when looking in victim TLB for code * bcm2835_aux: Swap RX and TX interrupt assignments * hw/arm/bcm2836: Mark the bcm2836 / bcm2837 devices with user_creatable = false * hw/intc/arm_gic: Fix handling of GICD_ITARGETSR * hw/intc/arm_gic: Check interrupt number in gic_deactivate_irq() * aspeed: Implement write-1-{set, clear} for AST2500 strapping * target/arm: Fix LD1W and LDFF1W (scalar plus vector) # gpg: Signature made Mon 16 Jul 2018 17:38:36 BST # gpg: using RSA key 3C2525ED14360CDE # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" # gpg: aka "Peter Maydell <pmaydell@gmail.com>" # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * remotes/pmaydell/tags/pull-target-arm-20180716: accel/tcg: Assert that tlb fill gave us a valid TLB entry accel/tcg: Use correct test when looking in victim TLB for code bcm2835_aux: Swap RX and TX interrupt assignments hw/arm/bcm2836: Mark the bcm2836 / bcm2837 devices with user_creatable = false hw/intc/arm_gic: Fix handling of GICD_ITARGETSR hw/intc/arm_gic: Check interrupt number in gic_deactivate_irq() aspeed: Implement write-1-{set, clear} for AST2500 strapping target/arm: Fix LD1W and LDFF1W (scalar plus vector) Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
1310df8b99
|
@ -967,13 +967,13 @@ tb_page_addr_t get_page_addr_code(CPUArchState *env, target_ulong addr)
|
|||
index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
|
||||
mmu_idx = cpu_mmu_index(env, true);
|
||||
if (unlikely(!tlb_hit(env->tlb_table[mmu_idx][index].addr_code, addr))) {
|
||||
if (!VICTIM_TLB_HIT(addr_read, addr)) {
|
||||
if (!VICTIM_TLB_HIT(addr_code, addr)) {
|
||||
tlb_fill(ENV_GET_CPU(env), addr, 0, MMU_INST_FETCH, mmu_idx, 0);
|
||||
}
|
||||
assert(tlb_hit(env->tlb_table[mmu_idx][index].addr_code, addr));
|
||||
}
|
||||
|
||||
if (unlikely((env->tlb_table[mmu_idx][index].addr_code &
|
||||
(TLB_RECHECK | TLB_INVALID_MASK)) == TLB_RECHECK)) {
|
||||
if (unlikely(env->tlb_table[mmu_idx][index].addr_code & TLB_RECHECK)) {
|
||||
/*
|
||||
* This is a TLB_RECHECK access, where the MMU protection
|
||||
* covers a smaller range than a target page, and we must
|
||||
|
|
|
@ -185,6 +185,8 @@ static void bcm283x_class_init(ObjectClass *oc, void *data)
|
|||
bc->info = data;
|
||||
dc->realize = bcm2836_realize;
|
||||
dc->props = bcm2836_props;
|
||||
/* Reason: Must be wired up in code (see raspi_init() function) */
|
||||
dc->user_creatable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo bcm283x_type_info = {
|
||||
|
|
|
@ -39,8 +39,8 @@
|
|||
#define AUX_MU_BAUD_REG 0x68
|
||||
|
||||
/* bits in IER/IIR registers */
|
||||
#define TX_INT 0x1
|
||||
#define RX_INT 0x2
|
||||
#define RX_INT 0x1
|
||||
#define TX_INT 0x2
|
||||
|
||||
static void bcm2835_aux_update(BCM2835AuxState *s)
|
||||
{
|
||||
|
|
|
@ -543,7 +543,21 @@ static bool gic_eoi_split(GICState *s, int cpu, MemTxAttrs attrs)
|
|||
static void gic_deactivate_irq(GICState *s, int cpu, int irq, MemTxAttrs attrs)
|
||||
{
|
||||
int cm = 1 << cpu;
|
||||
int group = gic_has_groups(s) && GIC_TEST_GROUP(irq, cm);
|
||||
int group;
|
||||
|
||||
if (irq >= s->num_irq) {
|
||||
/*
|
||||
* This handles two cases:
|
||||
* 1. If software writes the ID of a spurious interrupt [ie 1023]
|
||||
* to the GICC_DIR, the GIC ignores that write.
|
||||
* 2. If software writes the number of a non-existent interrupt
|
||||
* this must be a subcase of "value written is not an active interrupt"
|
||||
* and so this is UNPREDICTABLE. We choose to ignore it.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
group = gic_has_groups(s) && GIC_TEST_GROUP(irq, cm);
|
||||
|
||||
if (!gic_eoi_split(s, cpu, attrs)) {
|
||||
/* This is UNPREDICTABLE; we choose to ignore it */
|
||||
|
@ -737,7 +751,9 @@ static uint32_t gic_dist_readb(void *opaque, hwaddr offset, MemTxAttrs attrs)
|
|||
if (irq >= s->num_irq) {
|
||||
goto bad_reg;
|
||||
}
|
||||
if (irq >= 29 && irq <= 31) {
|
||||
if (irq < 29 && s->revision == REV_11MPCORE) {
|
||||
res = 0;
|
||||
} else if (irq < GIC_INTERNAL) {
|
||||
res = cm;
|
||||
} else {
|
||||
res = GIC_TARGET(irq);
|
||||
|
@ -1000,7 +1016,7 @@ static void gic_dist_writeb(void *opaque, hwaddr offset,
|
|||
if (irq >= s->num_irq) {
|
||||
goto bad_reg;
|
||||
}
|
||||
if (irq < 29) {
|
||||
if (irq < 29 && s->revision == REV_11MPCORE) {
|
||||
value = 0;
|
||||
} else if (irq < GIC_INTERNAL) {
|
||||
value = ALL_CPU_MASK;
|
||||
|
|
|
@ -247,11 +247,26 @@ static void aspeed_scu_write(void *opaque, hwaddr offset, uint64_t data,
|
|||
s->regs[reg] = data;
|
||||
aspeed_scu_set_apb_freq(s);
|
||||
break;
|
||||
|
||||
case HW_STRAP1:
|
||||
if (ASPEED_IS_AST2500(s->regs[SILICON_REV])) {
|
||||
s->regs[HW_STRAP1] |= data;
|
||||
return;
|
||||
}
|
||||
/* Jump to assignment below */
|
||||
break;
|
||||
case SILICON_REV:
|
||||
if (ASPEED_IS_AST2500(s->regs[SILICON_REV])) {
|
||||
s->regs[HW_STRAP1] &= ~data;
|
||||
} else {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Write to read-only offset 0x%" HWADDR_PRIx "\n",
|
||||
__func__, offset);
|
||||
}
|
||||
/* Avoid assignment below, we've handled everything */
|
||||
return;
|
||||
case FREQ_CNTR_EVAL:
|
||||
case VGA_SCRATCH1 ... VGA_SCRATCH8:
|
||||
case RNG_DATA:
|
||||
case SILICON_REV:
|
||||
case FREE_CNTR4:
|
||||
case FREE_CNTR4_EXT:
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
|
|
|
@ -41,6 +41,8 @@ typedef struct AspeedSCUState {
|
|||
#define AST2500_A0_SILICON_REV 0x04000303U
|
||||
#define AST2500_A1_SILICON_REV 0x04010303U
|
||||
|
||||
#define ASPEED_IS_AST2500(si_rev) ((((si_rev) >> 24) & 0xff) == 0x04)
|
||||
|
||||
extern bool is_supported_silicon_rev(uint32_t silicon_rev);
|
||||
|
||||
#define ASPEED_SCU_PROT_KEY 0x1688A8A8
|
||||
|
|
|
@ -4459,7 +4459,7 @@ void HELPER(NAME)(CPUARMState *env, void *vd, void *vg, void *vm, \
|
|||
intptr_t i, oprsz = simd_oprsz(desc); \
|
||||
unsigned scale = simd_data(desc); \
|
||||
uintptr_t ra = GETPC(); \
|
||||
for (i = 0; i < oprsz; i++) { \
|
||||
for (i = 0; i < oprsz; ) { \
|
||||
uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
|
||||
do { \
|
||||
TYPEM m = 0; \
|
||||
|
@ -4540,7 +4540,7 @@ void HELPER(NAME)(CPUARMState *env, void *vd, void *vg, void *vm, \
|
|||
uintptr_t ra = GETPC(); \
|
||||
bool first = true; \
|
||||
mmap_lock(); \
|
||||
for (i = 0; i < oprsz; i++) { \
|
||||
for (i = 0; i < oprsz; ) { \
|
||||
uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
|
||||
do { \
|
||||
TYPEM m = 0; \
|
||||
|
|
Loading…
Reference in New Issue