hax: add hax files for darwin, modify library name
authormunkyu.im <munkyu.im@samsung.com>
Fri, 21 Sep 2012 06:23:21 +0000 (15:23 +0900)
committermunkyu.im <munkyu.im@samsung.com>
Fri, 21 Sep 2012 07:46:18 +0000 (16:46 +0900)
shard library name change to libshared.

Singed-off-by: Munkyu Im <munkyu.im@samsung.com>
target-i386/hax-darwin.c [new file with mode: 0644]
target-i386/hax-darwin.h [new file with mode: 0644]
tizen/src/Makefile
tizen/src/skin/client/build.xml
tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkinMain.java

diff --git a/target-i386/hax-darwin.c b/target-i386/hax-darwin.c
new file mode 100644 (file)
index 0000000..c083034
--- /dev/null
@@ -0,0 +1,301 @@
+/* HAX module interface - darwin version */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+
+#include "target-i386/hax-i386.h"
+
+static char* qemu_strdup(const char *str)
+{
+       char *ptr;
+       size_t len = strlen(str);
+       ptr = qemu_vmalloc(len + 1);
+       memcpy(ptr, str, len+1);
+       return ptr;
+}
+
+
+hax_fd hax_mod_open(void)
+{
+    int fd = open("/dev/HAX", O_RDWR);
+
+    if (fd == -1)
+    {
+        dprint("hahFailed to open the hax module\n");
+        //return -errno;
+    }
+
+    return fd;
+}
+
+int hax_populate_ram(uint64_t va, uint32_t size)
+{
+    int ret;
+    struct hax_alloc_ram_info info;
+
+    if (!hax_global.vm || !hax_global.vm->fd)
+    {
+        dprint("Allocate memory before vm create?\n");
+        return -EINVAL;
+    }
+
+    info.size = size;
+    info.va = va;
+    ret = ioctl(hax_global.vm->fd, HAX_VM_IOCTL_ALLOC_RAM, &info);
+    if (ret < 0)
+    {
+        dprint("Failed to allocate %x memory\n", size);
+        return ret;
+    }
+    return 0;
+}
+
+int hax_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size, ram_addr_t phys_offset)
+{
+    struct hax_set_ram_info info, *pinfo = &info;
+    int ret;
+    ram_addr_t flags = phys_offset & ~TARGET_PAGE_MASK;
+
+    /* We only care for the  RAM and ROM */
+    if (flags >= IO_MEM_UNASSIGNED)
+        return 0;
+
+    if ( (start_addr & ~TARGET_PAGE_MASK) || (size & ~TARGET_PAGE_MASK))
+    {
+        dprint("set_phys_mem %x %lx requires page aligned addr and size\n", start_addr, size);
+        exit(1);
+        return -1;
+    }
+
+    info.pa_start = start_addr;
+    info.size = size;
+    info.va = (uint64_t)qemu_get_ram_ptr(phys_offset);
+    info.flags = (flags & IO_MEM_ROM) ? 1 : 0;
+
+    ret = ioctl(hax_global.vm->fd, HAX_VM_IOCTL_SET_RAM, pinfo);
+    if (ret < 0)
+    {
+        dprint("has set phys mem failed\n");
+        exit(1);
+    }
+    return ret;
+}
+
+int hax_capability(struct hax_state *hax, struct hax_capabilityinfo *cap)
+{
+    int ret;
+
+    ret = ioctl(hax->fd, HAX_IOCTL_CAPABILITY, cap);
+    if (ret == -1)
+    {
+        dprint("Failed to get HAX capability\n");
+        return -errno;
+    }
+
+    return 0;
+}
+
+int hax_mod_version(struct hax_state *hax, struct hax_module_version *version)
+{
+    int ret;
+
+    ret = ioctl(hax->fd, HAX_IOCTL_VERSION, version);
+    if (ret == -1)
+    {
+        dprint("Failed to get HAX version\n");
+        return -errno;
+    }
+
+    return 0;
+}
+
+static char *hax_vm_devfs_string(int vm_id)
+{
+    char *name;
+
+    if (vm_id > MAX_VM_ID)
+    {
+        dprint("Too big VM id\n");
+        return NULL;
+    }
+
+    name = qemu_strdup("/dev/hax_vm/vmxx");
+    if (!name)
+        return NULL;
+    sprintf(name, "/dev/hax_vm/vm%02d", vm_id);
+
+    return name;
+}
+
+static char *hax_vcpu_devfs_string(int vm_id, int vcpu_id)
+{
+    char *name;
+
+    if (vm_id > MAX_VM_ID || vcpu_id > MAX_VCPU_ID)
+    {
+        dprint("Too big vm id %x or vcpu id %x\n", vm_id, vcpu_id);
+        return NULL;
+    }
+
+    name = qemu_strdup("/dev/hax_vmxx/vcpuxx");
+    if (!name)
+        return NULL;
+
+    sprintf(name, "/dev/hax_vm%02d/vcpu%02d", vm_id, vcpu_id);
+
+    return name;
+}
+
+int hax_host_create_vm(struct hax_state *hax, int *vmid)
+{
+    int ret;
+    int vm_id = 0;
+
+    if (hax_invalid_fd(hax->fd))
+        return -EINVAL;
+
+    if (hax->vm)
+        return 0;
+
+    ret = ioctl(hax->fd, HAX_IOCTL_CREATE_VM, &vm_id);
+    *vmid = vm_id;
+    return ret;
+}
+
+hax_fd hax_host_open_vm(struct hax_state *hax, int vm_id)
+{
+    hax_fd fd;
+    char *vm_name = NULL;
+
+    vm_name = hax_vm_devfs_string(vm_id);
+    if (!vm_name)
+        return -1;
+
+    fd = open(vm_name, O_RDWR);
+    qemu_vfree(vm_name);
+
+    return fd;
+}
+
+/* Simply assume the size should be bigger than the hax_tunnel,
+ * since the hax_tunnel can be extended later with compatibility considered
+ */
+int hax_host_create_vcpu(hax_fd vm_fd, int vcpuid)
+{
+    int ret;
+
+    ret = ioctl(vm_fd, HAX_VM_IOCTL_VCPU_CREATE, &vcpuid);
+    if (ret < 0)
+        dprint("Failed to create vcpu %x\n", vcpuid);
+
+    return ret;
+}
+
+hax_fd hax_host_open_vcpu(int vmid, int vcpuid)
+{
+    char *devfs_path = NULL;
+    hax_fd fd;
+
+    devfs_path = hax_vcpu_devfs_string(vmid, vcpuid);
+    if (!devfs_path)
+    {
+        dprint("Failed to get the devfs\n");
+        return -EINVAL;
+    }
+
+    fd = open(devfs_path, O_RDWR);
+    qemu_vfree(devfs_path);
+    if (fd < 0)
+        dprint("Failed to open the vcpu devfs\n");
+    return fd;
+}
+
+int hax_host_setup_vcpu_channel(struct hax_vcpu_state *vcpu)
+{
+    int ret;
+    struct hax_tunnel_info info;
+
+    ret = ioctl(vcpu->fd, HAX_VCPU_IOCTL_SETUP_TUNNEL, &info);
+    if (ret)
+    {
+        dprint("Failed to setup the hax tunnel\n");
+        return ret;
+    }
+
+    if (!valid_hax_tunnel_size(info.size))
+    {
+        dprint("Invalid hax tunnel size %x\n", info.size);
+        ret = -EINVAL;
+        return ret;
+    }
+
+    vcpu->tunnel = (struct hax_tunnel *)(info.va);
+    vcpu->iobuf = (unsigned char *)(info.io_va);
+    return 0;
+}
+
+int hax_vcpu_run(struct hax_vcpu_state* vcpu)
+{
+    int ret;
+
+    ret = ioctl(vcpu->fd, HAX_VCPU_IOCTL_RUN, NULL);
+    return ret;
+}
+
+int hax_sync_fpu(CPUState *env, struct fx_layout *fl, int set)
+{
+    int ret, fd;
+
+    fd = hax_vcpu_get_fd(env);
+    if (fd <= 0)
+        return -1;
+
+    if (set)
+        ret = ioctl(fd, HAX_VCPU_IOCTL_SET_FPU, fl);
+    else
+        ret = ioctl(fd, HAX_VCPU_IOCTL_GET_FPU, fl);
+    return ret;
+}
+
+int hax_sync_msr(CPUState *env, struct hax_msr_data *msrs, int set)
+{
+    int ret, fd;
+
+    fd = hax_vcpu_get_fd(env);
+    if (fd <= 0)
+        return -1;
+    if (set)
+        ret = ioctl(fd, HAX_VCPU_IOCTL_SET_MSRS, msrs);
+    else
+        ret = ioctl(fd, HAX_VCPU_IOCTL_GET_MSRS, msrs);
+    return ret;
+}
+
+int hax_sync_vcpu_state(CPUState *env, struct vcpu_state_t *state, int set)
+{
+    int ret, fd;
+
+    fd = hax_vcpu_get_fd(env);
+    if (fd <= 0)
+        return -1;
+
+    if (set)
+        ret = ioctl(fd, HAX_VCPU_SET_REGS, state);
+    else
+        ret = ioctl(fd, HAX_VCPU_GET_REGS, state);
+    return ret;
+}
+
+int hax_inject_interrupt(CPUState *env, int vector)
+{
+    int ret, fd;
+
+    fd = hax_vcpu_get_fd(env);
+    if (fd <= 0)
+        return -1;
+
+    ret = ioctl(fd, HAX_VCPU_IOCTL_INTERRUPT, &vector);
+    return ret;
+}
diff --git a/target-i386/hax-darwin.h b/target-i386/hax-darwin.h
new file mode 100644 (file)
index 0000000..594a616
--- /dev/null
@@ -0,0 +1,48 @@
+#ifndef __HAX_UNIX_H
+#define __HAX_UNIX_H
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <stdarg.h>
+
+#define HAX_INVALID_FD  (-1)
+static inline int hax_invalid_fd(hax_fd fd)
+{
+    return fd <= 0;
+}
+
+static inline void hax_mod_close(struct hax_state *hax)
+{
+    close(hax->fd);
+}
+
+static inline void hax_close_fd(hax_fd fd)
+{
+    close(fd);
+}
+
+/* HAX model level ioctl */
+#define HAX_IOCTL_VERSION _IOWR(0, 0x20, struct hax_module_version)
+#define HAX_IOCTL_CREATE_VM _IOWR(0, 0x21, int)
+#define HAX_IOCTL_DESTROY_VM _IOW(0, 0x22, int)
+#define HAX_IOCTL_CAPABILITY _IOR(0, 0x23, struct hax_capabilityinfo)
+
+#define HAX_VM_IOCTL_VCPU_CREATE    _IOR(0, 0x80, int)
+#define HAX_VM_IOCTL_ALLOC_RAM _IOWR(0, 0x81, struct hax_alloc_ram_info)
+#define HAX_VM_IOCTL_SET_RAM _IOWR(0, 0x82, struct hax_set_ram_info)
+#define HAX_VM_IOCTL_VCPU_DESTROY    _IOR(0, 0x83, int)
+
+#define HAX_VCPU_IOCTL_RUN  _IO(0, 0xc0)
+#define HAX_VCPU_IOCTL_SET_MSRS _IOWR(0, 0xc1, struct hax_msr_data)
+#define HAX_VCPU_IOCTL_GET_MSRS _IOWR(0, 0xc2, struct hax_msr_data)
+
+#define HAX_VCPU_IOCTL_SET_FPU  _IOW(0, 0xc3, struct fx_layout)
+#define HAX_VCPU_IOCTL_GET_FPU  _IOR(0, 0xc4, struct fx_layout)
+
+#define HAX_VCPU_IOCTL_SETUP_TUNNEL _IOWR(0, 0xc5, struct hax_tunnel_info)
+#define HAX_VCPU_IOCTL_INTERRUPT _IOWR(0, 0xc6, uint32_t)
+#define HAX_VCPU_SET_REGS       _IOWR(0, 0xc7, struct vcpu_state_t)
+#define HAX_VCPU_GET_REGS       _IOWR(0, 0xc8, struct vcpu_state_t)
+
+#endif /* __HAX_UNIX_H */
index 51506df..0b25511 100755 (executable)
@@ -85,7 +85,7 @@ else
        cp -pPR ../../pc-bios/pxe-virtio.rom $(EMUL_DIR)/data/bios
        cp skin/client/lib/swt.jar $(EMUL_DIR)/bin/swt.jar
        cp -pPR skin/client/skins $(EMUL_DIR)
-       cp -pPR skin/client/native_src/libshare.dylib $(EMUL_DIR)/bin
+       cp -pPR skin/client/native_src/libshared.dylib $(EMUL_DIR)/bin
 endif
 
 ifdef CONFIG_LINUX
@@ -128,7 +128,7 @@ else
        cp -pPR ../../pc-bios/pxe-rtl8139.rom $(EMUL_DIR)/data/bios
        cp -pPR ../../pc-bios/pxe-virtio.rom $(EMUL_DIR)/data/bios
        cp -pPR skin/client/skins $(EMUL_DIR)
-       cp -pPR skin/client/native_src/libshare.dylib $(EMUL_DIR)/bin
+       cp -pPR skin/client/native_src/libshared.dylib $(EMUL_DIR)/bin
 endif
 
 ifdef CONFIG_LINUX
index 4af9a9f..f3856a5 100644 (file)
@@ -89,7 +89,7 @@
                        <arg line="-c" />
                        <arg line="Share.c" />
                        <arg line="-o" />
-                       <arg line="libshare.so" />
+                       <arg line="libshared.so" />
                        <arg line="-I${env.JAVA_JNI_H_INCLUDE_PATH}" />
                        <arg line="-I${env.JAVA_JNI_H_INCLUDE_PATH}/linux" />
                        <arg line="-fPIC" />
                        <arg line="-dynamiclib" />
                        <arg line="Share.o" />
                        <arg line="-o" />
-                       <arg line="libshare.dylib" />
+                       <arg line="libshared.dylib" />
                </exec>
                <delete>
                        <fileset dir="native_src" includes="**/*.h" />
index 12ef426..b937e85 100644 (file)
@@ -73,7 +73,7 @@ public class EmulatorSkinMain {
        static {
                /* shared memory */
                if (SwtUtil.isMacPlatform()) {
-                   System.loadLibrary("share");
+                   System.loadLibrary("shared");
                }
         }