host-beos.c

来自「bochs : one pc simulator.」· C语言 代码 · 共 220 行

C
220
字号
#include <Drivers.h>#include <KernelExport.h>#include <OS.h>#include <SupportDefs.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "plex86.h"#include "monitor.h"#define read_flags() ({ \        unsigned int __dummy; \        __asm__( \                                "pushfl\n\t" \                                "popl   %0\n\t" \                :"=r" (__dummy)); \        __dummy; \})#define write_flags(x) \        __asm__("push %0\n\tpopfl\n\t": :"r" (x))struct cookie {	sem_id		sem;	int			mon_ok;	uint32		irq_cnt[17];};static status_tdriver_open(const char *name, ulong flags, void **_cookie){	struct cookie *cookie;	status_t err;	cookie = calloc(sizeof(*cookie), 1);	if (!cookie)		return ENOMEM;	cookie->sem = create_sem(1, "plex86 mutex");	if (cookie->sem < 0) {		err = cookie->sem;		goto err1;	}	*_cookie = cookie;	return B_OK;err1:	free(cookie);	return err;}static status_tdriver_close(void *cookie){	return B_OK;}static status_tdriver_free(void *_cookie){	struct cookie *cookie = (struct cookie *)_cookie;	delete_sem(cookie->sem);	free(cookie);	return B_OK;}static status_tdriver_read(void *cookie, off_t pos, void *buf, size_t *count){	return B_OK;}static status_tdriver_write(void *cookie, off_t pos, const void *buf, size_t *count){	return B_OK;}static status_tdriver_ioctl(void *_cookie, ulong cmd, void *buf, size_t len){	struct cookie *cookie = (struct cookie *)_cookie;	uint32		cr0, arg, eflags_orig;	uchar		soft_int_vector;	status_t	err;	arg = *(uint32 *)buf;	switch (cmd) {		/* Allocate unpaged memory for the VM. */		/* arg is the number of megabytes to allocate */		/* Memory returned must not be pageable by the */		/* host OS, since the VM monitor will run in this */		/* memory as well.  Perhaps later, we can let */		/* the guest OS run in paged memory and reflect */		/* the page faults back to the host OS. */		case 0x6b02:			acquire_sem(cookie->sem);			init_monitor(MASTER_PIC_BASE_VECTOR, SLAVE_PIC_BASE_VECTOR, IRQ16_BASE_VECTOR);			cookie->mon_ok = 1;			release_sem(cookie->sem);			return B_OK;				case 0x6b03:			/* linux-specific hack, unnecessary under BeOS */			return B_OK;				/* run guest context for a time slice */		case 0x6b04:		{			cpu_status ps;			acquire_sem(cookie->sem);			if (!cookie->mon_ok) {				release_sem(cookie->sem);				return EPERM;			}			ps = disable_interrupts();			/* clear NT/IF/TF */			eflags_orig = read_flags();			write_flags(eflags_orig & ~0x00004300);			__host2guest();			write_flags(eflags_orig & ~0x00000200);			restore_interrupts(ps);			switch ( monitor_info.ret_because ) {				case RET_BECAUSE_IRQ:					/* reported vector is actually the IRQ# */					soft_int_vector = MASTER_PIC_BASE_VECTOR + monitor_info.vector;					soft_int(soft_int_vector);					cookie->irq_cnt[monitor_info.vector]++;					dprintf("plex86: irq %u\n", monitor_info.vector);					err = B_OK;					break;							case RET_BECAUSE_INT:					dprintf("plex86: int %u\n", monitor_info.vector);					err = EFAULT;					break;				case RET_BECAUSE_EXC:					dprintf("plex86: exc %u\n", monitor_info.vector);					err = EFAULT;					break;				case RET_BECAUSE_TEST:					dprintf("plex86: test\n");					err = B_OK;					break;				default:					dprintf("plex86: unknown ret_because\n");					err = B_OK;					break;			}			release_sem(cookie->sem);			return err;		}				case 0x6b05: /* tear down VM environment */			acquire_sem(cookie->sem);			cookie->mon_ok = 0;			release_sem(cookie->sem);			return B_OK;	}	return ENOSYS;}device_hooks driver_device = {	driver_open,	driver_close,	driver_free,	driver_ioctl,	driver_read,	driver_write};status_tinit_driver (void){	return B_OK;}voiduninit_driver(void){}const char **publish_devices(void){	static const char *driver_names[] = {		"misc/plex86",		NULL	};	return (const char **)driver_names;}device_hooks *find_device(const char *name){	return &driver_device;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?