mirror of
https://github.com/fernandotcl/TinyEMU.git
synced 2025-10-14 01:58:37 +08:00
197 lines
6.5 KiB
C
197 lines
6.5 KiB
C
/*
|
|
* 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);
|