From 1c99ee951a1186f0146f9d66db4d30f135442ca4 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Tue, 24 Jun 2014 14:38:12 +0200 Subject: [PATCH] hw: set pages shareable in SMP systems only Fixes #1181 --- repos/base-hw/src/core/arm/short_translation_table.h | 5 +++-- repos/base-hw/src/core/processor_driver/arm.h | 5 +++++ repos/base-hw/src/core/processor_driver/arm_v6.h | 2 +- repos/base-hw/src/core/processor_driver/arm_v7.h | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/repos/base-hw/src/core/arm/short_translation_table.h b/repos/base-hw/src/core/arm/short_translation_table.h index 49e0656d1..64a153b8a 100644 --- a/repos/base-hw/src/core/arm/short_translation_table.h +++ b/repos/base-hw/src/core/arm/short_translation_table.h @@ -22,6 +22,7 @@ /* base-hw includes */ #include #include +#include namespace Arm { @@ -184,7 +185,7 @@ class Arm::Section_table access_t v = access_permission_bits(flags); v |= memory_region_attr(flags); v |= Ng::bits(!flags.global); - v |= S::bits(1); + v |= S::bits(Processor_driver::is_smp()); v |= Pa::masked(pa); Descriptor::type(v, Descriptor::SMALL_PAGE); return v; @@ -447,7 +448,7 @@ class Arm::Section_table access_t v = access_permission_bits
(flags); v |= memory_region_attr
(flags); v |= Domain::bits(DOMAIN); - v |= S::bits(1); + v |= S::bits(Processor_driver::is_smp()); v |= Ng::bits(!flags.global); v |= Pa::masked(pa); Descriptor::type(v, Descriptor::SECTION); diff --git a/repos/base-hw/src/core/processor_driver/arm.h b/repos/base-hw/src/core/processor_driver/arm.h index 2c231a898..280e36367 100644 --- a/repos/base-hw/src/core/processor_driver/arm.h +++ b/repos/base-hw/src/core/processor_driver/arm.h @@ -699,6 +699,11 @@ namespace Arm base = base & LINE_ALIGNM_MASK; for (; base < top; base += LINE_SIZE) { Icimvau::write(base); } } + + /** + * Return true if the processor support multiple cores + */ + static bool is_smp() { return PROCESSORS > 1; } }; } diff --git a/repos/base-hw/src/core/processor_driver/arm_v6.h b/repos/base-hw/src/core/processor_driver/arm_v6.h index 6a71d44be..660670e7e 100644 --- a/repos/base-hw/src/core/processor_driver/arm_v6.h +++ b/repos/base-hw/src/core/processor_driver/arm_v6.h @@ -182,7 +182,7 @@ namespace Arm_v6 static void start_secondary_processors(void * const ip) { - if (PROCESSORS > 1) { PERR("multiprocessing not implemented"); } + if (is_smp()) { PERR("multiprocessing not implemented"); } } /** diff --git a/repos/base-hw/src/core/processor_driver/arm_v7.h b/repos/base-hw/src/core/processor_driver/arm_v7.h index 60778d9b9..35c3fc7fd 100644 --- a/repos/base-hw/src/core/processor_driver/arm_v7.h +++ b/repos/base-hw/src/core/processor_driver/arm_v7.h @@ -359,7 +359,7 @@ namespace Arm_v7 */ static void start_secondary_processors(void * const ip) { - if (PROCESSORS > 1) { + if (is_smp()) { Genode::Board::secondary_processors_ip(ip); data_synchronization_barrier(); asm volatile ("sev\n");