aboutsummaryrefslogtreecommitdiffstats
path: root/tools/ocaml/libs/xl/xenlight_stubs.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/ocaml/libs/xl/xenlight_stubs.c')
-rw-r--r--tools/ocaml/libs/xl/xenlight_stubs.c596
1 files changed, 596 insertions, 0 deletions
diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c b/tools/ocaml/libs/xl/xenlight_stubs.c
new file mode 100644
index 0000000000..3751fdc612
--- /dev/null
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c
@@ -0,0 +1,596 @@
+/*
+ * Copyright (C) 2009-2011 Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ */
+
+#include <stdlib.h>
+
+#define CAML_NAME_SPACE
+#include <caml/alloc.h>
+#include <caml/memory.h>
+#include <caml/signals.h>
+#include <caml/fail.h>
+#include <caml/callback.h>
+
+#include <sys/mman.h>
+#include <stdint.h>
+#include <string.h>
+
+#include <libxl.h>
+
+struct caml_logger {
+ struct xentoollog_logger logger;
+ int log_offset;
+ char log_buf[2048];
+};
+
+typedef struct caml_gc {
+ int offset;
+ void *ptrs[64];
+} caml_gc;
+
+static void log_vmessage(struct xentoollog_logger *logger, xentoollog_level level,
+ int errnoval, const char *context, const char *format, va_list al)
+{
+ struct caml_logger *ologger = (struct caml_logger *) logger;
+
+ ologger->log_offset += vsnprintf(ologger->log_buf + ologger->log_offset,
+ 2048 - ologger->log_offset, format, al);
+}
+
+static void log_destroy(struct xentoollog_logger *logger)
+{
+}
+
+#define INIT_STRUCT() libxl_ctx *ctx; struct caml_logger lg; struct caml_gc gc; gc.offset = 0;
+
+#define INIT_CTX() \
+ lg.logger.vmessage = log_vmessage; \
+ lg.logger.destroy = log_destroy; \
+ lg.logger.progress = NULL; \
+ caml_enter_blocking_section(); \
+ ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger *) &lg); \
+ if (ret != 0) \
+ failwith_xl("cannot init context", &lg);
+
+#define FREE_CTX() \
+ gc_free(&gc); \
+ caml_leave_blocking_section(); \
+ libxl_ctx_free(ctx)
+
+static char * dup_String_val(caml_gc *gc, value s)
+{
+ int len;
+ char *c;
+ len = caml_string_length(s);
+ c = calloc(len + 1, sizeof(char));
+ if (!c)
+ caml_raise_out_of_memory();
+ gc->ptrs[gc->offset++] = c;
+ memcpy(c, String_val(s), len);
+ return c;
+}
+
+static void gc_free(caml_gc *gc)
+{
+ int i;
+ for (i = 0; i < gc->offset; i++) {
+ free(gc->ptrs[i]);
+ }
+}
+
+static void failwith_xl(char *fname, struct caml_logger *lg)
+{
+ char *s;
+ s = (lg) ? lg->log_buf : fname;
+ caml_raise_with_string(*caml_named_value("xl.error"), s);
+}
+
+#if 0 /* TODO: wrap libxl_domain_create(), these functions will be needed then */
+static void * gc_calloc(caml_gc *gc, size_t nmemb, size_t size)
+{
+ void *ptr;
+ ptr = calloc(nmemb, size);
+ if (!ptr)
+ caml_raise_out_of_memory();
+ gc->ptrs[gc->offset++] = ptr;
+ return ptr;
+}
+
+static int string_string_tuple_array_val (caml_gc *gc, char ***c_val, value v)
+{
+ CAMLparam1(v);
+ CAMLlocal1(a);
+ int i;
+ char **array;
+
+ for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1)) { i++; }
+
+ array = gc_calloc(gc, (i + 1) * 2, sizeof(char *));
+ if (!array)
+ return 1;
+ for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1), i++) {
+ value b = Field(a, 0);
+ array[i * 2] = dup_String_val(gc, Field(b, 0));
+ array[i * 2 + 1] = dup_String_val(gc, Field(b, 1));
+ }
+ *c_val = array;
+ CAMLreturn(0);
+}
+
+#endif
+
+static value Val_mac (libxl_mac *c_val)
+{
+ CAMLparam0();
+ CAMLlocal1(v);
+ int i;
+
+ v = caml_alloc_tuple(6);
+
+ for(i=0; i<6; i++)
+ Store_field(v, i, Val_int((*c_val)[i]));
+
+ CAMLreturn(v);
+}
+
+static int Mac_val(caml_gc *gc, struct caml_logger *lg, libxl_mac *c_val, value v)
+{
+ CAMLparam1(v);
+ int i;
+
+ for(i=0; i<6; i++)
+ (*c_val)[i] = Int_val(Field(v, i));
+
+ CAMLreturn(0);
+}
+
+static value Val_uuid (libxl_uuid *c_val)
+{
+ CAMLparam0();
+ CAMLlocal1(v);
+ uint8_t *uuid = libxl_uuid_bytearray(c_val);
+ int i;
+
+ v = caml_alloc_tuple(16);
+
+ for(i=0; i<16; i++)
+ Store_field(v, i, Val_int(uuid[i]));
+
+ CAMLreturn(v);
+}
+
+static int Uuid_val(caml_gc *gc, struct caml_logger *lg, libxl_uuid *c_val, value v)
+{
+ CAMLparam1(v);
+ int i;
+ uint8_t *uuid = libxl_uuid_bytearray(c_val);
+
+ for(i=0; i<16; i++)
+ uuid[i] = Int_val(Field(v, i));
+
+ CAMLreturn(0);
+}
+
+static value Val_hwcap(libxl_hwcap *c_val)
+{
+ CAMLparam0();
+ CAMLlocal1(hwcap);
+ int i;
+
+ hwcap = caml_alloc_tuple(8);
+ for (i = 0; i < 8; i++)
+ Store_field(hwcap, i, caml_copy_int32((*c_val)[i]));
+
+ CAMLreturn(hwcap);
+}
+
+#include "_libxl_types.inc"
+
+static value Val_topologyinfo(libxl_topologyinfo *c_val)
+{
+ CAMLparam0();
+ CAMLlocal3(v, topology, topologyinfo);
+ int i;
+
+ topologyinfo = caml_alloc_tuple(c_val->coremap.entries);
+ for (i = 0; i < c_val->coremap.entries; i++) {
+ v = Val_int(0); /* None */
+ if (c_val->coremap.array[i] != LIBXL_CPUARRAY_INVALID_ENTRY) {
+ topology = caml_alloc_tuple(3);
+ Store_field(topology, 0, Val_int(c_val->coremap.array[i]));
+ Store_field(topology, 1, Val_int(c_val->socketmap.array[i]));
+ Store_field(topology, 2, Val_int(c_val->nodemap.array[i]));
+ v = caml_alloc(1, 0); /* Some */
+ Store_field(v, 0, topology);
+ }
+ Store_field(topologyinfo, i, v);
+ }
+
+ CAMLreturn(topologyinfo);
+}
+
+value stub_xl_device_disk_add(value info, value domid)
+{
+ CAMLparam2(info, domid);
+ libxl_device_disk c_info;
+ int ret;
+ INIT_STRUCT();
+
+ device_disk_val(&gc, &lg, &c_info, info);
+
+ INIT_CTX();
+ ret = libxl_device_disk_add(ctx, Int_val(domid), &c_info);
+ if (ret != 0)
+ failwith_xl("disk_add", &lg);
+ FREE_CTX();
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_disk_del(value info, value domid)
+{
+ CAMLparam2(info, domid);
+ libxl_device_disk c_info;
+ int ret;
+ INIT_STRUCT();
+
+ device_disk_val(&gc, &lg, &c_info, info);
+
+ INIT_CTX();
+ ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
+ if (ret != 0)
+ failwith_xl("disk_del", &lg);
+ FREE_CTX();
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_nic_add(value info, value domid)
+{
+ CAMLparam2(info, domid);
+ libxl_device_nic c_info;
+ int ret;
+ INIT_STRUCT();
+
+ device_nic_val(&gc, &lg, &c_info, info);
+
+ INIT_CTX();
+ ret = libxl_device_nic_add(ctx, Int_val(domid), &c_info);
+ if (ret != 0)
+ failwith_xl("nic_add", &lg);
+ FREE_CTX();
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_nic_del(value info, value domid)
+{
+ CAMLparam2(info, domid);
+ libxl_device_nic c_info;
+ int ret;
+ INIT_STRUCT();
+
+ device_nic_val(&gc, &lg, &c_info, info);
+
+ INIT_CTX();
+ ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0);
+ if (ret != 0)
+ failwith_xl("nic_del", &lg);
+ FREE_CTX();
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_console_add(value info, value domid)
+{
+ CAMLparam2(info, domid);
+ libxl_device_console c_info;
+ int ret;
+ INIT_STRUCT();
+
+ device_console_val(&gc, &lg, &c_info, info);
+
+ INIT_CTX();
+ ret = libxl_device_console_add(ctx, Int_val(domid), &c_info);
+ if (ret != 0)
+ failwith_xl("console_add", &lg);
+ FREE_CTX();
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vkb_add(value info, value domid)
+{
+ CAMLparam2(info, domid);
+ libxl_device_vkb c_info;
+ int ret;
+ INIT_STRUCT();
+
+ device_vkb_val(&gc, &lg, &c_info, info);
+
+ INIT_CTX();
+ ret = libxl_device_vkb_add(ctx, Int_val(domid), &c_info);
+ if (ret != 0)
+ failwith_xl("vkb_add", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vkb_clean_shutdown(value domid)
+{
+ CAMLparam1(domid);
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid));
+ if (ret != 0)
+ failwith_xl("vkb_clean_shutdown", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vkb_hard_shutdown(value domid)
+{
+ CAMLparam1(domid);
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid));
+ if (ret != 0)
+ failwith_xl("vkb_hard_shutdown", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vfb_add(value info, value domid)
+{
+ CAMLparam2(info, domid);
+ libxl_device_vfb c_info;
+ int ret;
+ INIT_STRUCT();
+
+ device_vfb_val(&gc, &lg, &c_info, info);
+
+ INIT_CTX();
+ ret = libxl_device_vfb_add(ctx, Int_val(domid), &c_info);
+ if (ret != 0)
+ failwith_xl("vfb_add", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vfb_clean_shutdown(value domid)
+{
+ CAMLparam1(domid);
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid));
+ if (ret != 0)
+ failwith_xl("vfb_clean_shutdown", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vfb_hard_shutdown(value domid)
+{
+ CAMLparam1(domid);
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid));
+ if (ret != 0)
+ failwith_xl("vfb_hard_shutdown", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_pci_add(value info, value domid)
+{
+ CAMLparam2(info, domid);
+ libxl_device_pci c_info;
+ int ret;
+ INIT_STRUCT();
+
+ device_pci_val(&gc, &lg, &c_info, info);
+
+ INIT_CTX();
+ ret = libxl_device_pci_add(ctx, Int_val(domid), &c_info);
+ if (ret != 0)
+ failwith_xl("pci_add", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_pci_remove(value info, value domid)
+{
+ CAMLparam2(info, domid);
+ libxl_device_pci c_info;
+ int ret;
+ INIT_STRUCT();
+
+ device_pci_val(&gc, &lg, &c_info, info);
+
+ INIT_CTX();
+ ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0);
+ if (ret != 0)
+ failwith_xl("pci_remove", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_pci_shutdown(value domid)
+{
+ CAMLparam1(domid);
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_device_pci_shutdown(ctx, Int_val(domid));
+ if (ret != 0)
+ failwith_xl("pci_shutdown", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_button_press(value domid, value button)
+{
+ CAMLparam2(domid, button);
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_button_press(ctx, Int_val(domid), Int_val(button) + LIBXL_BUTTON_POWER);
+ if (ret != 0)
+ failwith_xl("button_press", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_physinfo_get(value unit)
+{
+ CAMLparam1(unit);
+ CAMLlocal1(physinfo);
+ libxl_physinfo c_physinfo;
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_get_physinfo(ctx, &c_physinfo);
+ if (ret != 0)
+ failwith_xl("physinfo", &lg);
+ FREE_CTX();
+
+ physinfo = Val_physinfo(&gc, &lg, &c_physinfo);
+ CAMLreturn(physinfo);
+}
+
+value stub_xl_topologyinfo(value unit)
+{
+ CAMLparam1(unit);
+ CAMLlocal1(topologyinfo);
+ libxl_topologyinfo c_topologyinfo;
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_get_topologyinfo(ctx, &c_topologyinfo);
+ if (ret != 0)
+ failwith_xl("topologyinfo", &lg);
+ FREE_CTX();
+
+ topologyinfo = Val_topologyinfo(&c_topologyinfo);
+ CAMLreturn(topologyinfo);
+}
+
+value stub_xl_sched_credit_domain_get(value domid)
+{
+ CAMLparam1(domid);
+ CAMLlocal1(scinfo);
+ libxl_sched_credit c_scinfo;
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_sched_credit_domain_get(ctx, Int_val(domid), &c_scinfo);
+ if (ret != 0)
+ failwith_xl("sched_credit_domain_get", &lg);
+ FREE_CTX();
+
+ scinfo = Val_sched_credit(&gc, &lg, &c_scinfo);
+ CAMLreturn(scinfo);
+}
+
+value stub_xl_sched_credit_domain_set(value domid, value scinfo)
+{
+ CAMLparam2(domid, scinfo);
+ libxl_sched_credit c_scinfo;
+ int ret;
+ INIT_STRUCT();
+
+ sched_credit_val(&gc, &lg, &c_scinfo, scinfo);
+
+ INIT_CTX();
+ ret = libxl_sched_credit_domain_set(ctx, Int_val(domid), &c_scinfo);
+ if (ret != 0)
+ failwith_xl("sched_credit_domain_set", &lg);
+ FREE_CTX();
+
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_send_trigger(value domid, value trigger, value vcpuid)
+{
+ CAMLparam3(domid, trigger, vcpuid);
+ int ret;
+ char *c_trigger;
+ INIT_STRUCT();
+
+ c_trigger = dup_String_val(&gc, trigger);
+
+ INIT_CTX();
+ ret = libxl_send_trigger(ctx, Int_val(domid), c_trigger, Int_val(vcpuid));
+ if (ret != 0)
+ failwith_xl("send_trigger", &lg);
+ FREE_CTX();
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_send_sysrq(value domid, value sysrq)
+{
+ CAMLparam2(domid, sysrq);
+ int ret;
+ INIT_STRUCT();
+
+ INIT_CTX();
+ ret = libxl_send_sysrq(ctx, Int_val(domid), Int_val(sysrq));
+ if (ret != 0)
+ failwith_xl("send_sysrq", &lg);
+ FREE_CTX();
+ CAMLreturn(Val_unit);
+}
+
+value stub_xl_send_debug_keys(value keys)
+{
+ CAMLparam1(keys);
+ int ret;
+ char *c_keys;
+ INIT_STRUCT();
+
+ c_keys = dup_String_val(&gc, keys);
+
+ INIT_CTX();
+ ret = libxl_send_debug_keys(ctx, c_keys);
+ if (ret != 0)
+ failwith_xl("send_debug_keys", &lg);
+ FREE_CTX();
+ CAMLreturn(Val_unit);
+}
+
+/*
+ * Local variables:
+ * indent-tabs-mode: t
+ * c-basic-offset: 8
+ * tab-width: 8
+ * End:
+ */