|
|
1.1 ! root 1: /* ! 2: * QEMU VMPort emulation ! 3: * ! 4: * Copyright (C) 2007 Herv� Poussineau ! 5: * ! 6: * Permission is hereby granted, free of charge, to any person obtaining a copy ! 7: * of this software and associated documentation files (the "Software"), to deal ! 8: * in the Software without restriction, including without limitation the rights ! 9: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ! 10: * copies of the Software, and to permit persons to whom the Software is ! 11: * furnished to do so, subject to the following conditions: ! 12: * ! 13: * The above copyright notice and this permission notice shall be included in ! 14: * all copies or substantial portions of the Software. ! 15: * ! 16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ! 17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ! 19: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ! 20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ! 21: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ! 22: * THE SOFTWARE. ! 23: */ ! 24: #include "hw.h" ! 25: #include "isa.h" ! 26: #include "pc.h" ! 27: #include "sysemu.h" ! 28: ! 29: #define VMPORT_CMD_GETVERSION 0x0a ! 30: #define VMPORT_CMD_GETRAMSIZE 0x14 ! 31: ! 32: #define VMPORT_ENTRIES 0x2c ! 33: #define VMPORT_MAGIC 0x564D5868 ! 34: ! 35: typedef struct _VMPortState ! 36: { ! 37: CPUState *env; ! 38: IOPortReadFunc *func[VMPORT_ENTRIES]; ! 39: void *opaque[VMPORT_ENTRIES]; ! 40: } VMPortState; ! 41: ! 42: static VMPortState port_state; ! 43: ! 44: void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque) ! 45: { ! 46: if (command >= VMPORT_ENTRIES) ! 47: return; ! 48: ! 49: port_state.func[command] = func; ! 50: port_state.opaque[command] = opaque; ! 51: } ! 52: ! 53: static uint32_t vmport_ioport_read(void *opaque, uint32_t addr) ! 54: { ! 55: VMPortState *s = opaque; ! 56: unsigned char command; ! 57: uint32_t eax; ! 58: ! 59: eax = s->env->regs[R_EAX]; ! 60: if (eax != VMPORT_MAGIC) ! 61: return eax; ! 62: ! 63: command = s->env->regs[R_ECX]; ! 64: if (command >= VMPORT_ENTRIES) ! 65: return eax; ! 66: if (!s->func[command]) ! 67: { ! 68: printf("vmport: unknown command %x\n", command); ! 69: return eax; ! 70: } ! 71: ! 72: return s->func[command](s->opaque[command], addr); ! 73: } ! 74: ! 75: static uint32_t vmport_cmd_get_version(void *opaque, uint32_t addr) ! 76: { ! 77: CPUState *env = opaque; ! 78: env->regs[R_EBX] = VMPORT_MAGIC; ! 79: return 6; ! 80: } ! 81: ! 82: static uint32_t vmport_cmd_ram_size(void *opaque, uint32_t addr) ! 83: { ! 84: CPUState *env = opaque; ! 85: env->regs[R_EBX] = 0x1177; ! 86: return ram_size; ! 87: } ! 88: ! 89: void vmport_init(CPUState *env) ! 90: { ! 91: port_state.env = env; ! 92: ! 93: register_ioport_read(0x5658, 1, 4, vmport_ioport_read, &port_state); ! 94: ! 95: /* Register some generic port commands */ ! 96: vmport_register(VMPORT_CMD_GETVERSION, vmport_cmd_get_version, env); ! 97: vmport_register(VMPORT_CMD_GETRAMSIZE, vmport_cmd_ram_size, env); ! 98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.