Merge pull request #72 in SEL4/sel4_libs from ~ALYONS/sel4_libs:minor to master
* commit 'cde762c0ce9510aa916419d407f55c3617f8c4a8':
sel4vspace: add seL4_ARCH_LargePageObject constant
sel4platsupport: use hpet specific destroy
diff --git a/libsel4platsupport/src/plat/pc99/hpet.c b/libsel4platsupport/src/plat/pc99/hpet.c
index b96deef..8a1f40d 100644
--- a/libsel4platsupport/src/plat/pc99/hpet.c
+++ b/libsel4platsupport/src/plat/pc99/hpet.c
@@ -37,6 +37,15 @@
seL4_IRQHandler_Ack(data->irq);
}
+static void
+hpet_destroy(seL4_timer_t *timer, vka_t *vka, vspace_t *vspace)
+{
+ timer_common_data_t *timer_data = (timer_common_data_t *) timer->data;
+ timer_common_destroy_frame(timer, vka, vspace);
+ /* clear the irq */
+ seL4_IRQHandler_Clear(timer_data->irq);
+}
+
seL4_timer_t *
sel4platsupport_get_hpet(vspace_t *vspace, simple_t *simple, acpi_t *acpi,
vka_t *vka, seL4_CPtr notification, uint32_t irq_number)
@@ -53,7 +62,7 @@
}
/* check what range the IRQ is in */
- hpet->destroy = timer_common_destroy;
+ hpet->destroy = hpet_destroy;
if ((int)irq_number >= MSI_MIN || irq_number <= MSI_MAX) {
irq = irq_number + IRQ_OFFSET;
diff --git a/libsel4platsupport/src/timer_common.c b/libsel4platsupport/src/timer_common.c
index ec17c59..e332482 100644
--- a/libsel4platsupport/src/timer_common.c
+++ b/libsel4platsupport/src/timer_common.c
@@ -18,23 +18,34 @@
#ifdef CONFIG_LIB_SEL4_VSPACE
static void
+timer_common_destroy_frame_internal(timer_common_data_t *data, vka_t *vka, vspace_t *vspace)
+{
+ if (data->vaddr != NULL) {
+ vspace_unmap_pages(vspace, data->vaddr, 1, seL4_PageBits, VSPACE_PRESERVE);
+ }
+ if (data->frame.capPtr != 0) {
+ vka_cnode_delete(&data->frame);
+ vka_cspace_free(vka, data->frame.capPtr);
+ }
+}
+
+void
+timer_common_destroy_frame(seL4_timer_t *timer, vka_t *vka, vspace_t *vspace)
+{
+ timer_common_data_t *timer_data = (timer_common_data_t *) timer->data;
+ if (timer_data != NULL) {
+ timer_common_destroy_frame_internal(timer_data, vka, vspace);
+ }
+}
+
+static void
timer_common_destroy_internal(timer_common_data_t *timer_data, vka_t *vka, vspace_t *vspace)
{
if (timer_data != NULL) {
-
+ timer_common_destroy_frame_internal(timer_data, vka, vspace);
if (timer_data->irq != 0) {
seL4_IRQHandler_Clear(timer_data->irq);
- cspacepath_t irq_path;
- vka_cspace_make_path(vka, timer_data->irq, &irq_path);
- vka_cnode_delete(&irq_path);
- vka_cspace_free(vka, timer_data->irq);
- }
- if (timer_data->vaddr != NULL) {
- vspace_unmap_pages(vspace, timer_data->vaddr, 1, seL4_PageBits, VSPACE_PRESERVE);
- }
- if (timer_data->frame.capPtr != 0) {
- vka_cnode_delete(&timer_data->frame);
- vka_cspace_free(vka, timer_data->frame.capPtr);
+ timer_common_cleanup_irq(vka, timer_data->irq);
}
free(timer_data);
}
diff --git a/libsel4platsupport/src/timer_common.h b/libsel4platsupport/src/timer_common.h
index 358ab0e..59827c1 100644
--- a/libsel4platsupport/src/timer_common.h
+++ b/libsel4platsupport/src/timer_common.h
@@ -33,8 +33,9 @@
vka_t *vka, seL4_CPtr notification, uint32_t irq_number, void *paddr);
/*
- * Something went wrong, clean up everything we did in timer_common_init.
+ * clean up functions
*/
+void timer_common_destroy_frame(seL4_timer_t *timer, vka_t *vka, vspace_t *vspace);
void timer_common_destroy(seL4_timer_t *timer, vka_t *vka, vspace_t *vspace);
void timer_common_cleanup_irq(vka_t *vka, seL4_CPtr irq);
diff --git a/libsel4vspace/arch_include/arm/vspace/arch/page.h b/libsel4vspace/arch_include/arm/vspace/arch/page.h
index 6b1e678..c6c1226 100644
--- a/libsel4vspace/arch_include/arm/vspace/arch/page.h
+++ b/libsel4vspace/arch_include/arm/vspace/arch/page.h
@@ -42,6 +42,8 @@
#define seL4_ARCH_Default_VMAttributes seL4_ARM_Default_VMAttributes
#define seL4_ARCH_VMAttributes seL4_ARM_VMAttributes
#define seL4_ARCH_4KPage seL4_ARM_SmallPageObject
+#define seL4_ARCH_LargePageObject seL4_ARM_LargePageObject
+/* for the size of a large page use seL4_LargePageBits */
/* Remap does not exist on all kernels */
#define seL4_ARCH_Page_Remap seL4_ARM_Page_Remap
#define ARCHPageGetAddress ARMPageGetAddress
diff --git a/libsel4vspace/arch_include/x86/vspace/arch/page.h b/libsel4vspace/arch_include/x86/vspace/arch/page.h
index 896f514..74d44b8 100644
--- a/libsel4vspace/arch_include/x86/vspace/arch/page.h
+++ b/libsel4vspace/arch_include/x86/vspace/arch/page.h
@@ -38,6 +38,8 @@
#define seL4_ARCH_VMAttributes seL4_X86_VMAttributes
#define seL4_ARCH_4KPage seL4_X86_4K
#define seL4_ARCH_Uncached_VMAttributes seL4_X86_CacheDisabled
+#define seL4_ARCH_LargePageObject seL4_X86_LargePageObject
+/* for size of a large page object use seL4_LargePageBits */
/* Remap does not exist on all kernels */
#define seL4_ARCH_Page_Remap seL4_X86_Page_Remap
#define ARCHPageGetAddress X86PageGetAddress