aboutsummaryrefslogtreecommitdiff
path: root/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h
diff options
context:
space:
mode:
Diffstat (limited to 'jslinux-2019-12-21/tinyemu-2019-12-21/machine.h')
-rw-r--r--jslinux-2019-12-21/tinyemu-2019-12-21/machine.h196
1 files changed, 196 insertions, 0 deletions
diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h
new file mode 100644
index 0000000..76217ee
--- /dev/null
+++ b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h
@@ -0,0 +1,196 @@
+/*
+ * VM definitions
+ *
+ * Copyright (c) 2016-2017 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "json.h"
+
+typedef struct FBDevice FBDevice;
+
+typedef void SimpleFBDrawFunc(FBDevice *fb_dev, void *opaque,
+ int x, int y, int w, int h);
+
+struct FBDevice {
+ /* the following is set by the device */
+ int width;
+ int height;
+ int stride; /* current stride in bytes */
+ uint8_t *fb_data; /* current pointer to the pixel data */
+ int fb_size; /* frame buffer memory size (info only) */
+ void *device_opaque;
+ void (*refresh)(struct FBDevice *fb_dev,
+ SimpleFBDrawFunc *redraw_func, void *opaque);
+};
+
+#define MAX_DRIVE_DEVICE 4
+#define MAX_FS_DEVICE 4
+#define MAX_ETH_DEVICE 1
+
+#define VM_CONFIG_VERSION 1
+
+typedef enum {
+ VM_FILE_BIOS,
+ VM_FILE_VGA_BIOS,
+ VM_FILE_KERNEL,
+ VM_FILE_INITRD,
+
+ VM_FILE_COUNT,
+} VMFileTypeEnum;
+
+typedef struct {
+ char *filename;
+ uint8_t *buf;
+ int len;
+} VMFileEntry;
+
+typedef struct {
+ char *device;
+ char *filename;
+ BlockDevice *block_dev;
+} VMDriveEntry;
+
+typedef struct {
+ char *device;
+ char *tag; /* 9p mount tag */
+ char *filename;
+ FSDevice *fs_dev;
+} VMFSEntry;
+
+typedef struct {
+ char *driver;
+ char *ifname;
+ EthernetDevice *net;
+} VMEthEntry;
+
+typedef struct VirtMachineClass VirtMachineClass;
+
+typedef struct {
+ char *cfg_filename;
+ const VirtMachineClass *vmc;
+ char *machine_name;
+ uint64_t ram_size;
+ BOOL rtc_real_time;
+ BOOL rtc_local_time;
+ char *display_device; /* NULL means no display */
+ int width, height; /* graphic width & height */
+ CharacterDevice *console;
+ VMDriveEntry tab_drive[MAX_DRIVE_DEVICE];
+ int drive_count;
+ VMFSEntry tab_fs[MAX_FS_DEVICE];
+ int fs_count;
+ VMEthEntry tab_eth[MAX_ETH_DEVICE];
+ int eth_count;
+
+ char *cmdline; /* bios or kernel command line */
+ BOOL accel_enable; /* enable acceleration (KVM) */
+ char *input_device; /* NULL means no input */
+
+ /* kernel, bios and other auxiliary files */
+ VMFileEntry files[VM_FILE_COUNT];
+} VirtMachineParams;
+
+typedef struct VirtMachine {
+ const VirtMachineClass *vmc;
+ /* network */
+ EthernetDevice *net;
+ /* console */
+ VIRTIODevice *console_dev;
+ CharacterDevice *console;
+ /* graphics */
+ FBDevice *fb_dev;
+} VirtMachine;
+
+struct VirtMachineClass {
+ const char *machine_names;
+ void (*virt_machine_set_defaults)(VirtMachineParams *p);
+ VirtMachine *(*virt_machine_init)(const VirtMachineParams *p);
+ void (*virt_machine_end)(VirtMachine *s);
+ int (*virt_machine_get_sleep_duration)(VirtMachine *s, int delay);
+ void (*virt_machine_interp)(VirtMachine *s, int max_exec_cycle);
+ BOOL (*vm_mouse_is_absolute)(VirtMachine *s);
+ void (*vm_send_mouse_event)(VirtMachine *s1, int dx, int dy, int dz,
+ unsigned int buttons);
+ void (*vm_send_key_event)(VirtMachine *s1, BOOL is_down, uint16_t key_code);
+};
+
+extern const VirtMachineClass riscv_machine_class;
+extern const VirtMachineClass pc_machine_class;
+
+void __attribute__((format(printf, 1, 2))) vm_error(const char *fmt, ...);
+int vm_get_int(JSONValue obj, const char *name, int *pval);
+int vm_get_int_opt(JSONValue obj, const char *name, int *pval, int def_val);
+
+void virt_machine_set_defaults(VirtMachineParams *p);
+void virt_machine_load_config_file(VirtMachineParams *p,
+ const char *filename,
+ void (*start_cb)(void *opaque),
+ void *opaque);
+void vm_add_cmdline(VirtMachineParams *p, const char *cmdline);
+char *get_file_path(const char *base_filename, const char *filename);
+void virt_machine_free_config(VirtMachineParams *p);
+VirtMachine *virt_machine_init(const VirtMachineParams *p);
+void virt_machine_end(VirtMachine *s);
+static inline int virt_machine_get_sleep_duration(VirtMachine *s, int delay)
+{
+ return s->vmc->virt_machine_get_sleep_duration(s, delay);
+}
+static inline void virt_machine_interp(VirtMachine *s, int max_exec_cycle)
+{
+ s->vmc->virt_machine_interp(s, max_exec_cycle);
+}
+static inline BOOL vm_mouse_is_absolute(VirtMachine *s)
+{
+ return s->vmc->vm_mouse_is_absolute(s);
+}
+static inline void vm_send_mouse_event(VirtMachine *s1, int dx, int dy, int dz,
+ unsigned int buttons)
+{
+ s1->vmc->vm_send_mouse_event(s1, dx, dy, dz, buttons);
+}
+static inline void vm_send_key_event(VirtMachine *s1, BOOL is_down, uint16_t key_code)
+{
+ s1->vmc->vm_send_key_event(s1, is_down, key_code);
+}
+
+/* gui */
+void sdl_refresh(VirtMachine *m);
+void sdl_init(int width, int height);
+
+/* simplefb.c */
+typedef struct SimpleFBState SimpleFBState;
+SimpleFBState *simplefb_init(PhysMemoryMap *map, uint64_t phys_addr,
+ FBDevice *fb_dev, int width, int height);
+void simplefb_refresh(FBDevice *fb_dev,
+ SimpleFBDrawFunc *redraw_func, void *opaque,
+ PhysMemoryRange *mem_range,
+ int fb_page_count);
+
+/* vga.c */
+typedef struct VGAState VGAState;
+VGAState *pci_vga_init(PCIBus *bus, FBDevice *fb_dev,
+ int width, int height,
+ const uint8_t *vga_rom_buf, int vga_rom_size);
+
+/* block_net.c */
+BlockDevice *block_device_init_http(const char *url,
+ int max_cache_size_kb,
+ void (*start_cb)(void *opaque),
+ void *start_opaque);