Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148375333
D48808.1786516801.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D48808.1786516801.diff
View Options
diff --git a/sys/riscv/vmm/vmm_aplic.c b/sys/riscv/vmm/vmm_aplic.c
--- a/sys/riscv/vmm/vmm_aplic.c
+++ b/sys/riscv/vmm/vmm_aplic.c
@@ -70,9 +70,13 @@
/* If D == 1. */
#define SOURCECFG_CHILD_INDEX_S (0)
#define SOURCECFG_CHILD_INDEX_M (0x3ff << SOURCECFG_CHILD_INDEX_S)
+#define APLIC_SETIP 0x1c00
#define APLIC_SETIPNUM 0x1cdc
+#define APLIC_CLRIP 0x1d00
#define APLIC_CLRIPNUM 0x1ddc
+#define APLIC_SETIE 0x1e00
#define APLIC_SETIENUM 0x1edc
+#define APLIC_CLRIE 0x1f00
#define APLIC_CLRIENUM 0x1fdc
#define APLIC_GENMSI 0x3000
#define APLIC_TARGET(x) (0x3004 + ((x) - 1) * 4)
@@ -96,6 +100,7 @@
uint32_t state;
#define APLIC_IRQ_STATE_PENDING (1 << 0)
#define APLIC_IRQ_STATE_ENABLED (1 << 1)
+#define APLIC_IRQ_STATE_INPUT (1 << 2)
uint32_t target;
uint32_t target_hart;
};
@@ -146,15 +151,40 @@
irq = &aplic->irqs[i];
mtx_lock_spin(&aplic->mtx);
- if (enabled)
- irq->state |= APLIC_IRQ_STATE_ENABLED;
- else
- irq->state &= ~APLIC_IRQ_STATE_ENABLED;
+ if ((irq->sourcecfg & SOURCECFG_SM_M) != SOURCECFG_SM_INACTIVE) {
+ if (enabled)
+ irq->state |= APLIC_IRQ_STATE_ENABLED;
+ else
+ irq->state &= ~APLIC_IRQ_STATE_ENABLED;
+ }
mtx_unlock_spin(&aplic->mtx);
return (0);
}
+static void
+aplic_set_enabled_word(struct aplic *aplic, bool write, uint32_t word,
+ uint64_t *val, bool enabled)
+{
+ uint64_t v;
+ int i;
+
+ if (!write) {
+ *val = 0;
+ return;
+ }
+
+ /*
+ * The write is ignored if value written is not an active interrupt
+ * source number in the domain.
+ */
+ for (i = 0; i < 32; i++)
+ if (*val & (1u << i)) {
+ v = word * 32 + i;
+ (void)aplic_set_enabled(aplic, write, &v, enabled);
+ }
+}
+
static int
aplic_handle_target(struct aplic *aplic, int i, bool write, uint64_t *val)
{
@@ -238,6 +268,8 @@
int r;
int i;
+ dprintf("%s: reg %lx\n", __func__, reg);
+
if ((reg >= APLIC_SOURCECFG(1)) &&
(reg <= APLIC_SOURCECFG(aplic->nirqs))) {
i = ((reg - APLIC_SOURCECFG(1)) >> 2) + 1;
@@ -258,9 +290,20 @@
return (error);
}
+ if ((reg >= APLIC_CLRIE) && (reg < (APLIC_CLRIE + aplic->nirqs * 4))) {
+ i = (reg - APLIC_CLRIE) >> 2;
+ aplic_set_enabled_word(aplic, write, i, val, false);
+ return (0);
+ }
+
switch (reg) {
case APLIC_DOMAINCFG:
- aplic->domaincfg = *val & DOMAINCFG_IE;
+ mtx_lock_spin(&aplic->mtx);
+ if (write)
+ aplic->domaincfg = *val & DOMAINCFG_IE;
+ else
+ *val = aplic->domaincfg;
+ mtx_unlock_spin(&aplic->mtx);
error = 0;
break;
case APLIC_SETIENUM:
@@ -441,6 +484,7 @@
struct aplic *aplic;
bool notify;
int error;
+ int mask;
aplic = hyp->aplic;
@@ -460,22 +504,39 @@
notify = false;
switch (irq->sourcecfg & SOURCECFG_SM_M) {
+ case SOURCECFG_SM_LEVEL0:
+ if (!level)
+ irq->state |= APLIC_IRQ_STATE_PENDING;
+ break;
+ case SOURCECFG_SM_LEVEL1:
+ if (level)
+ irq->state |= APLIC_IRQ_STATE_PENDING;
+ break;
+ case SOURCECFG_SM_EDGE0:
+ if (!level && (irq->state & APLIC_IRQ_STATE_INPUT))
+ irq->state |= APLIC_IRQ_STATE_PENDING;
+ break;
case SOURCECFG_SM_EDGE1:
- if (level) {
+ if (level && !(irq->state & APLIC_IRQ_STATE_INPUT))
irq->state |= APLIC_IRQ_STATE_PENDING;
- if (irq->state & APLIC_IRQ_STATE_ENABLED)
- notify = true;
- } else
- irq->state &= ~APLIC_IRQ_STATE_PENDING;
break;
case SOURCECFG_SM_DETACHED:
+ case SOURCECFG_SM_INACTIVE:
break;
default:
- /* TODO. */
- dprintf("sourcecfg %d\n", irq->sourcecfg & SOURCECFG_SM_M);
error = ENXIO;
break;
}
+
+ if (level)
+ irq->state |= APLIC_IRQ_STATE_INPUT;
+ else
+ irq->state &= ~APLIC_IRQ_STATE_INPUT;
+
+ mask = APLIC_IRQ_STATE_ENABLED | APLIC_IRQ_STATE_PENDING;
+ if ((irq->state & mask) == mask)
+ notify = true;
+
mtx_unlock_spin(&aplic->mtx);
if (notify)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Aug 12, 6:40 AM (17 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29398534
Default Alt Text
D48808.1786516801.diff (3 KB)
Attached To
Mode
D48808: riscv vmm: various fixes in APLIC
Attached
Detach File
Event Timeline
Log In to Comment