]> git.proxmox.com Git - qemu.git/blame - hw/spapr_hcall.c
Start implementing pSeries logical partition machine
[qemu.git] / hw / spapr_hcall.c
CommitLineData
9fdf0c29
DG
1#include "sysemu.h"
2#include "cpu.h"
3#include "qemu-char.h"
4#include "hw/spapr.h"
5
6spapr_hcall_fn hypercall_table[(MAX_HCALL_OPCODE / 4) + 1];
7
8void spapr_register_hypercall(target_ulong opcode, spapr_hcall_fn fn)
9{
10 spapr_hcall_fn old_fn;
11
12 assert(opcode <= MAX_HCALL_OPCODE);
13 assert((opcode & 0x3) == 0);
14
15 old_fn = hypercall_table[opcode / 4];
16
17 assert(!old_fn || (fn == old_fn));
18
19 hypercall_table[opcode / 4] = fn;
20}
21
22target_ulong spapr_hypercall(CPUState *env, target_ulong opcode,
23 target_ulong *args)
24{
25 if (msr_pr) {
26 hcall_dprintf("Hypercall made with MSR[PR]=1\n");
27 return H_PRIVILEGE;
28 }
29
30 if ((opcode <= MAX_HCALL_OPCODE)
31 && ((opcode & 0x3) == 0)) {
32 spapr_hcall_fn fn = hypercall_table[opcode / 4];
33
34 if (fn) {
35 return fn(env, spapr, opcode, args);
36 }
37 }
38
39 hcall_dprintf("Unimplemented hcall 0x" TARGET_FMT_lx "\n", opcode);
40 return H_FUNCTION;
41}