symbian-qemu-0.9.1-12/qemu-symbian-svp/hw/vmport.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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_DEBUG
       
    30 
       
    31 #define VMPORT_CMD_GETVERSION 0x0a
       
    32 #define VMPORT_CMD_GETRAMSIZE 0x14
       
    33 
       
    34 #define VMPORT_ENTRIES 0x2c
       
    35 #define VMPORT_MAGIC   0x564D5868
       
    36 
       
    37 typedef struct _VMPortState
       
    38 {
       
    39     IOPortReadFunc *func[VMPORT_ENTRIES];
       
    40     void *opaque[VMPORT_ENTRIES];
       
    41 } VMPortState;
       
    42 
       
    43 static VMPortState port_state;
       
    44 
       
    45 void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque)
       
    46 {
       
    47     if (command >= VMPORT_ENTRIES)
       
    48         return;
       
    49 
       
    50     port_state.func[command] = func;
       
    51     port_state.opaque[command] = opaque;
       
    52 }
       
    53 
       
    54 static uint32_t vmport_ioport_read(void *opaque, uint32_t addr)
       
    55 {
       
    56     VMPortState *s = opaque;
       
    57     CPUState *env = cpu_single_env;
       
    58     unsigned char command;
       
    59     uint32_t eax;
       
    60 
       
    61     eax = env->regs[R_EAX];
       
    62     if (eax != VMPORT_MAGIC)
       
    63         return eax;
       
    64 
       
    65     command = env->regs[R_ECX];
       
    66     if (command >= VMPORT_ENTRIES)
       
    67         return eax;
       
    68     if (!s->func[command])
       
    69     {
       
    70 #ifdef VMPORT_DEBUG
       
    71         fprintf(stderr, "vmport: unknown command %x\n", command);
       
    72 #endif
       
    73         return eax;
       
    74     }
       
    75 
       
    76     return s->func[command](s->opaque[command], addr);
       
    77 }
       
    78 
       
    79 static void vmport_ioport_write(void *opaque, uint32_t addr, uint32_t val)
       
    80 {
       
    81     CPUState *env = cpu_single_env;
       
    82 
       
    83     env->regs[R_EAX] = vmport_ioport_read(opaque, addr);
       
    84 }
       
    85 
       
    86 static uint32_t vmport_cmd_get_version(void *opaque, uint32_t addr)
       
    87 {
       
    88     CPUState *env = cpu_single_env;
       
    89     env->regs[R_EBX] = VMPORT_MAGIC;
       
    90     return 6;
       
    91 }
       
    92 
       
    93 static uint32_t vmport_cmd_ram_size(void *opaque, uint32_t addr)
       
    94 {
       
    95     CPUState *env = cpu_single_env;
       
    96     env->regs[R_EBX] = 0x1177;
       
    97     return ram_size;
       
    98 }
       
    99 
       
   100 void vmport_init(void)
       
   101 {
       
   102     register_ioport_read(0x5658, 1, 4, vmport_ioport_read, &port_state);
       
   103     register_ioport_write(0x5658, 1, 4, vmport_ioport_write, &port_state);
       
   104 
       
   105     /* Register some generic port commands */
       
   106     vmport_register(VMPORT_CMD_GETVERSION, vmport_cmd_get_version, NULL);
       
   107     vmport_register(VMPORT_CMD_GETRAMSIZE, vmport_cmd_ram_size, NULL);
       
   108 }