diff options
author | mischief <mischief@offblast.org> | 2014-06-24 18:02:25 -0700 |
---|---|---|
committer | mischief <mischief@offblast.org> | 2014-06-24 18:02:25 -0700 |
commit | 5ba95fdb07ddc2c32111a1b2f57f17aa27fcbbf5 (patch) | |
tree | c1ec54cb9ecff85b0b820a26d26a10a32a118d0c /sys/src/9/xen/archxen.c | |
parent | fa03455b5057675b18d1c87aef2d1071b2088de0 (diff) |
import xen 32 bit paravirtual kernel from /n/sources/xen.
Diffstat (limited to 'sys/src/9/xen/archxen.c')
-rw-r--r-- | sys/src/9/xen/archxen.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/sys/src/9/xen/archxen.c b/sys/src/9/xen/archxen.c new file mode 100644 index 000000000..721950223 --- /dev/null +++ b/sys/src/9/xen/archxen.c @@ -0,0 +1,115 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "io.h" + +static int +identify(void) +{ + m->havepge = 0; + return 0; +} + +static void +intrinit(void) +{ + ulong machs; + int i, ncpu; + char *cp; + char node[32]; + char buf[32]; + + if((cp = getconf("*nomp")) != nil && strtol(cp, 0, 0) != 0) + return; + ncpu = MAX_VIRT_CPUS; + if (cp = getconf("*ncpu")) { + ncpu = strtol(cp, 0, 0); + if (ncpu < 1) + ncpu = 1; + } + machs = 1; + for (i = 1; i < ncpu; i++) { + sprint(node, "cpu/%d/availability", i); + if (xenstore_read(node, buf, sizeof buf) <= 0) + break; + print("%s: %s\n", node, buf); + if (strcmp(buf, "online") == 0) { + machs |= 1<<i; + conf.nmach++; + } + } + if (conf.nmach > 1) { + print("Sorry, SMP not supported yet: 1 of %lud CPUs startd\n", conf.nmach); + conf.nmach = 1; + } +} + +static void +shutdown(void) +{ + HYPERVISOR_shutdown(1); +} + +int xenintrenable(Vctl *v); +int xenintrvecno(int irq); +int xenintrdisable(int irq); +void xentimerenable(void); +uvlong xentimerread(uvlong*); +void xentimerset(uvlong); + +PCArch archxen = { +.id= "Xen", +.ident= identify, +.reset= shutdown, +.intrinit= intrinit, +.intrenable= xenintrenable, +.intrvecno= xenintrvecno, +.intrdisable= xenintrdisable, +.clockenable= xentimerenable, +.fastclock= xentimerread, +.timerset= xentimerset, +}; + +/* + * Placeholders to satisfy external references in generic devarch.c + */ +ulong getcr4(void) { return 0; } +void putcr4(ulong) {} +int inb(int) { return 0; } +ushort ins(int) { return 0; } +ulong inl(int) { return 0; } +void outb(int, int) {} +void outs(int, ushort) {} +void outl(int, ulong) {} +void i8042reset(void) {} +void i8253enable(void) {} +void i8253init(void) {} +void i8253link(void) {} +uvlong i8253read(uvlong*) { return 0; } +void i8253timerset(uvlong) {} +int i8259disable(int) { return 0; } +int i8259enable(Vctl*) { return 0; } +void i8259init(void) {} +int i8259isr(int) { return 0; } +void i8259on(void) {} +void i8259off(void) {} +int i8259vecno(int) { return 0; } +int mtrrprint(char*, long) { return 0; } +int mtrr(uvlong, uvlong, char *) { return 0; } + +/* + * XXX until fpsave is debugged + */ +void +fpssesave(FPsave* f) +{ + fpx87save(f); +} + +void +fpsserestore(FPsave* f) +{ + fpx87restore(f); +} |