From 1012318772396a2e4219c9ffa4c57ccd443f42a1 Mon Sep 17 00:00:00 2001 From: George Dunlap Date: Thu, 29 Dec 2016 19:49:02 +0000 Subject: [PATCH 3/7] tools/golang/xenlight: Add host-related functionality Add calls for the following host-related functionality: - libxl_get_max_cpus - libxl_get_online_cpus - libxl_get_max_nodes - libxl_get_free_memory - libxl_get_physinfo - libxl_get_version_info And include golang versions of the following structs: - libxl_physinfo - libxl_version_info - libxl_hwcap --- tools/golang/xenlight/xenlight.go | 193 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) diff --git a/tools/golang/xenlight/xenlight.go b/tools/golang/xenlight/xenlight.go index 677e5a5..05604c7 100644 --- a/tools/golang/xenlight/xenlight.go +++ b/tools/golang/xenlight/xenlight.go @@ -128,6 +128,68 @@ type Context struct { ctx *C.libxl_ctx } +type Hwcap struct { + Hwcap []C.uint32_t +} + +func hwcapCToGo(chwcap C.libxl_hwcap) (ghwcap Hwcap) { + // Alloc a Go slice for the bytes + size := 8 + ghwcap.Hwcap = make([]C.uint32_t, size) + + // Make a slice pointing to the C array + mapslice := (*[1 << 30]C.uint32_t)(unsafe.Pointer(&chwcap[0]))[:size:size] + + // And copy the C array into the Go array + copy(ghwcap.Hwcap, mapslice) + + return +} + +/* + * Types: IDL + * + * FIXME: Generate these automatically from the IDL + */ +type Physinfo struct { + Threads_per_core uint32 + Cores_per_socket uint32 + + Max_cpu_id uint32 + Nr_cpus uint32 + Cpu_khz uint32 + + Total_pages uint64 + Free_pages uint64 + Scrub_pages uint64 + Outstanding_pages uint64 + Sharing_freed_pages uint64 + Sharing_used_frames uint64 + + Nr_nodes uint32 + Hw_cap Hwcap + + Cap_hvm bool + Cap_hvm_directio bool +} + +type VersionInfo struct { + Xen_version_major int + Xen_version_minor int + Xen_version_extra string + Compiler string + Compile_by string + Compile_domain string + Compile_date string + Capabilities string + Changeset string + Virt_start uint64 + Pagesize int + Commandline string + Build_id string +} + + /* * Context */ @@ -168,3 +230,134 @@ func (Ctx *Context) CheckOpen() (err error) { } return } + +//int libxl_get_max_cpus(libxl_ctx *ctx); +func (Ctx *Context) GetMaxCpus() (maxCpus int, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + + ret := C.libxl_get_max_cpus(Ctx.ctx) + //FIXME: proper error + if ret < 0 { + err = createError("libxl_get_max_cpus failed: ", ret) + return + } + maxCpus = int(ret) + return +} + +//int libxl_get_online_cpus(libxl_ctx *ctx); +func (Ctx *Context) GetOnlineCpus() (onCpus int, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + + ret := C.libxl_get_online_cpus(Ctx.ctx) + //FIXME: proper error + if ret < 0 { + err = createError("libxl_get_online_cpus failed: ", ret) + return + } + onCpus = int(ret) + return +} + +//int libxl_get_max_nodes(libxl_ctx *ctx); +func (Ctx *Context) GetMaxNodes() (maxNodes int, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + ret := C.libxl_get_max_nodes(Ctx.ctx) + //FIXME: proper error + if ret < 0 { + err = createError("libxl_get_max_nodes failed: ", ret) + return + } + maxNodes = int(ret) + return +} + +//int libxl_get_free_memory(libxl_ctx *ctx, uint64_t *memkb); +func (Ctx *Context) GetFreeMemory() (memkb uint64, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + var cmem C.uint64_t + ret := C.libxl_get_free_memory(Ctx.ctx, &cmem) + + if ret < 0 { + err = createError("libxl_get_free_memory failed: ", ret) + return + } + + memkb = uint64(ret) + return + +} + +//int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo) +func (Ctx *Context) GetPhysinfo() (physinfo *Physinfo, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + var cphys C.libxl_physinfo + + ret := C.libxl_get_physinfo(Ctx.ctx, &cphys) + + //FIXME: proper error + if ret < 0 { + err = createError("libxl_get_physinfo failed: ", ret) + return + } + physinfo = &Physinfo{} + physinfo.Threads_per_core = uint32(cphys.threads_per_core) + physinfo.Cores_per_socket = uint32(cphys.cores_per_socket) + physinfo.Max_cpu_id = uint32(cphys.max_cpu_id) + physinfo.Nr_cpus = uint32(cphys.nr_cpus) + physinfo.Cpu_khz = uint32(cphys.cpu_khz) + physinfo.Total_pages = uint64(cphys.total_pages) + physinfo.Free_pages = uint64(cphys.free_pages) + physinfo.Scrub_pages = uint64(cphys.scrub_pages) + physinfo.Outstanding_pages = uint64(cphys.scrub_pages) + physinfo.Sharing_freed_pages = uint64(cphys.sharing_freed_pages) + physinfo.Sharing_used_frames = uint64(cphys.sharing_used_frames) + physinfo.Nr_nodes = uint32(cphys.nr_nodes) + physinfo.Hw_cap = hwcapCToGo(cphys.hw_cap) + physinfo.Cap_hvm = bool(cphys.cap_hvm) + physinfo.Cap_hvm_directio = bool(cphys.cap_hvm_directio) + + return +} + +//const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx); +func (Ctx *Context) GetVersionInfo() (info *VersionInfo, err error) { + err = Ctx.CheckOpen() + if err != nil { + return + } + + var cinfo *C.libxl_version_info + + cinfo = C.libxl_get_version_info(Ctx.ctx) + + info = &VersionInfo{} + info.Xen_version_major = int(cinfo.xen_version_major) + info.Xen_version_minor = int(cinfo.xen_version_minor) + info.Xen_version_extra = C.GoString(cinfo.xen_version_extra) + info.Compiler = C.GoString(cinfo.compiler) + info.Compile_by = C.GoString(cinfo.compile_by) + info.Compile_domain = C.GoString(cinfo.compile_domain) + info.Compile_date = C.GoString(cinfo.compile_date) + info.Capabilities = C.GoString(cinfo.capabilities) + info.Changeset = C.GoString(cinfo.changeset) + info.Virt_start = uint64(cinfo.virt_start) + info.Pagesize = int(cinfo.pagesize) + + return +} -- 2.1.4