This commit is contained in:
commit
b6b7d72717
96 changed files with 37739 additions and 0 deletions
196
machine.h
Normal file
196
machine.h
Normal file
|
|
@ -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);
|
||||
Loading…
Add table
Add a link
Reference in a new issue