RISC-V Patches for 4.0-rc3, v2
This patch set contains a pair of tightly coupled PLIC bug fixes: * We were calculating the PLIC addresses incorrectly. * We were installing the wrong number of PLIC interrupts. The two bugs togther resulted in a mostly-working system, but they're impossible to seperate because fixing one bug would result in significant breakage. As a result they're in the same patch. There is also a cleanup to use qemu_log_mask(LOG_GUEST_ERROR,...) for error reporting. As far as I know these are the last outstanding RISC-V patches for 4.0. v2 no longer fails "make check" for me... sorry! -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEAM520YNJYN/OiG3470yhUCzLq0EFAlymonUTHHBhbG1lckBk YWJiZWx0LmNvbQAKCRDvTKFQLMurQX+kD/wIOSTb7ZBAu5Jbs9JckaGhom9Kfu1+ D9Pxs+QHnXxvxzksTYIWtOVJ8otYvoz/zt8OntbBO9J5eHeHe5aQQ1B+L8+2+Z8Z yVcKwu7UPHTY0u6gsE7tAGIhw/pPK+bSM0BA7jOTV6VB4wjLB4KnHbNZytiBTgg7 OzFDqxCgjva8lNjjUJO1vfdGBHfacHEEfVOGxWkotaXw6mXaSzd+lbPGtnwLsca+ NJOObR5Z25BIzS7R8Ud9epT84sK/iwffbZbfEUZ/cIu3Ghd57xl0diieZGCBJ5Xf 6Ngq8Pae6hP0mK4DhpKdN+OMpEqX95Vd+azBxxOLY2ITNaKC+v68t6k58a/kTL77 reBAGU8VKgcHTFx1atG7Sbfq/aOm53McVHOleWZL4W+peqhH2z5TUcGrSfvhIs/4 4rp7d2zo4J7R42TI2RO8HeLF9+fX857Qwz4GICaFrSZ5m7eoiZirt27YzjUutf6b D1wTb0ZEJh3b2WZrne+mrV0p/nT1lgCk5byOjk20RTXeWVC5zEX8JiMt47qx1VVx 1KvnNy35aGUc872Fsa7zNvtErBXQ7UosuWZlLQh1dLBPXQ85/YY6W9fkgYLc8/LD Lc5W6kf3vfWYajeVYLpFB/kF9QuU3f0OzZrnG+K/Vr68IhBuPlJTox7vQERlmp2S bRzEh/91Indv0w== =APjM -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/palmer/tags/riscv-for-master-4.0-rc3-v2' into staging RISC-V Patches for 4.0-rc3, v2 This patch set contains a pair of tightly coupled PLIC bug fixes: * We were calculating the PLIC addresses incorrectly. * We were installing the wrong number of PLIC interrupts. The two bugs togther resulted in a mostly-working system, but they're impossible to seperate because fixing one bug would result in significant breakage. As a result they're in the same patch. There is also a cleanup to use qemu_log_mask(LOG_GUEST_ERROR,...) for error reporting. As far as I know these are the last outstanding RISC-V patches for 4.0. v2 no longer fails "make check" for me... sorry! # gpg: Signature made Fri 05 Apr 2019 01:33:57 BST # gpg: using RSA key 00CE76D1834960DFCE886DF8EF4CA1502CCBAB41 # gpg: issuer "palmer@dabbelt.com" # gpg: Good signature from "Palmer Dabbelt <palmer@dabbelt.com>" [unknown] # gpg: aka "Palmer Dabbelt <palmer@sifive.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 00CE 76D1 8349 60DF CE88 6DF8 EF4C A150 2CCB AB41 * remotes/palmer/tags/riscv-for-master-4.0-rc3-v2: riscv: plic: Log guest errors riscv: plic: Fix incorrect irq calculation Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
10546e09e1
@ -207,7 +207,7 @@ static uint64_t sifive_plic_read(void *opaque, hwaddr addr, unsigned size)
|
||||
if (addr >= plic->priority_base && /* 4 bytes per source */
|
||||
addr < plic->priority_base + (plic->num_sources << 2))
|
||||
{
|
||||
uint32_t irq = (addr - plic->priority_base) >> 2;
|
||||
uint32_t irq = ((addr - plic->priority_base) >> 2) + 1;
|
||||
if (RISCV_DEBUG_PLIC) {
|
||||
qemu_log("plic: read priority: irq=%d priority=%d\n",
|
||||
irq, plic->source_priority[irq]);
|
||||
@ -263,7 +263,9 @@ static uint64_t sifive_plic_read(void *opaque, hwaddr addr, unsigned size)
|
||||
}
|
||||
|
||||
err:
|
||||
error_report("plic: invalid register read: %08x", (uint32_t)addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Invalid register read 0x%" HWADDR_PRIx "\n",
|
||||
__func__, addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -280,7 +282,7 @@ static void sifive_plic_write(void *opaque, hwaddr addr, uint64_t value,
|
||||
if (addr >= plic->priority_base && /* 4 bytes per source */
|
||||
addr < plic->priority_base + (plic->num_sources << 2))
|
||||
{
|
||||
uint32_t irq = (addr - plic->priority_base) >> 2;
|
||||
uint32_t irq = ((addr - plic->priority_base) >> 2) + 1;
|
||||
plic->source_priority[irq] = value & 7;
|
||||
if (RISCV_DEBUG_PLIC) {
|
||||
qemu_log("plic: write priority: irq=%d priority=%d\n",
|
||||
@ -290,7 +292,9 @@ static void sifive_plic_write(void *opaque, hwaddr addr, uint64_t value,
|
||||
} else if (addr >= plic->pending_base && /* 1 bit per source */
|
||||
addr < plic->pending_base + (plic->num_sources >> 3))
|
||||
{
|
||||
error_report("plic: invalid pending write: %08x", (uint32_t)addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: invalid pending write: 0x%" HWADDR_PRIx "",
|
||||
__func__, addr);
|
||||
return;
|
||||
} else if (addr >= plic->enable_base && /* 1 bit per source */
|
||||
addr < plic->enable_base + plic->num_addrs * plic->enable_stride)
|
||||
@ -340,7 +344,9 @@ static void sifive_plic_write(void *opaque, hwaddr addr, uint64_t value,
|
||||
}
|
||||
|
||||
err:
|
||||
error_report("plic: invalid register write: %08x", (uint32_t)addr);
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: Invalid register write 0x%" HWADDR_PRIx "\n",
|
||||
__func__, addr);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps sifive_plic_ops = {
|
||||
|
@ -70,7 +70,7 @@ enum {
|
||||
#define SIFIVE_E_PLIC_HART_CONFIG "M"
|
||||
#define SIFIVE_E_PLIC_NUM_SOURCES 127
|
||||
#define SIFIVE_E_PLIC_NUM_PRIORITIES 7
|
||||
#define SIFIVE_E_PLIC_PRIORITY_BASE 0x0
|
||||
#define SIFIVE_E_PLIC_PRIORITY_BASE 0x04
|
||||
#define SIFIVE_E_PLIC_PENDING_BASE 0x1000
|
||||
#define SIFIVE_E_PLIC_ENABLE_BASE 0x2000
|
||||
#define SIFIVE_E_PLIC_ENABLE_STRIDE 0x80
|
||||
|
@ -68,9 +68,9 @@ enum {
|
||||
};
|
||||
|
||||
#define SIFIVE_U_PLIC_HART_CONFIG "MS"
|
||||
#define SIFIVE_U_PLIC_NUM_SOURCES 127
|
||||
#define SIFIVE_U_PLIC_NUM_SOURCES 54
|
||||
#define SIFIVE_U_PLIC_NUM_PRIORITIES 7
|
||||
#define SIFIVE_U_PLIC_PRIORITY_BASE 0x0
|
||||
#define SIFIVE_U_PLIC_PRIORITY_BASE 0x04
|
||||
#define SIFIVE_U_PLIC_PENDING_BASE 0x1000
|
||||
#define SIFIVE_U_PLIC_ENABLE_BASE 0x2000
|
||||
#define SIFIVE_U_PLIC_ENABLE_STRIDE 0x80
|
||||
|
@ -59,7 +59,7 @@ enum {
|
||||
#define VIRT_PLIC_HART_CONFIG "MS"
|
||||
#define VIRT_PLIC_NUM_SOURCES 127
|
||||
#define VIRT_PLIC_NUM_PRIORITIES 7
|
||||
#define VIRT_PLIC_PRIORITY_BASE 0x0
|
||||
#define VIRT_PLIC_PRIORITY_BASE 0x04
|
||||
#define VIRT_PLIC_PENDING_BASE 0x1000
|
||||
#define VIRT_PLIC_ENABLE_BASE 0x2000
|
||||
#define VIRT_PLIC_ENABLE_STRIDE 0x80
|
||||
|
Loading…
Reference in New Issue
Block a user