Commit 0975c30454de8e64d62d6a9360d7180f2e8d4e10

Authored by ths
1 parent 93342807

Add file missed in last commit.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3151 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 96 additions and 0 deletions
hw/vmport.c 0 → 100644
  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 "vl.h"
  25 +#include "cpu-all.h"
  26 +
  27 +#define VMPORT_CMD_GETVERSION 0x0a
  28 +#define VMPORT_CMD_GETRAMSIZE 0x14
  29 +
  30 +#define VMPORT_ENTRIES 0x2c
  31 +#define VMPORT_MAGIC 0x564D5868
  32 +
  33 +typedef struct _VMPortState
  34 +{
  35 + CPUState *env;
  36 + IOPortReadFunc *func[VMPORT_ENTRIES];
  37 + void *opaque[VMPORT_ENTRIES];
  38 +} VMPortState;
  39 +
  40 +static VMPortState port_state;
  41 +
  42 +void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque)
  43 +{
  44 + if (command >= VMPORT_ENTRIES)
  45 + return;
  46 +
  47 + port_state.func[command] = func;
  48 + port_state.opaque[command] = opaque;
  49 +}
  50 +
  51 +static uint32_t vmport_ioport_read(void *opaque, uint32_t addr)
  52 +{
  53 + VMPortState *s = opaque;
  54 + unsigned char command;
  55 + target_ulong eax;
  56 +
  57 + eax = s->env->regs[R_EAX];
  58 + if (eax != VMPORT_MAGIC)
  59 + return eax;
  60 +
  61 + command = s->env->regs[R_ECX];
  62 + if (command >= VMPORT_ENTRIES)
  63 + return eax;
  64 + if (!s->func[command])
  65 + {
  66 + printf("vmport: unknown command %x\n", command);
  67 + return eax;
  68 + }
  69 +
  70 + return s->func[command](s->opaque[command], addr);
  71 +}
  72 +
  73 +static uint32_t vmport_cmd_get_version(void *opaque, uint32_t addr)
  74 +{
  75 + CPUState *env = opaque;
  76 + env->regs[R_EBX] = VMPORT_MAGIC;
  77 + return 6;
  78 +}
  79 +
  80 +static uint32_t vmport_cmd_ram_size(void *opaque, uint32_t addr)
  81 +{
  82 + CPUState *env = opaque;
  83 + env->regs[R_EBX] = 0x1177;
  84 + return ram_size;
  85 +}
  86 +
  87 +void vmport_init(CPUState *env)
  88 +{
  89 + port_state.env = env;
  90 +
  91 + register_ioport_read(0x5658, 1, 4, vmport_ioport_read, &port_state);
  92 +
  93 + /* Register some generic port commands */
  94 + vmport_register(VMPORT_CMD_GETVERSION, vmport_cmd_get_version, env);
  95 + vmport_register(VMPORT_CMD_GETRAMSIZE, vmport_cmd_ram_size, env);
  96 +}
... ...