Statistics
| Branch: | Revision:

root / hw / vmport.c @ 32902772

History | View | Annotate | Download (4.1 kB)

1 0975c304 ths
/*
2 0975c304 ths
 * QEMU VMPort emulation
3 0975c304 ths
 *
4 0975c304 ths
 * Copyright (C) 2007 Herv? Poussineau
5 0975c304 ths
 *
6 0975c304 ths
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 0975c304 ths
 * of this software and associated documentation files (the "Software"), to deal
8 0975c304 ths
 * in the Software without restriction, including without limitation the rights
9 0975c304 ths
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 0975c304 ths
 * copies of the Software, and to permit persons to whom the Software is
11 0975c304 ths
 * furnished to do so, subject to the following conditions:
12 0975c304 ths
 *
13 0975c304 ths
 * The above copyright notice and this permission notice shall be included in
14 0975c304 ths
 * all copies or substantial portions of the Software.
15 0975c304 ths
 *
16 0975c304 ths
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 0975c304 ths
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 0975c304 ths
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 0975c304 ths
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 0975c304 ths
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 0975c304 ths
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 0975c304 ths
 * THE SOFTWARE.
23 0975c304 ths
 */
24 87ecb68b pbrook
#include "hw.h"
25 87ecb68b pbrook
#include "isa.h"
26 87ecb68b pbrook
#include "pc.h"
27 03c63b94 Jan Kiszka
#include "kvm.h"
28 6872ef61 Blue Swirl
#include "qdev.h"
29 0975c304 ths
30 61ada15d aliguori
//#define VMPORT_DEBUG
31 61ada15d aliguori
32 0975c304 ths
#define VMPORT_CMD_GETVERSION 0x0a
33 0975c304 ths
#define VMPORT_CMD_GETRAMSIZE 0x14
34 0975c304 ths
35 0975c304 ths
#define VMPORT_ENTRIES 0x2c
36 0975c304 ths
#define VMPORT_MAGIC   0x564D5868
37 0975c304 ths
38 0975c304 ths
typedef struct _VMPortState
39 0975c304 ths
{
40 6872ef61 Blue Swirl
    ISADevice dev;
41 0975c304 ths
    IOPortReadFunc *func[VMPORT_ENTRIES];
42 0975c304 ths
    void *opaque[VMPORT_ENTRIES];
43 0975c304 ths
} VMPortState;
44 0975c304 ths
45 e14da0af Marcelo Tosatti
static VMPortState *port_state;
46 0975c304 ths
47 0975c304 ths
void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque)
48 0975c304 ths
{
49 0975c304 ths
    if (command >= VMPORT_ENTRIES)
50 0975c304 ths
        return;
51 0975c304 ths
52 e14da0af Marcelo Tosatti
    port_state->func[command] = func;
53 e14da0af Marcelo Tosatti
    port_state->opaque[command] = opaque;
54 0975c304 ths
}
55 0975c304 ths
56 0975c304 ths
static uint32_t vmport_ioport_read(void *opaque, uint32_t addr)
57 0975c304 ths
{
58 0975c304 ths
    VMPortState *s = opaque;
59 26fb5e48 aurel32
    CPUState *env = cpu_single_env;
60 0975c304 ths
    unsigned char command;
61 6dab28d5 ths
    uint32_t eax;
62 0975c304 ths
63 03c63b94 Jan Kiszka
    cpu_synchronize_state(env);
64 03c63b94 Jan Kiszka
65 26fb5e48 aurel32
    eax = env->regs[R_EAX];
66 0975c304 ths
    if (eax != VMPORT_MAGIC)
67 0975c304 ths
        return eax;
68 0975c304 ths
69 26fb5e48 aurel32
    command = env->regs[R_ECX];
70 0975c304 ths
    if (command >= VMPORT_ENTRIES)
71 0975c304 ths
        return eax;
72 0975c304 ths
    if (!s->func[command])
73 0975c304 ths
    {
74 61ada15d aliguori
#ifdef VMPORT_DEBUG
75 61ada15d aliguori
        fprintf(stderr, "vmport: unknown command %x\n", command);
76 61ada15d aliguori
#endif
77 0975c304 ths
        return eax;
78 0975c304 ths
    }
79 0975c304 ths
80 0975c304 ths
    return s->func[command](s->opaque[command], addr);
81 0975c304 ths
}
82 0975c304 ths
83 e9396bde aliguori
static void vmport_ioport_write(void *opaque, uint32_t addr, uint32_t val)
84 e9396bde aliguori
{
85 e9396bde aliguori
    CPUState *env = cpu_single_env;
86 e9396bde aliguori
87 e9396bde aliguori
    env->regs[R_EAX] = vmport_ioport_read(opaque, addr);
88 e9396bde aliguori
}
89 e9396bde aliguori
90 0975c304 ths
static uint32_t vmport_cmd_get_version(void *opaque, uint32_t addr)
91 0975c304 ths
{
92 26fb5e48 aurel32
    CPUState *env = cpu_single_env;
93 0975c304 ths
    env->regs[R_EBX] = VMPORT_MAGIC;
94 0975c304 ths
    return 6;
95 0975c304 ths
}
96 0975c304 ths
97 0975c304 ths
static uint32_t vmport_cmd_ram_size(void *opaque, uint32_t addr)
98 0975c304 ths
{
99 26fb5e48 aurel32
    CPUState *env = cpu_single_env;
100 0975c304 ths
    env->regs[R_EBX] = 0x1177;
101 0975c304 ths
    return ram_size;
102 0975c304 ths
}
103 0975c304 ths
104 86d86414 Blue Swirl
/* vmmouse helpers */
105 86d86414 Blue Swirl
void vmmouse_get_data(uint32_t *data)
106 86d86414 Blue Swirl
{
107 86d86414 Blue Swirl
    CPUState *env = cpu_single_env;
108 86d86414 Blue Swirl
109 86d86414 Blue Swirl
    data[0] = env->regs[R_EAX]; data[1] = env->regs[R_EBX];
110 86d86414 Blue Swirl
    data[2] = env->regs[R_ECX]; data[3] = env->regs[R_EDX];
111 86d86414 Blue Swirl
    data[4] = env->regs[R_ESI]; data[5] = env->regs[R_EDI];
112 86d86414 Blue Swirl
}
113 86d86414 Blue Swirl
114 86d86414 Blue Swirl
void vmmouse_set_data(const uint32_t *data)
115 86d86414 Blue Swirl
{
116 86d86414 Blue Swirl
    CPUState *env = cpu_single_env;
117 86d86414 Blue Swirl
118 86d86414 Blue Swirl
    env->regs[R_EAX] = data[0]; env->regs[R_EBX] = data[1];
119 86d86414 Blue Swirl
    env->regs[R_ECX] = data[2]; env->regs[R_EDX] = data[3];
120 86d86414 Blue Swirl
    env->regs[R_ESI] = data[4]; env->regs[R_EDI] = data[5];
121 86d86414 Blue Swirl
}
122 86d86414 Blue Swirl
123 6872ef61 Blue Swirl
static int vmport_initfn(ISADevice *dev)
124 0975c304 ths
{
125 6872ef61 Blue Swirl
    VMPortState *s = DO_UPCAST(VMPortState, dev, dev);
126 0975c304 ths
127 e14da0af Marcelo Tosatti
    register_ioport_read(0x5658, 1, 4, vmport_ioport_read, s);
128 e14da0af Marcelo Tosatti
    register_ioport_write(0x5658, 1, 4, vmport_ioport_write, s);
129 6872ef61 Blue Swirl
    isa_init_ioport(dev, 0x5658);
130 e14da0af Marcelo Tosatti
    port_state = s;
131 0975c304 ths
    /* Register some generic port commands */
132 26fb5e48 aurel32
    vmport_register(VMPORT_CMD_GETVERSION, vmport_cmd_get_version, NULL);
133 26fb5e48 aurel32
    vmport_register(VMPORT_CMD_GETRAMSIZE, vmport_cmd_ram_size, NULL);
134 6872ef61 Blue Swirl
    return 0;
135 0975c304 ths
}
136 6872ef61 Blue Swirl
137 6872ef61 Blue Swirl
static ISADeviceInfo vmport_info = {
138 6872ef61 Blue Swirl
    .qdev.name     = "vmport",
139 6872ef61 Blue Swirl
    .qdev.size     = sizeof(VMPortState),
140 6872ef61 Blue Swirl
    .qdev.no_user  = 1,
141 6872ef61 Blue Swirl
    .init          = vmport_initfn,
142 6872ef61 Blue Swirl
};
143 6872ef61 Blue Swirl
144 6872ef61 Blue Swirl
static void vmport_dev_register(void)
145 6872ef61 Blue Swirl
{
146 6872ef61 Blue Swirl
    isa_qdev_register(&vmport_info);
147 6872ef61 Blue Swirl
}
148 6872ef61 Blue Swirl
device_init(vmport_dev_register)