Skip to content

Commit

Permalink
libsel4vm: add vgic_dist_set_ctlr()
Browse files Browse the repository at this point in the history
This is a preparation for GICv3 support, where this function becomes
more complex.

Signed-off-by: Axel Heider <[email protected]>
  • Loading branch information
Axel Heider committed Jul 14, 2022
1 parent 39c5097 commit 988f25a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 26 deletions.
19 changes: 19 additions & 0 deletions libsel4vm/src/arch/arm/vgic/gicv2.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,22 @@ struct gic_dist_map {
uint32_t periph_id[12]; /* [0xFC0, 0xFF0) */
uint32_t component_id[4]; /* [0xFF0, 0xFFF] */
};

static inline void vgic_dist_set_ctlr(vgic_t *vgic, uint32_t data)
{
/* ToDo: we should care about bit 0 only and ignore all the others. */

switch (data) {
case 0:
DDIST("disabling gic distributor\n");
vgic->dist->enable = 0;
break;
case 1:
DDIST("enabling gic distributor\n");
vgic->dist->enable = 1;
break;
default:
ZF_LOGE("Unknown dist ctlr encoding 0x%x", data);
break;
}
}
27 changes: 1 addition & 26 deletions libsel4vm/src/arch/arm/vgic/vdist.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,24 +144,6 @@ static inline bool is_active(struct gic_dist_map *gic_dist, int irq, int vcpu_id
return is_spi_active(gic_dist, irq);
}

static int vgic_dist_enable(vgic_t *vgic, vm_t *vm)
{
assert(vgic);
assert(vgic->dist);
DDIST("enabling gic distributor\n");
vgic->dist->enable = 1;
return 0;
}

static int vgic_dist_disable(vgic_t *vgic, vm_t *vm)
{
assert(vgic);
assert(vgic->dist);
DDIST("disabling gic distributor\n");
vgic->dist->enable = 0;
return 0;
}

static void vgic_dist_enable_irq(vgic_t *vgic, vm_vcpu_t *vcpu, int irq)
{
assert(vgic);
Expand Down Expand Up @@ -424,14 +406,7 @@ static memory_fault_result_t vgic_dist_reg_write(vm_t *vm, vm_vcpu_t *vcpu,
uint32_t data;
switch (offset) {
case RANGE32(GIC_DIST_CTLR, GIC_DIST_CTLR):
data = fault_get_data(fault);
if (data == 1) {
vgic_dist_enable(vgic, vm);
} else if (data == 0) {
vgic_dist_disable(vgic, vm);
} else {
ZF_LOGE("Unknown enable register encoding");
}
vgic_dist_set_ctlr(vgic, fault_get_data(fault));
break;
case RANGE32(GIC_DIST_TYPER, GIC_DIST_TYPER):
break;
Expand Down

0 comments on commit 988f25a

Please sign in to comment.