The address ranges need to be initialized so that they are sorted.
Otherwise, whoever adds entries needs to know the actual value of the MSRs
and maintain their ordering manually.

Signed-off-by: Barret Rhoden <[email protected]>
---
 kern/arch/x86/devarch.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/kern/arch/x86/devarch.c b/kern/arch/x86/devarch.c
index ca742d6d0ce8..c9e96d3bbb96 100644
--- a/kern/arch/x86/devarch.c
+++ b/kern/arch/x86/devarch.c
@@ -90,10 +90,10 @@ static struct dirtab archdir[Qmax] = {
 #define MSR_MAX_VAR_COUNTERS 16
 #define MSR_MAX_FIX_COUNTERS 4
 
-static const struct address_range msr_rd_wlist[] = {
+static struct address_range msr_rd_wlist[] = {
        ADDRESS_RANGE(0x00000000, 0xffffffff),
 };
-static const struct address_range msr_wr_wlist[] = {
+static struct address_range msr_wr_wlist[] = {
        ADDRESS_RANGE(MSR_IA32_PERFCTR0,
                                  MSR_IA32_PERFCTR0 + MSR_MAX_VAR_COUNTERS - 1),
        ADDRESS_RANGE(MSR_ARCH_PERFMON_EVENTSEL0,
@@ -693,11 +693,21 @@ static long archwrite(struct chan *c, void *a, long n, 
int64_t offset)
        return 0;
 }
 
+static void archinit(void)
+{
+       int ret;
+
+       ret = address_range_init(msr_rd_wlist, ARRAY_SIZE(msr_rd_wlist));
+       assert(!ret);
+       ret = address_range_init(msr_wr_wlist, ARRAY_SIZE(msr_wr_wlist));
+       assert(!ret);
+}
+
 struct dev archdevtab __devtab = {
        .name = "arch",
 
        .reset = devreset,
-       .init = devinit,
+       .init = archinit,
        .shutdown = devshutdown,
        .attach = archattach,
        .walk = archwalk,
-- 
2.7.0.rc3.207.g0ac5344

-- 
You received this message because you are subscribed to the Google Groups 
"Akaros" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to