[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 01/15] pseries: Don't allow duplicate registration of
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PATCH 01/15] pseries: Don't allow duplicate registration of hcalls or RTAS calls |
Date: |
Thu, 18 Oct 2012 16:50:23 +1100 |
Currently the pseries machine code allows a callback to be registered
for a hypercall number twice, as long as it's the same callback the second
time. We don't test for duplicate registrations of RTAS callbacks at all
so it will effectively be last registratiojn wins.
This was originally done because it was awkward to ensure that the
registration happened exactly once, but the code has since been
restructured so that's no longer the case.
Duplicate registration of a hypercall or RTAS call could well suggest
a duplicate initialization which could cause other problems, so this patch
makes duplicate registrations a bug, to prevent the old behaviour from
hiding other bugs.
Signed-off-by: David Gibson <address@hidden>
---
hw/spapr_hcall.c | 3 +--
hw/spapr_rtas.c | 9 +++++++++
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
index 194d9c2..762493a 100644
--- a/hw/spapr_hcall.c
+++ b/hw/spapr_hcall.c
@@ -670,11 +670,10 @@ void spapr_register_hypercall(target_ulong opcode,
spapr_hcall_fn fn)
} else {
assert((opcode >= KVMPPC_HCALL_BASE) && (opcode <= KVMPPC_HCALL_MAX));
-
slot = &kvmppc_hypercall_table[opcode - KVMPPC_HCALL_BASE];
}
- assert(!(*slot) || (fn == *slot));
+ assert(!(*slot));
*slot = fn;
}
diff --git a/hw/spapr_rtas.c b/hw/spapr_rtas.c
index b808f80..b96078b 100644
--- a/hw/spapr_rtas.c
+++ b/hw/spapr_rtas.c
@@ -241,6 +241,15 @@ target_ulong spapr_rtas_call(sPAPREnvironment *spapr,
void spapr_rtas_register(const char *name, spapr_rtas_fn fn)
{
+ int i;
+
+ for (i = 0; i < (rtas_next - rtas_table); i++) {
+ if (strcmp(name, rtas_table[i].name) == 0) {
+ fprintf(stderr, "RTAS call \"%s\" registered twice\n", name);
+ exit(1);
+ }
+ }
+
assert(rtas_next < (rtas_table + TOKEN_MAX));
rtas_next->name = name;
--
1.7.10.4
- [Qemu-ppc] [0/15] pseries patch queue, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 09/15] pseries: Return the token when we register an RTAS call, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 10/15] pseries: Allow RTAS tokens without a qemu handler, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 01/15] pseries: Don't allow duplicate registration of hcalls or RTAS calls,
David Gibson <=
- [Qemu-ppc] [PATCH 05/15] pseries: Clean up inconsistent variable name in xics.c, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 11/15] pseries: Add tracepoints to the XICS interrupt controller, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 02/15] target-ppc: Rework storage of VPA registration state, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 06/15] pseries: Use #define for XICS base irq number, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 12/15] pseries: Split xics irq configuration from state information, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 13/15] target-pcc: Convert ppcemb_tlb_t to use fixed 64-bit RPN, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 08/15] pseries: Move XICS initialization before cpu initialization, David Gibson, 2012/10/18
- [Qemu-ppc] [PATCH 07/15] pseries: Cleanup duplications of ics_valid_irq() code, David Gibson, 2012/10/18