summaryrefslogtreecommitdiff
path: root/util/vgabios
diff options
context:
space:
mode:
authorStefan Reinauer <reinauer@chromium.org>2015-10-21 13:00:41 -0700
committerStefan Reinauer <stefan.reinauer@coreboot.org>2016-02-18 01:47:04 +0100
commit05082737a9507a8bbb238d9d439f74a72a7606e8 (patch)
treedd5ec603f620e9e4a7a054533d5098b2a19c97b2 /util/vgabios
parenteb960f1af93b55cbfb0d5f86343970ded151d3c7 (diff)
Redo testbios utility to use all of YABEL
Drop buggy duplicate implementation of intXX handlers and provide enough glue to use all of YABEL. Change-Id: I2db77a56a2a991cb84876456dcbb3a843a0d9754 Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-on: https://review.coreboot.org/12117 Reviewed-by: Ronald G. Minnich <rminnich@gmail.com> Tested-by: build bot (Jenkins)
Diffstat (limited to 'util/vgabios')
-rw-r--r--util/vgabios/Makefile81
-rw-r--r--util/vgabios/device.c482
-rw-r--r--util/vgabios/helper_exec.c269
-rw-r--r--util/vgabios/helper_exec.h32
-rw-r--r--util/vgabios/helper_mem.c313
-rw-r--r--util/vgabios/include/arch/byteorder.h24
-rw-r--r--util/vgabios/include/arch/io.h4
-rw-r--r--util/vgabios/include/config.h35
-rw-r--r--util/vgabios/include/console/console.h17
-rw-r--r--util/vgabios/include/stdtypes.h15
-rw-r--r--util/vgabios/include/swab.h57
-rw-r--r--util/vgabios/int10.c476
-rw-r--r--util/vgabios/int15.c11
-rw-r--r--util/vgabios/int16.c9
-rw-r--r--util/vgabios/int1a.c171
-rw-r--r--util/vgabios/inte6.c20
-rw-r--r--util/vgabios/pci-userspace.c150
-rw-r--r--util/vgabios/pci-userspace.h81
-rw-r--r--util/vgabios/testbios.c249
-rw-r--r--util/vgabios/testbios.h62
20 files changed, 904 insertions, 1654 deletions
diff --git a/util/vgabios/Makefile b/util/vgabios/Makefile
index 520779c142..45a7259cb7 100644
--- a/util/vgabios/Makefile
+++ b/util/vgabios/Makefile
@@ -1,3 +1,18 @@
+##
+## This file is part of the coreboot project.
+##
+## Copyright (C) 2016 Google Inc.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; version 2 of the License.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+
#
# NOTE: You need to add your libpci.a version to CFLAGS below if
# pci-userspace.c does not build.
@@ -7,33 +22,55 @@
#
TOP ?= ../..
+OUT ?= build
CC ?= gcc
CFLAGS ?= -O2 -g -fomit-frame-pointer
CFLAGS += -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes
CFLAGS += -Wwrite-strings -Wredundant-decls -Wstrict-aliasing -Wshadow -Wextra
+CFLAGS += -Wno-unused-but-set-variable
# TODO check host architecture
-CBCFLAGS = -DCONFIG_ARCH_X86=1 -Wno-sign-compare -Wno-unused-but-set-variable -Wno-unused-parameter
+CBCFLAGS = -Wno-sign-compare -Wno-unused-parameter -Wno-format
+
+INCLUDES = -Iinclude -I$(OUT)/include
+INCLUDES += -I$(TOP)/src/device/oprom/include/
+INCLUDES += -I$(TOP)/src/device/oprom/yabel
+INCLUDES += -include $(TOP)/src/commonlib/include/commonlib/loglevel.h
+INCLUDES += -include stdtypes.h -include pci-userspace.h
+INCLUDES += -include $(TOP)/src/include/kconfig.h
+
+CBINCLUDES = -I$(TOP)/src -include include/stdtypes.h -include $(TOP)/src/include/endian.h
+CBINCLUDES += -include stdio.h -include sys/io.h
+
+SOURCE = testbios.c
+SOURCE += pci-userspace.c
+SOURCE += device.c
-INCLUDES = -Iinclude -I$(TOP)/src/device/oprom/include/
-CBINCLUDES = -I$(TOP)/src --include include/stdtypes.h
-CBINCLUDES += --include $(TOP)/src/commonlib/include/commonlib/loglevel.h
-CBINCLUDES += -include stdio.h
+X86EMU = x86emu/sys.c x86emu/decode.c x86emu/ops.c x86emu/ops2.c
+X86EMU += x86emu/prim_ops.c x86emu/fpu.c x86emu/debug.c
-SOURCE = int10.c int15.c int16.c int1a.c inte6.c testbios.c
-SOURCE += helper_exec.c helper_mem.c pci-userspace.c
+X86EMU += yabel/interrupt.c
+X86EMU += yabel/mem.c
+X86EMU += yabel/io.c
+X86EMU += yabel/pmm.c
+X86EMU += yabel/biosemu.c
+X86EMU += yabel/debug.c
+#X86EMU += yabel/device.c # For now we need a local copy :-(
-X86EMU = sys.c decode.c ops.c ops2.c prim_ops.c fpu.c debug.c
-X86EMU_DIR = $(TOP)/src/device/oprom/x86emu
+
+
+X86EMU_DIR = $(TOP)/src/device/oprom
X86EMU_SOURCE = $(addprefix $(X86EMU_DIR)/, $(X86EMU))
-OBJECTS:=$(SOURCE:.c=.o) $(X86EMU:.c=.o)
+OBJECTS:=$(addprefix $(OUT)/,$(SOURCE:.c=.o)) $(addprefix $(OUT)/, $(X86EMU:.c=.o))
LIBS=-lpci
all: dep testbios
+$(OBJECTS): includes
+
testbios: $(OBJECTS)
printf " LINK $(notdir $@)\n"
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
@@ -42,21 +79,37 @@ dep: $(SOURCE) $(X86EMU_SOURCE) Makefile
$(CC) $(CFLAGS) $(INCLUDES) -MM $(SOURCE) > .dependencies
$(CC) $(CFLAGS) $(INCLUDES) $(CBCFLAGS) $(CBINCLUDES) -MM $(X86EMU_SOURCE) >> .dependencies
+# Make all the dummy include files (that are in reality
+# covered by all the -include statements above)
+includes:
+ mkdir -p $(OUT)/include/device
+ mkdir -p $(OUT)/include/arch
+ touch $(OUT)/include/device/device.h
+ touch $(OUT)/include/device/pci.h
+ touch $(OUT)/include/device/pci_ops.h
+ touch $(OUT)/include/device/resource.h
+ touch $(OUT)/include/arch/io.h
+ touch $(OUT)/include/timer.h
+ touch $(OUT)/include/types.h
+
clean:
- rm -f *.o *~ testbios
+ rm -f $(OBJECTS) *~ testbios
+ rm -rf $(OUT)
distclean: clean
rm -f .dependencies
-%.o: $(X86EMU_DIR)/%.c
+$(OUT)/%.o: $(X86EMU_DIR)/%.c
printf " CC (x86emu) $(notdir $<)\n"
+ mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(CBCFLAGS) $(INCLUDES) $(CBINCLUDES) -c -o $@ $<
-%.o: %.c
+$(OUT)/%.o: %.c
printf " CC $(notdir $<)\n"
+ mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<
-.PHONY: all clean distclean
+.PHONY: all includes clean distclean
.SILENT:
-include .dependencies
diff --git a/util/vgabios/device.c b/util/vgabios/device.c
new file mode 100644
index 0000000000..3526e24716
--- /dev/null
+++ b/util/vgabios/device.c
@@ -0,0 +1,482 @@
+/******************************************************************************
+ * Copyright (c) 2004, 2008 IBM Corporation
+ * Copyright (c) 2008, 2009 Pattrick Hueper <phueper@hueper.net>
+ * All rights reserved.
+ * This program and the accompanying materials
+ * are made available under the terms of the BSD License
+ * which accompanies this distribution, and is available at
+ * http://www.opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ * IBM Corporation - initial implementation
+ *****************************************************************************/
+
+
+#include <stdtypes.h>
+
+#include <arch/byteorder.h>
+#include "device.h"
+#include "compat/rtas.h"
+#include <string.h>
+#include "debug.h"
+
+#include <device/device.h>
+#include <device/pci.h>
+#include <device/pci_ops.h>
+#include <device/resource.h>
+
+/* the device we are working with... */
+biosemu_device_t bios_device;
+//max. 6 BARs and 1 Exp.ROM plus CfgSpace and 3 legacy ranges, plus 2 "special" memory ranges
+translate_address_t translate_address_array[13];
+u8 taa_last_entry;
+
+typedef struct {
+ u8 info;
+ u8 bus;
+ u8 devfn;
+ u8 cfg_space_offset;
+ u64 address;
+ u64 size;
+} __attribute__ ((__packed__)) assigned_address_t;
+
+#if CONFIG_PCI_OPTION_ROM_RUN_YABEL
+/* coreboot version */
+
+static void
+biosemu_dev_get_addr_info(void)
+{
+#if 0
+ int taa_index = 0;
+ struct resource *r;
+ u8 bus = bios_device.dev->bus->secondary;
+ u16 devfn = bios_device.dev->path.pci.devfn;
+
+ bios_device.bus = bus;
+ bios_device.devfn = devfn;
+
+ DEBUG_PRINTF("bus: %x, devfn: %x\n", bus, devfn);
+ for (r = bios_device.dev->resource_list; r; r = r->next) {
+ translate_address_array[taa_index].info = r->flags;
+ translate_address_array[taa_index].bus = bus;
+ translate_address_array[taa_index].devfn = devfn;
+ translate_address_array[taa_index].cfg_space_offset =
+ r->index;
+ translate_address_array[taa_index].address = r->base;
+ translate_address_array[taa_index].size = r->size;
+ /* don't translate addresses... all addresses are 1:1 */
+ translate_address_array[taa_index].address_offset = 0;
+ taa_index++;
+ }
+ /* Expansion ROM */
+ translate_address_array[taa_index].info = IORESOURCE_MEM | IORESOURCE_READONLY;
+ translate_address_array[taa_index].bus = bus;
+ translate_address_array[taa_index].devfn = devfn;
+ translate_address_array[taa_index].cfg_space_offset = 0x30;
+ translate_address_array[taa_index].address = bios_device.img_addr;
+ translate_address_array[taa_index].size = 0; /* TODO: do we need the size? */
+ /* don't translate addresses... all addresses are 1:1 */
+ translate_address_array[taa_index].address_offset = 0;
+ taa_index++;
+ /* legacy ranges if its a VGA card... */
+ if ((bios_device.dev->class & 0xFF0000) == 0x030000) {
+ DEBUG_PRINTF("%s: VGA device found, adding legacy resources... \n", __func__);
+ /* I/O 0x3B0-0x3BB */
+ translate_address_array[taa_index].info = IORESOURCE_FIXED | IORESOURCE_IO;
+ translate_address_array[taa_index].bus = bus;
+ translate_address_array[taa_index].devfn = devfn;
+ translate_address_array[taa_index].cfg_space_offset = 0;
+ translate_address_array[taa_index].address = 0x3b0;
+ translate_address_array[taa_index].size = 0xc;
+ /* don't translate addresses... all addresses are 1:1 */
+ translate_address_array[taa_index].address_offset = 0;
+ taa_index++;
+ /* I/O 0x3C0-0x3DF */
+ translate_address_array[taa_index].info = IORESOURCE_FIXED | IORESOURCE_IO;
+ translate_address_array[taa_index].bus = bus;
+ translate_address_array[taa_index].devfn = devfn;
+ translate_address_array[taa_index].cfg_space_offset = 0;
+ translate_address_array[taa_index].address = 0x3c0;
+ translate_address_array[taa_index].size = 0x20;
+ /* don't translate addresses... all addresses are 1:1 */
+ translate_address_array[taa_index].address_offset = 0;
+ taa_index++;
+ /* Mem 0xA0000-0xBFFFF */
+ translate_address_array[taa_index].info = IORESOURCE_FIXED | IORESOURCE_MEM;
+ translate_address_array[taa_index].bus = bus;
+ translate_address_array[taa_index].devfn = devfn;
+ translate_address_array[taa_index].cfg_space_offset = 0;
+ translate_address_array[taa_index].address = 0xa0000;
+ translate_address_array[taa_index].size = 0x20000;
+ /* don't translate addresses... all addresses are 1:1 */
+ translate_address_array[taa_index].address_offset = 0;
+ taa_index++;
+ }
+ // store last entry index of translate_address_array
+ taa_last_entry = taa_index - 1;
+#if CONFIG_X86EMU_DEBUG
+ //dump translate_address_array
+ printf("translate_address_array: \n");
+ translate_address_t ta;
+ int i;
+ for (i = 0; i <= taa_last_entry; i++) {
+ ta = translate_address_array[i];
+ printf
+ ("%d: info: %08lx bus: %02x devfn: %02x cfg_space_offset: %02x\n\taddr: %016llx\n\toffs: %016llx\n\tsize: %016llx\n",
+ i, ta.info, ta.bus, ta.devfn, ta.cfg_space_offset,
+ ta.address, ta.address_offset, ta.size);
+ }
+#endif
+#endif
+}
+#else
+// use translate_address_dev and get_puid from net-snk's net_support.c
+void translate_address_dev(u64 *, phandle_t);
+u64 get_puid(phandle_t node);
+
+
+// scan all addresses assigned to the device ("assigned-addresses" and "reg")
+// store in translate_address_array for faster translation using dev_translate_address
+void
+biosemu_dev_get_addr_info(void)
+{
+ // get bus/dev/fn from assigned-addresses
+ int32_t len;
+ //max. 6 BARs and 1 Exp.ROM plus CfgSpace and 3 legacy ranges
+ assigned_address_t buf[11];
+ len =
+ of_getprop(bios_device.phandle, "assigned-addresses", buf,
+ sizeof(buf));
+ bios_device.bus = buf[0].bus;
+ bios_device.devfn = buf[0].devfn;
+ DEBUG_PRINTF("bus: %x, devfn: %x\n", bios_device.bus,
+ bios_device.devfn);
+ //store address translations for all assigned-addresses and regs in
+ //translate_address_array for faster translation later on...
+ int i = 0;
+ // index to insert data into translate_address_array
+ int taa_index = 0;
+ u64 address_offset;
+ for (i = 0; i < (len / sizeof(assigned_address_t)); i++, taa_index++) {
+ //copy all info stored in assigned-addresses
+ translate_address_array[taa_index].info = buf[i].info;
+ translate_address_array[taa_index].bus = buf[i].bus;
+ translate_address_array[taa_index].devfn = buf[i].devfn;
+ translate_address_array[taa_index].cfg_space_offset =
+ buf[i].cfg_space_offset;
+ translate_address_array[taa_index].address = buf[i].address;
+ translate_address_array[taa_index].size = buf[i].size;
+ // translate first address and store it as address_offset
+ address_offset = buf[i].address;
+ translate_address_dev(&address_offset, bios_device.phandle);
+ translate_address_array[taa_index].address_offset =
+ address_offset - buf[i].address;
+ }
+ //get "reg" property
+ len = of_getprop(bios_device.phandle, "reg", buf, sizeof(buf));
+ for (i = 0; i < (len / sizeof(assigned_address_t)); i++) {
+ if ((buf[i].size == 0) || (buf[i].cfg_space_offset != 0)) {
+ // we don't care for ranges with size 0 and
+ // BARs and Expansion ROM must be in assigned-addresses... so in reg
+ // we only look for those without config space offset set...
+ // i.e. the legacy ranges
+ continue;
+ }
+ //copy all info stored in assigned-addresses
+ translate_address_array[taa_index].info = buf[i].info;
+ translate_address_array[taa_index].bus = buf[i].bus;
+ translate_address_array[taa_index].devfn = buf[i].devfn;
+ translate_address_array[taa_index].cfg_space_offset =
+ buf[i].cfg_space_offset;
+ translate_address_array[taa_index].address = buf[i].address;
+ translate_address_array[taa_index].size = buf[i].size;
+ // translate first address and store it as address_offset
+ address_offset = buf[i].address;
+ translate_address_dev(&address_offset, bios_device.phandle);
+ translate_address_array[taa_index].address_offset =
+ address_offset - buf[i].address;
+ taa_index++;
+ }
+ // store last entry index of translate_address_array
+ taa_last_entry = taa_index - 1;
+#if CONFIG_X86EMU_DEBUG
+ //dump translate_address_array
+ printf("translate_address_array: \n");
+ translate_address_t ta;
+ for (i = 0; i <= taa_last_entry; i++) {
+ ta = translate_address_array[i];
+ printf
+ ("%d: %02x%02x%02x%02x\n\taddr: %016llx\n\toffs: %016llx\n\tsize: %016llx\n",
+ i, ta.info, ta.bus, ta.devfn, ta.cfg_space_offset,
+ ta.address, ta.address_offset, ta.size);
+ }
+#endif
+}
+#endif
+
+// "special memory" is a hack to make some parts of memory fall through to real memory
+// (ie. no translation). Necessary if option ROMs attempt DMA there, map registers or
+// do similarly crazy things.
+void
+biosemu_add_special_memory(u32 start, u32 size)
+{
+#if 0
+ int taa_index = ++taa_last_entry;
+ translate_address_array[taa_index].info = IORESOURCE_FIXED | IORESOURCE_MEM;
+ translate_address_array[taa_index].bus = 0;
+ translate_address_array[taa_index].devfn = 0;
+ translate_address_array[taa_index].cfg_space_offset = 0;
+ translate_address_array[taa_index].address = start;
+ translate_address_array[taa_index].size = size;
+ /* don't translate addresses... all addresses are 1:1 */
+ translate_address_array[taa_index].address_offset = 0;
+#endif
+ printf("TODO: Add special memory handler for %x[%x]\n", start, size);
+}
+
+#if !CONFIG_PCI_OPTION_ROM_RUN_YABEL
+// to simulate accesses to legacy VGA Memory (0xA0000-0xBFFFF)
+// we look for the first prefetchable memory BAR, if no prefetchable BAR found,
+// we use the first memory BAR
+// dev_translate_addr will translate accesses to the legacy VGA Memory into the found vmem BAR
+static void
+biosemu_dev_find_vmem_addr(void)
+{
+ int i = 0;
+ translate_address_t ta;
+ s8 tai_np = -1, tai_p = -1; // translate_address_array index for non-prefetchable and prefetchable memory
+ //search backwards to find first entry
+ for (i = taa_last_entry; i >= 0; i--) {
+ ta = translate_address_array[i];
+ if ((ta.cfg_space_offset >= 0x10)
+ && (ta.cfg_space_offset <= 0x24)) {
+ //only BARs
+ if ((ta.info & 0x03) >= 0x02) {
+ //32/64bit memory
+ tai_np = i;
+ if ((ta.info & 0x40) != 0) {
+ // prefetchable
+ tai_p = i;
+ }
+ }
+ }
+ }
+ if (tai_p != -1) {
+ ta = translate_address_array[tai_p];
+ bios_device.vmem_addr = ta.address;
+ bios_device.vmem_size = ta.size;
+ DEBUG_PRINTF
+ ("%s: Found prefetchable Virtual Legacy Memory BAR: %llx, size: %llx\n",
+ __func__, bios_device.vmem_addr,
+ bios_device.vmem_size);
+ } else if (tai_np != -1) {
+ ta = translate_address_array[tai_np];
+ bios_device.vmem_addr = ta.address;
+ bios_device.vmem_size = ta.size;
+ DEBUG_PRINTF
+ ("%s: Found non-prefetchable Virtual Legacy Memory BAR: %llx, size: %llx",
+ __func__, bios_device.vmem_addr,
+ bios_device.vmem_size);
+ }
+ // disable vmem
+ //bios_device.vmem_size = 0;
+}
+
+void
+biosemu_dev_get_puid(void)
+{
+ // get puid
+ bios_device.puid = get_puid(bios_device.phandle);
+ DEBUG_PRINTF("puid: 0x%llx\n", bios_device.puid);
+}
+#endif
+
+static void
+biosemu_dev_get_device_vendor_id(void)
+{
+
+ u32 pci_config_0;
+#if CONFIG_PCI_OPTION_ROM_RUN_YABEL
+ pci_config_0 = pci_read_config32(bios_device.dev, 0x0);
+#else
+ pci_config_0 =
+ rtas_pci_config_read(bios_device.puid, 4, bios_device.bus,
+ bios_device.devfn, 0x0);
+#endif
+ bios_device.pci_device_id =
+ (u16) ((pci_config_0 & 0xFFFF0000) >> 16);
+ bios_device.pci_vendor_id = (u16) (pci_config_0 & 0x0000FFFF);
+ DEBUG_PRINTF("PCI Device ID: %04x, PCI Vendor ID: %x\n",
+ bios_device.pci_device_id, bios_device.pci_vendor_id);
+}
+
+/* Check whether the device has a valid Expansion ROM and search the PCI Data
+ * Structure and any Expansion ROM Header (using dev_scan_exp_header()) for
+ * needed information. If the rom_addr parameter is != 0, it is the address of
+ * the Expansion ROM image and will be used, if it is == 0, the Expansion ROM
+ * BAR address will be used.
+ */
+u8
+biosemu_dev_check_exprom(unsigned long rom_base_addr)
+{
+#if 0
+ int i = 0;
+ translate_address_t ta;
+ u16 pci_ds_offset;
+ pci_data_struct_t pci_ds;
+ if (rom_base_addr == 0) {
+ // check for ExpROM Address (Offset 30) in taa
+ for (i = 0; i <= taa_last_entry; i++) {
+ ta = translate_address_array[i];
+ if (ta.cfg_space_offset == 0x30) {
+ //translated address
+ rom_base_addr = ta.address + ta.address_offset;
+ break;
+ }
+ }
+ }
+ /* In the ROM there could be multiple Expansion ROM Images... start
+ * searching them for an x86 image.
+ */
+ do {
+ if (rom_base_addr == 0) {
+ printf("Error: no Expansion ROM address found!\n");
+ return -1;
+ }
+ set_ci();
+ u16 rom_signature = in16le((void *) rom_base_addr);
+ clr_ci();
+ if (rom_signature != 0xaa55) {
+ printf
+ ("Error: invalid Expansion ROM signature: %02x!\n",
+ *((u16 *) rom_base_addr));
+ return -1;
+ }
+ set_ci();
+ // at offset 0x18 is the (16bit little-endian) pointer to the PCI Data Structure
+ pci_ds_offset = in16le((void *) (rom_base_addr + 0x18));
+ //copy the PCI Data Structure
+ memcpy(&pci_ds, (void *) (rom_base_addr + pci_ds_offset),
+ sizeof(pci_ds));
+ clr_ci();
+#if CONFIG_X86EMU_DEBUG
+ DEBUG_PRINTF("PCI Data Structure @%lx:\n",
+ rom_base_addr + pci_ds_offset);
+ dump((void *) &pci_ds, sizeof(pci_ds));
+#endif
+ if (strncmp((const char *) pci_ds.signature, "PCIR", 4) != 0) {
+ printf("Invalid PCI Data Structure found!\n");
+ break;
+ }
+ //little-endian conversion
+ pci_ds.vendor_id = in16le(&pci_ds.vendor_id);
+ pci_ds.device_id = in16le(&pci_ds.device_id);
+ pci_ds.img_length = in16le(&pci_ds.img_length);
+ pci_ds.pci_ds_length = in16le(&pci_ds.pci_ds_length);
+#ifdef DO_THIS_TEST_TWICE
+ if (pci_ds.vendor_id != bios_device.pci_vendor_id) {
+ printf
+ ("Image has invalid Vendor ID: %04x, expected: %04x\n",
+ pci_ds.vendor_id, bios_device.pci_vendor_id);
+ break;
+ }
+ if (pci_ds.device_id != bios_device.pci_device_id) {
+ printf
+ ("Image has invalid Device ID: %04x, expected: %04x\n",
+ pci_ds.device_id, bios_device.pci_device_id);
+ break;
+ }
+#endif
+ DEBUG_PRINTF("Image Length: %d\n", pci_ds.img_length * 512);
+ DEBUG_PRINTF("Image Code Type: %d\n", pci_ds.code_type);
+ if (pci_ds.code_type == 0) {
+ //x86 image
+ //store image address and image length in bios_device struct
+ bios_device.img_addr = rom_base_addr;
+ bios_device.img_size = pci_ds.img_length * 512;
+ // we found the image, exit the loop
+ break;
+ } else {
+ // no x86 image, check next image (if any)
+ rom_base_addr += pci_ds.img_length * 512;
+ }
+ if ((pci_ds.indicator & 0x80) == 0x80) {
+ //last image found, exit the loop
+ DEBUG_PRINTF("Last PCI Expansion ROM Image found.\n");
+ break;
+ }
+ }
+ while (bios_device.img_addr == 0);
+ // in case we did not find a valid x86 Expansion ROM Image
+ if (bios_device.img_addr == 0) {
+ printf("Error: no valid x86 Expansion ROM Image found!\n");
+ return -1;
+ }
+#endif
+ return 0;
+
+}
+
+u8
+biosemu_dev_init(struct device * device)
+{
+ u8 rval = 0;
+ //init bios_device struct
+ DEBUG_PRINTF("%s\n", __func__);
+ memset(&bios_device, 0, sizeof(bios_device));
+
+#if !CONFIG_PCI_OPTION_ROM_RUN_YABEL
+ bios_device.ihandle = of_open(device_name);
+ if (bios_device.ihandle == 0) {
+ DEBUG_PRINTF("%s is no valid device!\n", device_name);
+ return -1;
+ }
+ bios_device.phandle = of_finddevice(device_name);
+#else
+ bios_device.dev = device;
+#endif
+ biosemu_dev_get_addr_info();
+#if !CONFIG_PCI_OPTION_ROM_RUN_YABEL
+ biosemu_dev_find_vmem_addr();
+ biosemu_dev_get_puid();
+#endif
+ biosemu_dev_get_device_vendor_id();
+ return rval;
+}
+
+// translate address function using translate_address_array assembled
+// by dev_get_addr_info... MUCH faster than calling translate_address_dev
+// and accessing client interface for every translation...
+// returns: 0 if addr not found in translate_address_array, 1 if found.
+u8
+biosemu_dev_translate_address(int type, unsigned long * addr)
+{
+ int i = 0;
+ translate_address_t ta;
+#if !CONFIG_PCI_OPTION_ROM_RUN_YABEL
+ /* we don't need this hack for coreboot... we can access legacy areas */
+ //check if it is an access to legacy VGA Mem... if it is, map the address
+ //to the vmem BAR and then translate it...
+ // (translation info provided by Ben Herrenschmidt)
+ // NOTE: the translation seems to only work for NVIDIA cards... but it is needed
+ // to make some NVIDIA cards work at all...
+ if ((bios_device.vmem_size > 0)
+ && ((*addr >= 0xA0000) && (*addr < 0xB8000))) {
+ *addr = (*addr - 0xA0000) * 4 + 2 + bios_device.vmem_addr;
+ }
+ if ((bios_device.vmem_size > 0)
+ && ((*addr >= 0xB8000) && (*addr < 0xC0000))) {
+ u8 shift = *addr & 1;
+ *addr &= 0xfffffffe;
+ *addr = (*addr - 0xB8000) * 4 + shift + bios_device.vmem_addr;
+ }
+#endif
+ for (i = 0; i <= taa_last_entry; i++) {
+ ta = translate_address_array[i];
+ if ((*addr >= ta.address) && (*addr <= (ta.address + ta.size)) && (ta.info & type)) {
+ *addr += ta.address_offset;
+ return 1;
+ }
+ }
+ return 0;
+}
diff --git a/util/vgabios/helper_exec.c b/util/vgabios/helper_exec.c
deleted file mode 100644
index 4d6aae5a7c..0000000000
--- a/util/vgabios/helper_exec.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/int10/helper_exec.c,v 1.16 2001/04/30 14:34:57 tsi Exp $ */
-/*
- * XFree86 int10 module
- * execute BIOS int 10h calls in x86 real mode environment
- * Copyright 1999 Egbert Eich
- *
- * Part of this is based on code taken from DOSEMU
- * (C) Copyright 1992, ..., 1999 the "DOSEMU-Development-Team"
- */
-
-/*
- * To debug port accesses define PRINT_PORT.
- * Note! You also have to comment out ioperm()
- * in xf86EnableIO(). Otherwise we won't trap
- * on PIO.
- */
-#include <sys/io.h>
-#include <sys/time.h>
-#include <stdio.h>
-#include <stdtypes.h>
-#include <x86emu/x86emu.h>
-#include "helper_exec.h"
-#include "testbios.h"
-
-/* general software interrupt handler */
-u32 getIntVect(int num)
-{
- return MEM_RW(num << 2) + (MEM_RW((num << 2) + 2) << 4);
-}
-
-void pushw(u16 val)
-{
- X86_ESP -= 2;
- MEM_WW(((u32) X86_SS << 4) + X86_SP, val);
-}
-
-int run_bios_int(int num)
-{
- u32 eflags;
-
- eflags = X86_EFLAGS;
- pushw(eflags);
- pushw(X86_CS);
- pushw(X86_IP);
- X86_CS = MEM_RW((num << 2) + 2);
- X86_IP = MEM_RW(num << 2);
-
- printf("%s: INT %x CS:IP = %x:%x\n", __FUNCTION__,
- num, MEM_RW((num << 2) + 2), MEM_RW(num << 2));
-
- return 1;
-}
-
-#if 0
-
-int port_rep_inb(u16 port, u32 base, int d_f, u32 count)
-{
- register int inc = d_f ? -1 : 1;
- u32 dst = base;
- while (count--) {
- MEM_WB(dst, x_inb(port));
- dst += inc;
- }
- return dst - base;
-}
-
-int port_rep_inw(u16 port, u32 base, int d_f, u32 count)
-{
- register int inc = d_f ? -2 : 2;
- u32 dst = base;
- while (count--) {
- MEM_WW(dst, x_inw(port));
- dst += inc;
- }
- return dst - base;
-}
-
-int port_rep_inl(u16 port, u32 base, int d_f, u32 count)
-{
- register int inc = d_f ? -4 : 4;
- u32 dst = base;
- while (count--) {
- MEM_WL(dst, x_inl(port));
- dst += inc;
- }
- return dst - base;
-}
-
-int port_rep_outb(u16 port, u32 base, int d_f, u32 count)
-{
- register int inc = d_f ? -1 : 1;
- u32 dst = base;
- while (count--) {
- x_outb(port, MEM_RB(dst));
- dst += inc;
- }
- return dst - base;
-}
-
-int port_rep_outw(u16 port, u32 base, int d_f, u32 count)
-{
- register int inc = d_f ? -2 : 2;
- u32 dst = base;
- while (count--) {
- x_outw(port, MEM_RW(dst));
- dst += inc;
- }
- return dst - base;
-}
-
-int port_rep_outl(u16 port, u32 base, int d_f, u32 count)
-{
- register int inc = d_f ? -4 : 4;
- u32 dst = base;
- while (count--) {
- x_outl(port, MEM_RL(dst));
- dst += inc;
- }
- return dst - base;
-}
-
-#endif
-
-u8 x_inb(u16 port)
-{
- u8 val;
-
- val = inb(port);
-
- printf("inb(0x%04x) = 0x%02x\n", port, val);
-
- return val;
-}
-
-u16 x_inw(u16 port)
-{
- u16 val;
-
- val = inw(port);
-
- printf("inw(0x%04x) = 0x%04x\n", port, val);
- return val;
-}
-
-u32 x_inl(u16 port)
-{
- u32 val;
-
- val = inl(port);
-
- printf("inl(0x%04x) = 0x%08x\n", port, val);
- return val;
-}
-
-void x_outb(u16 port, u8 val)
-{
- printf("outb(0x%02x, 0x%04x)\n",
- val, port);
- outb(val, port);
-}
-
-void x_outw(u16 port, u16 val)
-{
- printf("outw(0x%04x, 0x%04x)\n", val, port);
- outw(val, port);
-}
-
-void x_outl(u16 port, u32 val)
-{
- printf("outl(0x%08x, 0x%04x)\n", val, port);
- outl(val, port);
-}
-
-#if 0
-u8 Mem_rb(int addr)
-{
- return (*current->mem->rb) (current, addr);
-}
-
-u16 Mem_rw(int addr)
-{
- return (*current->mem->rw) (current, addr);
-}
-
-u32 Mem_rl(int addr)
-{
- return (*current->mem->rl) (current, addr);
-}
-
-void Mem_wb(int addr, u8 val)
-{
- (*current->mem->wb) (current, addr, val);
-}
-
-void Mem_ww(int addr, u16 val)
-{
- (*current->mem->ww) (current, addr, val);
-}
-
-void Mem_wl(int addr, u32 val)
-{
- (*current->mem->wl) (current, addr, val);
-}
-#endif
-
-void getsecs(unsigned long *sec, unsigned long *usec)
-{
- struct timeval tv;
- gettimeofday(&tv, 0);
- *sec = tv.tv_sec;
- *usec = tv.tv_usec;
-}
-
-#define TAG(Cfg1Addr) (Cfg1Addr & 0xffff00)
-#define OFFSET(Cfg1Addr) (Cfg1Addr & 0xff)
-
-u8 bios_checksum(u8 * start, int size)
-{
- u8 sum = 0;
-
- while (size-- > 0)
- sum += *start++;
- return sum;
-}
-
-/*
- * Lock/Unlock legacy VGA. Some Bioses try to be very clever and make
- * an attempt to detect a legacy ISA card. If they find one they might
- * act very strange: for example they might configure the card as a
- * monochrome card. This might cause some drivers to choke.
- * To avoid this we attempt legacy VGA by writing to all know VGA
- * disable registers before we call the BIOS initialization and
- * restore the original values afterwards. In beween we hold our
- * breath. To get to a (possibly exising) ISA card need to disable
- * our current PCI card.
- */
-/*
- * This is just for booting: we just want to catch pure
- * legacy vga therefore we don't worry about mmio etc.
- * This stuff should really go into vgaHW.c. However then
- * the driver would have to load the vga-module prior to
- * doing int10.
- */
-/*void
-LockLegacyVGA(int screenIndex,legacyVGAPtr vga)
-{
- xf86SetCurrentAccess(FALSE, xf86Screens[screenIndex]);
- vga->save_msr = inb(0x3CC);
- vga->save_vse = inb(0x3C3);
- vga->save_46e8 = inb(0x46e8);
- vga->save_pos102 = inb(0x102);
- outb(0x3C2, ~(u8)0x03 & vga->save_msr);
- outb(0x3C3, ~(u8)0x01 & vga->save_vse);
- outb(0x46e8, ~(u8)0x08 & vga->save_46e8);
- outb(0x102, ~(u8)0x01 & vga->save_pos102);
- xf86SetCurrentAccess(TRUE, xf86Screens[screenIndex]);
-}
-
-void
-UnlockLegacyVGA(int screenIndex, legacyVGAPtr vga)
-{
- xf86SetCurrentAccess(FALSE, xf86Screens[screenIndex]);
- outb(0x102, vga->save_pos102);
- outb(0x46e8, vga->save_46e8);
- outb(0x3C3, vga->save_vse);
- outb(0x3C2, vga->save_msr);
- xf86SetCurrentAccess(TRUE, xf86Screens[screenIndex]);
-}
-*/
diff --git a/util/vgabios/helper_exec.h b/util/vgabios/helper_exec.h
deleted file mode 100644
index 7115ffbf02..0000000000
--- a/util/vgabios/helper_exec.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef __HELPER_EXEC_H__
-#define __HELPER_EXEC_H__
-
-u32 getIntVect(int num);
-int run_bios_int(int num);
-void pushw(u16 val);
-
-int port_rep_inb(u16 port, u32 base, int d_f, u32 count);
-int port_rep_inw(u16 port, u32 base, int d_f, u32 count);
-int port_rep_inl(u16 port, u32 base, int d_f, u32 count);
-int port_rep_outb(u16 port, u32 base, int d_f, u32 count);
-int port_rep_outw(u16 port, u32 base, int d_f, u32 count);
-int port_rep_outl(u16 port, u32 base, int d_f, u32 count);
-
-u8 x_inb(u16 port);
-u16 x_inw(u16 port);
-void x_outb(u16 port, u8 val);
-void x_outw(u16 port, u16 val);
-u32 x_inl(u16 port);
-void x_outl(u16 port, u32 val);
-
-u8 Mem_rb(int addr);
-u16 Mem_rw(int addr);
-u32 Mem_rl(int addr);
-
-void Mem_wb(int addr, u8 val);
-void Mem_ww(int addr, u16 val);
-void Mem_wl(int addr, u32 val);
-void getsecs(unsigned long *sec, unsigned long *usec);
-u8 bios_checksum(u8 * start, int size);
-
-#endif
diff --git a/util/vgabios/helper_mem.c b/util/vgabios/helper_mem.c
deleted file mode 100644
index 50a303b45e..0000000000
--- a/util/vgabios/helper_mem.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/int10/helper_mem.c,v 1.21 2001/05/22 16:24:37 tsi Exp $ */
-/*
- * XFree86 int10 module
- * execute BIOS int 10h calls in x86 real mode environment
- * Copyright 1999 Egbert Eich
- */
-#include <stdio.h>
-
-#define _INT10_PRIVATE
-
-#define REG pInt
-#if 0
-typedef enum {
- OPT_NOINT10,
- OPT_INIT_PRIMARY,
- OPT_BIOS_LOCATION
-} INT10Opts;
-
-static const OptionInfoRec INT10Options[] = {
- {OPT_NOINT10, "NoINT10", OPTV_BOOLEAN, {0}, FALSE},
- {OPT_INIT_PRIMARY, "InitPrimary", OPTV_BOOLEAN, {0}, FALSE},
- {OPT_BIOS_LOCATION, "BiosLocation", OPTV_STRING, {0}, FALSE},
- {-1, NULL, OPTV_NONE, {0}, FALSE},
-};
-#endif
-
-#ifdef DEBUG
-void dprint(unsigned long start, unsigned long size)
-{
- int i, j;
- char *c = (char *) start;
-
- for (j = 0; j < (size >> 4); j++) {
- char *d = c;
- printf("\n0x%lx: ", (unsigned long) c);
- for (i = 0; i < 16; i++)
- printf("%2.2x ", (unsigned char) (*(c++)));
- c = d;
- for (i = 0; i < 16; i++) {
- printf("%c", ((((unsigned char) (*c)) > 32) && (((unsigned char) (*c)) < 128)) ?
- (unsigned char) (*(c)) : '.');
- c++;
- }
- }
- printf("\n");
-}
-#endif /* DEBUG */
-
-#if 0
-#ifndef _PC
-/*
- * here we are really paranoid about faking a "real"
- * BIOS. Most of this information was pulled from
- * dosemu.
- */
-void setup_int_vect(void)
-{
- int i;
-
- /* let the int vects point to the SYS_BIOS seg */
- for (i = 0; i < 0x80; i++) {
- MEM_WW(i << 2, 0);
- MEM_WW((i << 2) + 2, SYS_BIOS >> 4);
- }
-
- reset_int_vect(current);
- /* font tables default location (int 1F) */
- MEM_WW(0x1f << 2, 0xfa6e);
-
- /* int 11 default location (Get Equipment Configuration) */
- MEM_WW(0x11 << 2, 0xf84d);
- /* int 12 default location (Get Conventional Memory Size) */
- MEM_WW(0x12 << 2, 0xf841);
- /* int 15 default location (I/O System Extensions) */
- MEM_WW(0x15 << 2, 0xf859);
- /* int 1A default location (RTC, PCI and others) */
- MEM_WW(0x1a << 2, 0xff6e);
- /* int 05 default location (Bound Exceeded) */
- MEM_WW(0x05 << 2, 0xff54);
- /* int 08 default location (Double Fault) */
- MEM_WW(0x08 << 2, 0xfea5);
- /* int 13 default location (Disk) */
- MEM_WW(0x13 << 2, 0xec59);
- /* int 0E default location (Page Fault) */
- MEM_WW(0x0e << 2, 0xef57);
- /* int 17 default location (Parallel Port) */
- MEM_WW(0x17 << 2, 0xefd2);
- /* fdd table default location (int 1e) */
- MEM_WW(0x1e << 2, 0xefc7);
-
- /* Set Equipment flag to VGA */
- i = MEM_RB(0x0410) & 0xCF;
- MEM_WB(0x0410, i);
- /* XXX Perhaps setup more of the BDA here. See also int42(0x00). */
-}
-#endif
-
-int setup_system_bios(void *base_addr)
-{
- char *base = (char *) base_addr;
-
- /*
- * we trap the "industry standard entry points" to the BIOS
- * and all other locations by filling them with "hlt"
- * TODO: implement hlt-handler for these
- */
- memset(base, 0xf4, 0x10000);
-
- /* set bios date */
- strcpy(base + 0x0FFF5, "06/11/99");
- /* set up eisa ident string */
- strcpy(base + 0x0FFD9, "PCI_ISA");
- /* write system model id for IBM-AT */
- *((unsigned char *) (base + 0x0FFFE)) = 0xfc;
-
- return 1;
-}
-
-void reset_int_vect(void)
-{
- /*
- * This table is normally located at 0xF000:0xF0A4. However, int 0x42,
- * function 0 (Mode Set) expects it (or a copy) somewhere in the bottom
- * 64kB. Note that because this data doesn't survive POST, int 0x42 should
- * only be used during EGA/VGA BIOS initialisation.
- */
- static const unsigned char VideoParms[] = {
- /* Timing for modes 0x00 & 0x01 */
- 0x38, 0x28, 0x2d, 0x0a, 0x1f, 0x06, 0x19, 0x1c,
- 0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
- /* Timing for modes 0x02 & 0x03 */
- 0x71, 0x50, 0x5a, 0x0a, 0x1f, 0x06, 0x19, 0x1c,
- 0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
- /* Timing for modes 0x04, 0x05 & 0x06 */
- 0x38, 0x28, 0x2d, 0x0a, 0x7f, 0x06, 0x64, 0x70,
- 0x02, 0x01, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
- /* Timing for mode 0x07 */
- 0x61, 0x50, 0x52, 0x0f, 0x19, 0x06, 0x19, 0x19,
- 0x02, 0x0d, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
- /* Display page lengths in little endian order */
- 0x00, 0x08, /* Modes 0x00 and 0x01 */
- 0x00, 0x10, /* Modes 0x02 and 0x03 */
- 0x00, 0x40, /* Modes 0x04 and 0x05 */
- 0x00, 0x40, /* Modes 0x06 and 0x07 */
- /* Number of columns for each mode */
- 40, 40, 80, 80, 40, 40, 80, 80,
- /* CGA Mode register value for each mode */
- 0x2c, 0x28, 0x2d, 0x29, 0x2a, 0x2e, 0x1e, 0x29,
- /* Padding */
- 0x00, 0x00, 0x00, 0x00
- };
- int i;
-
- for (i = 0; i < sizeof(VideoParms); i++)
- MEM_WB(i + (0x1000 - sizeof(VideoParms)), VideoParms[i]);
- MEM_WW(0x1d << 2, 0x1000 - sizeof(VideoParms));
- MEM_WW((0x1d << 2) + 2, 0);
-
- printf("SETUP INT\n");
- MEM_WW(0x10 << 2, 0xf065);
- MEM_WW((0x10 << 2) + 2, SYS_BIOS >> 4);
- MEM_WW(0x42 << 2, 0xf065);
- MEM_WW((0x42 << 2) + 2, SYS_BIOS >> 4);
- MEM_WW(0x6D << 2, 0xf065);
- MEM_WW((0x6D << 2) + 2, SYS_BIOS >> 4);
-}
-
-void set_return_trap(void)
-{
- /*
- * Here we set the exit condition: We return when we encounter
- * 'hlt' (=0xf4), which we locate at address 0x600 in x86 memory.
- */
- MEM_WB(0x0600, 0xf4);
-
- /*
- * Allocate a segment for the stack
- */
- xf86Int10AllocPages(1, current->stackseg);
-}
-
-void *xf86HandleInt10Options(ScrnInfoPtr pScrn, int entityIndex)
-{
- EntityInfoPtr pEnt = xf86GetEntityInfo(entityIndex);
- OptionInfoPtr options = NULL;
-
- if (pEnt->device) {
- pointer configOptions = NULL;
-
- /* Check if xf86CollectOptions() has already been called */
- if (((pEnt->index < 0) ||
- !xf86Screens[pEnt->index] ||
- !(configOptions = xf86Screens[pEnt->index]->options)) &&
- pEnt->device)
- configOptions = pEnt->device->options;
-
- if (configOptions) {
- if (!(options = (OptionInfoPtr) xalloc(sizeof(INT10Options))))
- return NULL;
-
- (void) memcpy(options, INT10Options, sizeof(INT10Options));
- xf86ProcessOptions(pScrn->scrnIndex, configOptions, options);
- }
- }
- xfree(pEnt);
-
- return options;
-}
-
-Bool int10skip(void *options)
-{
- Bool noint10 = FALSE;
-
- if (!options)
- return FALSE;
-
- xf86GetOptValBool(options, OPT_NOINT10, &noint10);
- return noint10;
-}
-
-Bool int10_check_bios(int scrnIndex, int codeSeg, unsigned char *vbiosMem)
-{
- int size;
-
- if ((codeSeg & 0x1f) || /* Not 512-byte aligned otherwise */
- ((codeSeg << 4) < V_BIOS) || ((codeSeg << 4) >= SYS_SIZE))
- return FALSE;
-
- if (xf86IsPc98())
- return FALSE;
-
- if ((*vbiosMem != 0x55) || (*(vbiosMem + 1) != 0xAA) || !*(vbiosMem + 2))
- return FALSE;
-
- size = *(vbiosMem + 2) * 512;
-
- if ((size + (codeSeg << 4)) > SYS_SIZE)
- return FALSE;
-
- if (bios_checksum(vbiosMem, size))
- xf86DrvMsg(scrnIndex, X_WARNING, "Bad V_BIOS checksum\n");
-
- return TRUE;
-}
-
-Bool initPrimary(void *options)
-{
- Bool initPrimary = FALSE;
-
- if (!options)
- return FALSE;
-
- xf86GetOptValBool(options, OPT_INIT_PRIMARY, &initPrimary);
- return initPrimary;
-}
-
-void xf86int10ParseBiosLocation(void *options, xf86int10BiosLocationPtr bios)
-{
- char *s;
- char *p;
- char *str = NULL;
-
- if (options)
- str = xf86GetOptValString(options, OPT_BIOS_LOCATION);
-
- bios->bus = BUS_NONE;
- if (!str)
- return;
-
- s = xstrdup(str);
- p = strtok(s, ":");
- if (xf86NameCmp(p, "pci"))
- bios->bus = BUS_PCI;
- else if (xf86NameCmp(p, "primary"))
- bios->bus = BUS_ISA;
-
- xfree(s);
-
- if (bios->bus == BUS_NONE)
- return;
-
- s = xstrdup(str);
- p = strchr(s, ':');
-
- switch (bios->bus) {
- case BUS_ISA:
- if (p)
- bios->location.legacy = atoi(++p);
- else
- bios->location.legacy = 0;
- break;
- case BUS_PCI:
- if (p) {
- bios->location.pci.bus = atoi(++p);
- if ((p = strchr(p, ':'))) {
- bios->location.pci.dev = atoi(++p);
- if ((p = strchr(p, ':'))) {
- bios->location.pci.func = atoi(++p);
- break;
- }
- }
- }
- /* fall through */
- bios->bus = BUS_NONE;
- break;
- default:
- break;
- }
- xfree(s);
-}
-
-
-#endif
diff --git a/util/vgabios/include/arch/byteorder.h b/util/vgabios/include/arch/byteorder.h
new file mode 100644
index 0000000000..fd29071b9d
--- /dev/null
+++ b/util/vgabios/include/arch/byteorder.h
@@ -0,0 +1,24 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Google Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _BYTEORDER_H
+#define _BYTEORDER_H
+
+#define __LITTLE_ENDIAN 1234
+
+#define cpu_to_le16(x) ((uint16_t)(x))
+#define cpu_to_le32(x) ((uint32_t)(x))
+
+#endif /* _BYTEORDER_H */
diff --git a/util/vgabios/include/arch/io.h b/util/vgabios/include/arch/io.h
deleted file mode 100644
index f28499de93..0000000000
--- a/util/vgabios/include/arch/io.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef _ASM_IO_H
-#define _ASM_IO_H
-#include <sys/io.h>
-#endif
diff --git a/util/vgabios/include/config.h b/util/vgabios/include/config.h
new file mode 100644
index 0000000000..f5d568fff7
--- /dev/null
+++ b/util/vgabios/include/config.h
@@ -0,0 +1,35 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Google Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#define CONFIG_PCI_OPTION_ROM_RUN_YABEL 1
+#define CONFIG_YABEL_PCI_ACCESS_OTHER_DEVICES 0
+#define CONFIG_YABEL_DIRECTHW 1
+
+#define CONFIG_X86EMU_DEBUG 1
+#define CONFIG_X86EMU_DEBUG_TIMINGS 0
+#define CONFIG_X86EMU_DEBUG_JMP 0
+#define CONFIG_X86EMU_DEBUG_TRACE 0
+#define CONFIG_X86EMU_DEBUG_PNP 0
+#define CONFIG_X86EMU_DEBUG_DISK 0
+#define CONFIG_X86EMU_DEBUG_PMM 0
+#define CONFIG_X86EMU_DEBUG_VBE 0
+#define CONFIG_X86EMU_DEBUG_INT10 0
+#define CONFIG_X86EMU_DEBUG_INTERRUPTS 0
+#define CONFIG_X86EMU_DEBUG_CHECK_VMEM_ACCESS 0
+#define CONFIG_X86EMU_DEBUG_MEM 0
+#define CONFIG_X86EMU_DEBUG_IO 0
+
+#define CONFIG_ARCH_X86 1
+#define CONFIG_ARCH_ARM 0
diff --git a/util/vgabios/include/console/console.h b/util/vgabios/include/console/console.h
index e52dbf7a97..443e3e8bb7 100644
--- a/util/vgabios/include/console/console.h
+++ b/util/vgabios/include/console/console.h
@@ -1,6 +1,21 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Google Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
#ifndef _CONSOLE_CONSOLE_H
#define _CONSOLE_CONSOLE_H
-#define CONFIG_X86EMU_DEBUG 1
int printk(int msg_level, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
+
#endif
diff --git a/util/vgabios/include/stdtypes.h b/util/vgabios/include/stdtypes.h
index 62c254d8cf..05f37a5a8a 100644
--- a/util/vgabios/include/stdtypes.h
+++ b/util/vgabios/include/stdtypes.h
@@ -1,3 +1,18 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Google Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
#ifndef _STDTYPES_H
#define _STDTYPES_H
diff --git a/util/vgabios/include/swab.h b/util/vgabios/include/swab.h
new file mode 100644
index 0000000000..28d0b8abb2
--- /dev/null
+++ b/util/vgabios/include/swab.h
@@ -0,0 +1,57 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _SWAB_H
+#define _SWAB_H
+
+/*
+ * linux/byteorder/swab.h
+ * Byte-swapping, independently from CPU endianness
+ * swabXX[ps]?(foo)
+ *
+ * Francois-Rene Rideau <fare@tunes.org> 19971205
+ * separated swab functions from cpu_to_XX,
+ * to clean up support for bizarre-endian architectures.
+ *
+ * See asm-i386/byteorder.h and such for examples of how to provide
+ * architecture-dependent optimized versions
+ *
+ */
+
+/* casts are necessary for constants, because we never know how for sure
+ * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way.
+ */
+#define swab16(x) \
+ ((unsigned short)( \
+ (((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \
+ (((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
+
+#define swab32(x) \
+ ((unsigned int)( \
+ (((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \
+ (((unsigned int)(x) & (unsigned int)0x0000ff00UL) << 8) | \
+ (((unsigned int)(x) & (unsigned int)0x00ff0000UL) >> 8) | \
+ (((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
+
+#define swab64(x) \
+ ((uint64_t)( \
+ (((uint64_t)(x) & (uint64_t)0x00000000000000ffULL) << 56) | \
+ (((uint64_t)(x) & (uint64_t)0x000000000000ff00ULL) << 40) | \
+ (((uint64_t)(x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \
+ (((uint64_t)(x) & (uint64_t)0x00000000ff000000ULL) << 8) | \
+ (((uint64_t)(x) & (uint64_t)0x000000ff00000000ULL) >> 8) | \
+ (((uint64_t)(x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \
+ (((uint64_t)(x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \
+ (((uint64_t)(x) & (uint64_t)0xff00000000000000ULL) >> 56) ))
+
+#endif /* _SWAB_H */
diff --git a/util/vgabios/int10.c b/util/vgabios/int10.c
deleted file mode 100644
index 21ba7fbfa7..0000000000
--- a/util/vgabios/int10.c
+++ /dev/null
@@ -1,476 +0,0 @@
-#include <stdio.h>
-#include <stdtypes.h>
-#include "testbios.h"
-
-extern int verbose;
-
-
-#ifndef _PC
-/*
- * This is derived from a number of PC system BIOS'es. The intent here is to
- * provide very primitive video support, before an EGA/VGA BIOS installs its
- * own interrupt vector. Here, "Ignored" calls should remain so. "Not
- * Implemented" denotes functionality that can be implemented should the need
- * arise. What are "Not Implemented" throughout are video memory accesses.
- * Also, very little input validity checking is done here.
- */
-int int42_handler(void)
-{
-#if 0
- if (verbose && X86_AH != 0x0e) {
- printf("int%x\n", current->num);
- x86emu_dump_xregs();
- }
-
- switch (X86_AH) {
- case 0x00:
- /* Set Video Mode */
- /* Enter: AL = video mode number */
- /* Leave: Nothing */
- /* Implemented (except for clearing the screen) */
- { /* Localise */
- int i;
- u16 ioport, int1d, regvals, tmp;
- u8 mode, cgamode, cgacolour;
-
- /*
- * Ignore all mode numbers but 0x00-0x13. Some systems also ignore
- * 0x0B and 0x0C, but don't do that here.
- */
- if (X86_AL > 0x13)
- break;
-
- /*
- * You didn't think that was really the mode set, did you? There
- * are only so many slots in the video parameter table...
- */
- mode = X86_AL;
- ioport = 0x03D4;
- switch (MEM_RB(0x0410) & 0x30) {
- case 0x30: /* MDA */
- mode = 0x07; /* Force mode to 0x07 */
- ioport = 0x03B4;
- break;
- case 0x10: /* CGA 40x25 */
- if (mode >= 0x07)
- mode = 0x01;
- break;
- case 0x20: /* CGA 80x25 (MCGA?) */
- if (mode >= 0x07)
- mode = 0x03;
- break;
- case 0x00: /* EGA/VGA */
- if (mode >= 0x07) /* Don't try MDA timings */
- mode = 0x01; /* !?!?! */
- break;
- }
-
- /* Locate data in video parameter table */
- int1d = MEM_RW(0x1d << 2);
- regvals = ((mode >> 1) << 4) + int1d;
- cgacolour = 0x30;
- if (mode == 0x06) {
- regvals -= 0x10;
- cgacolour = 0x3F;
- }
-
- /** Update BIOS Data Area **/
-
- /* Video mode */
- MEM_WB(0x0449, mode);
-
- /* Columns */
- tmp = MEM_RB(mode + int1d + 0x48);
- MEM_WW(0x044A, tmp);
-
- /* Page length */
- tmp = MEM_RW((mode & 0x06) + int1d + 0x40);
- MEM_WW(0x044C, tmp);
-
- /* Start Address */
- MEM_WW(0x044E, 0);
-
- /* Cursor positions, one for each display page */
- for (i = 0x0450; i < 0x0460; i += 2)
- MEM_WW(i, 0);
-
- /* Cursor start & end scanlines */
- tmp = MEM_RB(regvals + 0x0B);
- MEM_WB(0x0460, tmp);
- tmp = MEM_RB(regvals + 0x0A);
- MEM_WB(0x0461, tmp);
-
- /* Current display page number */
- MEM_WB(0x0462, 0);
-
- /* CRTC I/O address */
- MEM_WW(0x0463, ioport);
-
- /* CGA Mode register value */
- cgamode = MEM_RB(mode + int1d + 0x50);
- MEM_WB(0x0465, cgamode);
-
- /* CGA Colour register value */
- MEM_WB(0x0466, cgacolour);
-
- /* Rows */
- MEM_WB(0x0484, (25 - 1));
-
- /* Programme the mode */
- outb(ioport + 4, cgamode & 0x37); /* Turn off screen */
- for (i = 0; i < 0x10; i++) {
- tmp = MEM_RB(regvals + i);
- outb(ioport, i);
- outb(ioport + 1, tmp);
- }
- outb(ioport + 5, cgacolour); /* Select colour mode */
- outb(ioport + 4, cgamode); /* Turn on screen */
- }
- break;
-
- case 0x01:
- /* Set Cursor Type */
- /* Enter: CH = starting line for cursor */
- /* CL = ending line for cursor */
- /* Leave: Nothing */
- /* Implemented */
- { /* Localise */
- u16 ioport = MEM_RW(0x0463);
-
- MEM_WB(0x0460, X86_CL);
- MEM_WB(0x0461, X86_CH);
-
- outb(ioport, 0x0A);
- outb(ioport + 1, X86_CH);
- outb(ioport, 0x0B);
- outb(ioport + 1, X86_CL);
- }
- break;
-
- case 0x02:
- /* Set Cursor Position */
- /* Enter: BH = display page number */
- /* DH = row */
- /* DL = column */
- /* Leave: Nothing */
- /* Implemented */
- { /* Localise */
- u16 offset, ioport;
-
- MEM_WB((X86_BH << 1) + 0x0450, X86_DL);
- MEM_WB((X86_BH << 1) + 0x0451, X86_DH);
-
- if (X86_BH != MEM_RB(0x0462))
- break;
-
- offset = (X86_DH * MEM_RW(0x044A)) + X86_DL;
- offset += MEM_RW(0x044E) << 1;
-
- ioport = MEM_RW(0x0463);
- outb(ioport, 0x0E);
- outb(ioport + 1, offset >> 8);
- outb(ioport, 0x0F);
- outb(ioport + 1, offset & 0xFF);
- }
- break;
-
- case 0x03:
- /* Get Cursor Position */
- /* Enter: BH = display page number */
- /* Leave: CH = starting line for cursor */
- /* CL = ending line for cursor */
- /* DH = row */
- /* DL = column */
- /* Implemented */
- { /* Localise */
- X86_CL = MEM_RB(0x0460);
- X86_CH = MEM_RB(0x0461);
- X86_DL = MEM_RB((X86_BH << 1) + 0x0450);
- X86_DH = MEM_RB((X86_BH << 1) + 0x0451);
- }
- break;
-
- case 0x04:
- /* Get Light Pen Position */
- /* Enter: Nothing */
- /* Leave: AH = 0x01 (down/triggered) or 0x00 (not) */
- /* BX = pixel column */
- /* CX = pixel row */
- /* DH = character row */
- /* DL = character column */
- /* Not Implemented */
- { /* Localise */
- printf("int%x - Get Light Pen Position. "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
- X86_AH = X86_BX = X86_CX = X86_DX = 0;
- }
- break;
-
- case 0x05:
- /* Set Display Page */
- /* Enter: AL = display page number */
- /* Leave: Nothing */
- /* Implemented */
- { /* Localise */
- u16 start, ioport = MEM_RW(0x0463);
- u8 x, y;
-
- /* Calculate new start address */
- MEM_WB(0x0462, X86_AL);
- start = X86_AL * MEM_RW(0x044C);
- MEM_WW(0x044E, start);
- start <<= 1;
-
- /* Update start address */
- outb(ioport, 0x0C);
- outb(ioport + 1, start >> 8);
- outb(ioport, 0x0D);
- outb(ioport + 1, start & 0xFF);
-
- /* Switch cursor position */
- y = MEM_RB((X86_AL << 1) + 0x0450);
- x = MEM_RB((X86_AL << 1) + 0x0451);
- start += (y * MEM_RW(0x044A)) + x;
-
- /* Update cursor position */
- outb(ioport, 0x0E);
- outb(ioport + 1, start >> 8);
- outb(ioport, 0x0F);
- outb(ioport + 1, start & 0xFF);
- }
- break;
-
- case 0x06:
- /* Initialise or Scroll Window Up */
- /* Enter: AL = lines to scroll up */
- /* BH = attribute for blank */
- /* CH = upper y of window */
- /* CL = left x of window */
- /* DH = lower y of window */
- /* DL = right x of window */
- /* Leave: Nothing */
- /* Not Implemented */
- { /* Localise */
- printf("int%x: Initialise or Scroll Window Up - "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
- }
- break;
-
- case 0x07:
- /* Initialise or Scroll Window Down */
- /* Enter: AL = lines to scroll down */
- /* BH = attribute for blank */
- /* CH = upper y of window */
- /* CL = left x of window */
- /* DH = lower y of window */
- /* DL = right x of window */
- /* Leave: Nothing */
- /* Not Implemented */
- { /* Localise */
- printf("int%x: Initialise or Scroll Window Down - "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
-
- }
- break;
-
- case 0x08:
- /* Read Character and Attribute at Cursor */
- /* Enter: BH = display page number */
- /* Leave: AH = attribute */
- /* AL = character */
- /* Not Implemented */
- { /* Localise */
- printf
- ("int%x: Read Character and Attribute at Cursor - "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
-
- X86_AX = 0;
- }
- break;
-
- case 0x09:
- /* Write Character and Attribute at Cursor */
- /* Enter: AL = character */
- /* BH = display page number */
- /* BL = attribute (text) or colour (graphics) */
- /* CX = replication count */
- /* Leave: Nothing */
- /* Not Implemented */
- { /* Localise */
- printf
- ("int%x: Write Character and Attribute at Cursor - "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
-
- }
- break;
-
- case 0x0a:
- /* Write Character at Cursor */
- /* Enter: AL = character */
- /* BH = display page number */
- /* BL = colour */
- /* CX = replication count */
- /* Leave: Nothing */
- /* Not Implemented */
- { /* Localise */
- printf("int%x: Write Character at Cursor - "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
-
- }
- break;
-
- case 0x0b:
- /* Set Palette, Background or Border */
- /* Enter: BH = 0x00 or 0x01 */
- /* BL = colour or palette (respectively) */
- /* Leave: Nothing */
- /* Implemented */
- { /* Localise */
- u16 ioport = MEM_RW(0x0463) + 5;
- u8 cgacolour = MEM_RB(0x0466);
-
- if (X86_BH) {
- cgacolour &= 0xDF;
- cgacolour |= (X86_BL & 0x01) << 5;
- } else {
- cgacolour &= 0xE0;
- cgacolour |= X86_BL & 0x1F;
- }
-
- MEM_WB(0x0466, cgacolour);
- outb(ioport, cgacolour);
- }
- break;
-
- case 0x0c:
- /* Write Graphics Pixel */
- /* Enter: AL = pixel value */
- /* BH = display page number */
- /* CX = column */
- /* DX = row */
- /* Leave: Nothing */
- /* Not Implemented */
- { /* Localise */
- printf("int%x: Write Graphics Pixel - "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
-
- }
- break;
-
- case 0x0d:
- /* Read Graphics Pixel */
- /* Enter: BH = display page number */
- /* CX = column */
- /* DX = row */
- /* Leave: AL = pixel value */
- /* Not Implemented */
- { /* Localise */
- printf("int%x: Write Graphics Pixel - "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
-
- X86_AL = 0;
-
- }
- break;
-
- case 0x0e:
- /* Write Character in Teletype Mode */
- /* Enter: AL = character */
- /* BH = display page number */
- /* BL = foreground colour */
- /* Leave: Nothing */
- /* Not Implemented */
- /* WARNING: Emulation of BEL characters will require */
- /* emulation of RTC and PC speaker I/O. */
- /* Also, this recurses through int 0x10 */
- /* which might or might not have been */
- /* installed yet. */
- { /* Localise */
-#ifdef PARANOID
- printf("int%x: Write Character in Teletype Mode - "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
-#endif
- printf("%c", X86_AL);
- }
- break;
-
- case 0x0f:
- /* Get Video Mode */
- /* Enter: Nothing */
- /* Leave: AH = number of columns */
- /* AL = video mode number */
- /* BH = display page number */
- /* Implemented */
- { /* Localise */
- X86_AH = MEM_RW(0x044A);
- X86_AL = MEM_RB(0x0449);
- X86_BH = MEM_RB(0x0462);
- }
- break;
-
- case 0x10:
- /* Colour Control (subfunction in AL) */
- /* Enter: Various */
- /* Leave: Various */
- /* Ignored */
- break;
-
- case 0x11:
- /* Font Control (subfunction in AL) */
- /* Enter: Various */
- /* Leave: Various */
- /* Ignored */
- break;
-
- case 0x12:
- /* Miscellaneous (subfunction in BL) */
- /* Enter: Various */
- /* Leave: Various */
- /* Ignored. Previous code here optionally allowed */
- /* the enabling and disabling of VGA, but no system */
- /* BIOS I've come across actually implements it. */
- break;
-
- case 0x13:
- /* Write String in Teletype Mode */
- /* Enter: AL = write mode */
- /* BL = attribute (if (AL & 0x02) == 0) */
- /* CX = string length */
- /* DH = row */
- /* DL = column */
- /* ES:BP = string segment:offset */
- /* Leave: Nothing */
- /* Not Implemented */
- /* WARNING: Emulation of BEL characters will require */
- /* emulation of RTC and PC speaker I/O. */
- /* Also, this recurses through int 0x10 */
- /* which might or might not have been */
- /* installed yet. */
- { /* Localise */
- printf("int%x: Write String in Teletype Mode - "
- "Function not implemented.\n", current->num);
- x86emu_dump_xregs();
-
- }
- break;
-
- default:
- /* Various extensions */
- /* Enter: Various */
- /* Leave: Various */
- /* Ignored */
- break;
- }
-#endif
- return 1;
-}
-#endif
diff --git a/util/vgabios/int15.c b/util/vgabios/int15.c
deleted file mode 100644
index a1235bbbf7..0000000000
--- a/util/vgabios/int15.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <stdio.h>
-#include <stdtypes.h>
-#include "testbios.h"
-
-int int15_handler(void)
-{
- printf("\nint15 encountered.\n");
- x86emu_dump_xregs();
- X86_EAX = 0;
- return 1;
-}
diff --git a/util/vgabios/int16.c b/util/vgabios/int16.c
deleted file mode 100644
index 06df8266af..0000000000
--- a/util/vgabios/int16.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include <stdio.h>
-#include "testbios.h"
-
-int int16_handler(void)
-{
- printf("\nint16: keyboard not supported right now.\n");
- x86emu_dump_xregs();
- return 1;
-}
diff --git a/util/vgabios/int1a.c b/util/vgabios/int1a.c
deleted file mode 100644
index 9fcff8af43..0000000000
--- a/util/vgabios/int1a.c
+++ /dev/null
@@ -1,171 +0,0 @@
-#include <stdio.h>
-#include <stdtypes.h>
-#include "testbios.h"
-#include "pci-userspace.h"
-
-#define DEBUG_INT1A
-
-#define SUCCESSFUL 0x00
-#define DEVICE_NOT_FOUND 0x86
-#define BAD_REGISTER_NUMBER 0x87
-
-extern int verbose;
-
-int int1A_handler(void)
-{
- PCITAG tag = NULL;
- pciVideoPtr pvp = NULL;
-
- if (verbose) {
- printf("\nint1a encountered.\n");
- //x86emu_dump_xregs();
- }
-
- switch (X86_AX) {
- case 0xb101:
- X86_EAX = 0x00; /* no config space/special cycle support */
- X86_AL = 0x01; /* config mechanism 1 */
- X86_EDX = 0x20494350; /* " ICP" */
- X86_EBX = 0x0210; /* Version 2.10 */
- X86_ECX &= 0xFF00;
- X86_ECX |= (pciNumBuses & 0xFF); /* Max bus number in system */
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
-#ifdef DEBUG_INT1A
- if (verbose)
- printf("PCI bios present.\n");
-#endif
- return 1;
- case 0xb102:
- if (X86_DX == pvp->vendor_id && X86_CX == pvp->device_id && X86_ESI == 0) {
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- X86_EBX = pciSlotBX(tag); // XXX used to be pvp, but both are NULL
- }
-#ifdef SHOW_ALL_DEVICES
- else if ((pvp = xf86FindPciDeviceVendor(X86_EDX, X86_ECX, X86_ESI, pvp))) {
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- X86_EBX = pciSlotBX(pvp);
- }
-#endif
- else {
- X86_EAX = X86_AL | (DEVICE_NOT_FOUND << 8);
- X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
- }
-#ifdef DEBUG_INT1A
- printf("eax=0x%x ebx=0x%x eflags=0x%x\n", X86_EAX, X86_EBX, X86_EFLAGS);
-#endif
- return 1;
- case 0xb103:
-#if 0
- if (X86_CL == pvp->interface &&
- X86_CH == pvp->subclass &&
- ((X86_ECX & 0xFFFF0000) >> 16) == pvp->class) {
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EBX = pciSlotBX(pvp);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- }
-#else
- /* FIXME: dirty hack */
- if (0);
-#endif
-#ifdef SHOW_ALL_DEVICES
- else if ((pvp = FindPciClass(X86_CL, X86_CH,
- (X86_ECX & 0xffff0000) >> 16,
- X86_ESI, pvp))) {
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- X86_EBX = pciSlotBX(pvp);
- }
-#endif
- else {
- X86_EAX = X86_AL | (DEVICE_NOT_FOUND << 8);
- X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
- }
-#ifdef DEBUG_INT1A
- printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
-#endif
- return 1;
- case 0xb108:
- if ((tag = findPci(X86_EBX))) {
- X86_CL = pciReadByte(tag, X86_EDI);
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- } else {
- X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
- X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
- }
-#ifdef DEBUG_INT1A
- printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX, X86_EFLAGS);
-#endif
- return 1;
- case 0xb109:
- if ((tag = findPci(X86_EBX))) {
- X86_CX = pciReadWord(tag, X86_EDI);
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- } else {
- X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
- X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
- }
-#ifdef DEBUG_INT1A
- printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX, X86_EFLAGS);
-#endif
- return 1;
- case 0xb10a:
- if ((tag = findPci(X86_EBX))) {
- X86_ECX = pciReadLong(tag, X86_EDI);
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- } else {
- X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
- X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
- }
-#ifdef DEBUG_INT1A
- printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX, X86_EFLAGS);
-#endif
- return 1;
- case 0xb10b:
- if ((tag = findPci(X86_EBX))) {
- pciWriteByte(tag, X86_EDI, X86_CL);
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- } else {
- X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
- X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
- }
-#ifdef DEBUG_INT1A
- printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
-#endif
- return 1;
- case 0xb10c:
- if ((tag = findPci(X86_EBX))) {
- pciWriteWord(tag, X86_EDI, X86_CX);
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- } else {
- X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
- X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
- }
-#ifdef DEBUG_INT1A
- printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
-#endif
- return 1;
- case 0xb10d:
- if ((tag = findPci(X86_EBX))) {
- pciWriteLong(tag, X86_EDI, X86_ECX);
- X86_EAX = X86_AL | (SUCCESSFUL << 8);
- X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
- } else {
- X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
- X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
- }
-#ifdef DEBUG_INT1A
- printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
-#endif
- return 1;
- default:
- printf("int1a: subfunction not implemented.\n");
- return 0;
- }
-}
diff --git a/util/vgabios/inte6.c b/util/vgabios/inte6.c
deleted file mode 100644
index 19b6110067..0000000000
--- a/util/vgabios/inte6.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <stdio.h>
-#include "testbios.h"
-
-int intE6_handler(void)
-{
-#if 0
- pciVideoPtr pvp;
-
- if ((pvp = xf86GetPciInfoForEntity(pInt->entityIndex)))
- X86_AX = (pvp->bus << 8) | (pvp->device << 3) | (pvp->func & 0x7);
- pushw(X86_CS);
- pushw(X86_IP);
- X86_CS = pInt->BIOSseg;
- X86_EIP = 0x0003;
- X86_ES = 0; /* standard pc es */
-#endif
- printf("intE6 not supported right now.\n");
- x86emu_dump_xregs();
- return 1;
-}
diff --git a/util/vgabios/pci-userspace.c b/util/vgabios/pci-userspace.c
index 796933e5b0..0390f7a494 100644
--- a/util/vgabios/pci-userspace.c
+++ b/util/vgabios/pci-userspace.c
@@ -1,31 +1,30 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Google Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
#include <stdio.h>
+#include <pci/pci.h>
#include "pci-userspace.h"
-#ifdef PCI_LIB_VERSION
-#define LIBPCI_CHECK_VERSION(major,minor,micro) \
- ((((major) << 16) | ((minor) << 8) | (micro)) <= PCI_LIB_VERSION)
-#else
-#define LIBPCI_CHECK_VERSION(major,minor,micro) \
- ( (LIBPCI_MAJOR_VERSION > (major)) || \
- (LIBPCI_MAJOR_VERSION == (major) && LIBPCI_MINOR_VERSION > (minor)) || \
- (LIBPCI_MAJOR_VERSION == (major) && LIBPCI_MINOR_VERSION == (minor)) && \
- LIBPCI_MICRO_VERSION >= (micro) )
-#endif
-
-#define PCITAG struct pci_filter *
-
#define DEBUG_PCI 1
-struct pci_access *pacc;
-struct pci_dev *dev;
-
-struct pci_filter ltag;
-
-
-int pciNumBuses = 0;
+static struct pci_access *pacc;
-int pciInit(void)
+int pci_initialize(void)
{
+ struct pci_dev *dev;
+
pacc = pci_alloc();
pci_init(pacc);
@@ -36,133 +35,80 @@ int pciInit(void)
return 0;
}
-int pciExit(void)
+int pci_exit(void)
{
pci_cleanup(pacc);
return 0;
}
-PCITAG findPci(unsigned short bx)
-{
- PCITAG tag = &ltag;
-
- int bus = (bx >> 8) & 0xFF;
- int slot = (bx >> 3) & 0x1F;
- int func = bx & 0x7;
-
- tag->bus = bus;
- tag->slot = slot;
- tag->func = func;
-
-#if LIBPCI_CHECK_VERSION(2,1,99)
- if (pci_get_dev(pacc, 0, bus, slot, func))
-#else
- if (pci_get_dev(pacc, bus, slot, func))
-#endif
- return tag;
-
- return NULL;
-}
-
-u32 pciSlotBX(PCITAG tag)
-{
- return (tag->bus << 8) | (tag->slot << 3) | (tag->func);
-}
-
-u8 pciReadByte(PCITAG tag, u32 idx)
+u8 pci_read_config8(struct device *dev, unsigned int where)
{
struct pci_dev *d;
-#if LIBPCI_CHECK_VERSION(2,1,99)
- if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
-#else
- if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
-#endif
- return pci_read_byte(d, idx);
+ if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func)))
+ return pci_read_byte(d, where);
#ifdef DEBUG_PCI
printf("PCI: device not found while read byte (%x:%x.%x)\n",
- tag->bus, tag->slot, tag->func);
+ dev->busno, dev->slot, dev->func);
#endif
return 0;
}
-u16 pciReadWord(PCITAG tag, u32 idx)
+u16 pci_read_config16(struct device *dev, unsigned int where)
{
struct pci_dev *d;
-#if LIBPCI_CHECK_VERSION(2,1,99)
- if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
-#else
- if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
-#endif
- return pci_read_word(d, idx);
+ if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func)))
+ return pci_read_word(d, where);
#ifdef DEBUG_PCI
printf("PCI: device not found while read word (%x:%x.%x)\n",
- tag->bus, tag->slot, tag->func);
+ dev->busno, dev->slot, dev->func);
#endif
return 0;
}
-u32 pciReadLong(PCITAG tag, u32 idx)
+u32 pci_read_config32(struct device *dev, unsigned int where)
{
struct pci_dev *d;
-#if LIBPCI_CHECK_VERSION(2,1,99)
- if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
-#else
- if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
-#endif
- return pci_read_long(d, idx);
+ if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func)))
+ return pci_read_long(d, where);
#ifdef DEBUG_PCI
- printf("PCI: device not found while read long (%x:%x.%x)\n",
- tag->bus, tag->slot, tag->func);
+ printf("PCI: device not found while read dword (%x:%x.%x)\n",
+ dev->busno, dev->slot, dev->func);
#endif
return 0;
}
-
-void pciWriteLong(PCITAG tag, u32 idx, u32 data)
+void pci_write_config8(struct device *dev, unsigned int where, u8 val)
{
struct pci_dev *d;
-#if LIBPCI_CHECK_VERSION(2,1,99)
- if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
-#else
- if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
-#endif
- pci_write_long(d, idx, data);
+ if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func)))
+ pci_write_byte(d, where, val);
#ifdef DEBUG_PCI
else
- printf("PCI: device not found while write long (%x:%x.%x)\n",
- tag->bus, tag->slot, tag->func);
+ printf("PCI: device not found while write byte (%x:%x.%x)\n",
+ dev->busno, dev->slot, dev->func);
#endif
}
-void pciWriteWord(PCITAG tag, u32 idx, u16 data)
+void pci_write_config16(struct device *dev, unsigned int where, u16 val)
{
struct pci_dev *d;
-#if LIBPCI_CHECK_VERSION(2,1,99)
- if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
-#else
- if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
-#endif
- pci_write_word(d, idx, data);
+ if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func)))
+ pci_write_word(d, where, val);
#ifdef DEBUG_PCI
else
printf("PCI: device not found while write word (%x:%x.%x)\n",
- tag->bus, tag->slot, tag->func);
+ dev->busno, dev->slot, dev->func);
#endif
-
}
-void pciWriteByte(PCITAG tag, u32 idx, u8 data)
+void pci_write_config32(struct device *dev, unsigned int where, u32 val)
{
struct pci_dev *d;
-#if LIBPCI_CHECK_VERSION(2,1,99)
- if ((d = pci_get_dev(pacc, 0, tag->bus, tag->slot, tag->func)))
-#else
- if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func)))
-#endif
- pci_write_long(d, idx, data);
+ if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func)))
+ pci_write_long(d, where, val);
#ifdef DEBUG_PCI
else
- printf("PCI: device not found while write long (%x:%x.%x)\n",
- tag->bus, tag->slot, tag->func);
+ printf("PCI: device not found while write dword (%x:%x.%x)\n",
+ dev->busno, dev->slot, dev->func);
#endif
}
diff --git a/util/vgabios/pci-userspace.h b/util/vgabios/pci-userspace.h
index 103a9ef3bc..2dbdbbe6a3 100644
--- a/util/vgabios/pci-userspace.h
+++ b/util/vgabios/pci-userspace.h
@@ -1,62 +1,35 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Google Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
#ifndef __PCI_USERSPACE_H__
#define __PCI_USERSPACE_H__
-#include <pci/pci.h>
-
-typedef unsigned long pciaddr_t;
-typedef u8 byte;
-typedef u16 word;
-
-#if 0
-struct pci_dev {
- struct pci_dev *next; /* Next device in the chain */
- word bus; /* Higher byte can select host bridges */
- byte dev, func; /* Device and function */
-
- /* These fields are set by pci_fill_info() */
- int known_fields; /* Set of info fields already known */
- word vendor_id, device_id; /* Identity of the device */
- int irq; /* IRQ number */
- pciaddr_t base_addr[6]; /* Base addresses */
- pciaddr_t size[6]; /* Region sizes */
- pciaddr_t rom_base_addr; /* Expansion ROM base address */
- pciaddr_t rom_size; /* Expansion ROM size */
-
- /* Fields used internally: */
- void *access;
- void *methods;
- byte *cache; /* Cached information */
- int cache_len;
- int hdrtype; /* Direct methods: header type */
- void *aux; /* Auxillary data */
-};
-
-
-struct pci_filter {
- int bus, slot, func; /* -1 = ANY */
- int vendor, device;
+struct device {
+ int busno;
+ int slot;
+ int func;
};
-#endif
-
-#define PCITAG struct pci_filter *
-#define pciVideoPtr struct pci_dev *
-
-extern int pciNumBuses;
-
-int pciInit(void);
-int pciExit(void);
-
-
-PCITAG findPci(unsigned short bx);
-//u32 pciSlotBX(pciVideoPtr pvp);
-u32 pciSlotBX(PCITAG tag);
-void pciWriteLong(PCITAG tag, u32 idx, u32 data);
-void pciWriteWord(PCITAG tag, u32 idx, u16 data);
-void pciWriteByte(PCITAG tag, u32 idx, u8 data);
+int pci_initialize(void);
+int pci_exit(void);
-u32 pciReadLong(PCITAG tag, u32 idx);
-u16 pciReadWord(PCITAG tag, u32 idx);
-u8 pciReadByte(PCITAG tag, u32 idx);
+u8 pci_read_config8(struct device *dev, unsigned int where);
+u16 pci_read_config16(struct device *dev, unsigned int where);
+u32 pci_read_config32(struct device *dev, unsigned int where);
+void pci_write_config8(struct device *dev, unsigned int where, u8 val);
+void pci_write_config16(struct device *dev, unsigned int where, u16 val);
+void pci_write_config32(struct device *dev, unsigned int where, u32 val);
#endif
diff --git a/util/vgabios/testbios.c b/util/vgabios/testbios.c
index 8c9783f07e..f760b08d88 100644
--- a/util/vgabios/testbios.c
+++ b/util/vgabios/testbios.c
@@ -1,3 +1,18 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Google Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -7,75 +22,28 @@
#include <getopt.h>
#include <string.h>
#include <stdarg.h>
-
#include <stdtypes.h>
#define die(x) { perror(x); exit(1); }
#define warn(x) { perror(x); }
#include <x86emu/x86emu.h>
#include <console/console.h>
-#include "helper_exec.h"
+#include <arch/byteorder.h>
+#include "device.h"
+
#include "testbios.h"
#include "pci-userspace.h"
int X86EMU_set_debug(int debug);
-unsigned short get_device(char *arg_val);
+
+biosemu_device_t bios_device;
extern int teststart, testend;
-_ptr p;
-ptr current = 0;
-unsigned char biosmem[1024 * 1024];
+#define BIOSMEM_SIZE (1024 * 1024)
+unsigned char biosmem[BIOSMEM_SIZE];
int verbose = 0;
-
-/* Interrupt multiplexer */
-
-static void do_int(int num)
-{
- int ret = 0;
-
- printf("int%x vector at %x\n", num, getIntVect(num));
-
- /* This is a pInt leftover */
- current->num = num;
-
- switch (num) {
-#ifndef _PC
- case 0x10:
- case 0x42:
- case 0x6D:
-
- if (getIntVect(num) == 0xFF065) {
- ret = int42_handler();
- }
- break;
-#endif
- case 0x15:
- ret = int15_handler();
- break;
- case 0x16:
- ret = int16_handler();
- break;
- case 0x1A:
- ret = int1A_handler();
- break;
- case 0xe6:
- ret = intE6_handler();
- break;
- default:
- break;
- }
-
- if (!ret)
- ret = run_bios_int(num);
-
- if (!ret) {
- printf("\nint%x: not implemented\n", num);
- //x86emu_dump_xregs();
- }
-}
-
static unsigned char *mapitin(char *file, off_t where, size_t size)
{
void *z;
@@ -90,14 +58,57 @@ static unsigned char *mapitin(char *file, off_t where, size_t size)
close(fd);
return z;
+}
+
+static unsigned short get_device(char *arg_val)
+{
+ unsigned short devfn=0;
+ long bus=0,dev=0,fn=0,need_pack=0;
+ char *tok;
+
+ tok = strsep(&arg_val,":");
+ if (arg_val != NULL) {
+ bus = strtol(tok,0,16);
+ need_pack = 1;
+ }
+ else {
+ arg_val = tok;
+ }
+
+ tok = strsep(&arg_val,".");
+ if (arg_val != NULL) {
+ dev = strtol(tok,0,16);
+ fn = strtol(arg_val,0,16);
+ need_pack = 1;
+ }
+ else {
+ if (need_pack ==1 && (strlen(tok))) {
+ dev = strtol(tok,0,16);
+ }
+ }
+ if ( need_pack == 1) {
+ devfn = bus<<8 | (dev<<3) | fn;
+ }
+ else {
+ devfn = strtol(tok, 0, 0);
+ }
+
+ return devfn;
}
-X86EMU_pioFuncs myfuncs = {
- x_inb, x_inw, x_inl,
- x_outb, x_outw, x_outl
-};
+int printk(int msg_level, const char *fmt, ...)
+{
+ va_list args;
+ int i;
+ printf ("<%d> ", msg_level);
+ va_start(args, fmt);
+ i = vprintf(fmt, args);
+ va_end(args);
+
+ return i;
+}
static void usage(char *name)
{
@@ -106,11 +117,24 @@ static void usage(char *name)
name);
}
+/* main entry into YABEL biosemu, arguments are:
+ * *biosmem = pointer to virtual memory
+ * biosmem_size = size of the virtual memory
+ * *dev = pointer to the device to be initialised
+ * rom_addr = address of the OptionROM to be executed, if this is = 0, YABEL
+ * will look for an ExpansionROM BAR and use the code from there.
+ */
+u32
+biosemu(u8 *biosmem, u32 biosmem_size, struct device * dev, unsigned long
+ rom_addr);
+
+
int main(int argc, char **argv)
{
+ int ret;
char *absegname = 0;
void *abseg = 0;
- int i, c, trace = 0;
+ int c, trace = 0;
unsigned char *cp;
char *filename;
ssize_t size = 0;
@@ -118,12 +142,14 @@ int main(int argc, char **argv)
int have_size = 0, have_base = 0, have_ip = 0, have_cs = 0;
int have_devfn = 0;
int parse_rom = 0;
- char *fsegname = 0;
- unsigned char *fsegptr;
+ //char *fsegname = 0;
+ //unsigned char *fsegptr;
unsigned short initialip = 0, initialcs = 0, devfn = 0;
- X86EMU_intrFuncs intFuncs[256];
+ //X86EMU_intrFuncs intFuncs[256];
int debugflag = 0;
+ struct device *dev;
+ //const char *optstring = "vh?b:i:c:s:tpd:";
const char *optstring = "vh?b:i:c:s:tpd:";
while (1) {
int option_index = 0;
@@ -132,7 +158,7 @@ int main(int argc, char **argv)
{"help", 0, 0, 'h'},
{"trace", 0, 0, 't'},
{"base", 1, 0, 'b'},
- {"fseg", 1, 0, 'f'},
+ //{"fseg", 1, 0, 'f'},
{"instructionpointer", 1, 0, 'i'},
{"codesegment", 1, 0, 'c'},
{"absegment", 1, 0, 'a'},
@@ -156,10 +182,10 @@ int main(int argc, char **argv)
case 't':
trace = 1;
break;
- case 'b':
- base = strtol(optarg, 0, 0);
- have_base = 1;
- break;
+ //case 'b':
+ // base = strtol(optarg, 0, 0);
+ // have_base = 1;
+ // break;
case 'i':
initialip = strtol(optarg, 0, 0);
have_ip = 1;
@@ -175,9 +201,9 @@ int main(int argc, char **argv)
case 'p':
parse_rom = 1;
break;
- case 'f':
- fsegname = optarg;
- break;
+ // case 'f':
+ // fsegname = optarg;
+ // break;
case 'a':
absegname = optarg;
break;
@@ -220,10 +246,10 @@ int main(int argc, char **argv)
printf("No base specified. defaulting to 0xc0000\n");
base = 0xc0000;
}
- if (!have_cs) {
- printf("No initial code segment specified. defaulting to 0xc000\n");
- initialcs = 0xc000;
- }
+ //if (!have_cs) {
+ // printf("No initial code segment specified. defaulting to 0xc000\n");
+ // initialcs = 0xc000;
+ //}
if (!have_ip) {
printf
("No initial instruction pointer specified. defaulting to 0x0003\n");
@@ -234,7 +260,7 @@ int main(int argc, char **argv)
printf("Parsing rom images not implemented.\n");
//printf("Point 1 int%x vector at %x\n", 0x42, getIntVect(0x42));
-
+#if 0
if (initialip == 0x0003) {
if ((devfn == 0) || (have_devfn == 0)) {
printf("WARNING! It appears you are trying to run an option ROM.\n");
@@ -250,6 +276,7 @@ int main(int argc, char **argv)
}
}
}
+#endif
if (absegname) {
abseg = mapitin(absegname, (off_t) 0xa0000, 0x20000);
@@ -257,10 +284,6 @@ int main(int argc, char **argv)
die(absegname);
}
- current = &p;
- X86EMU_setMemBase(biosmem, sizeof(biosmem));
- M.abseg = (unsigned long)abseg;
- X86EMU_setupPioFuncs(&myfuncs);
ioperm(0, 0x400, 1);
if (iopl(3) < 0) {
@@ -275,17 +298,20 @@ int main(int argc, char **argv)
* basically this means initializing PCI and
* intXX handlers.
*/
- pciInit();
+ pci_initialize();
+#if 0
for (i = 0; i < 256; i++)
intFuncs[i] = do_int;
X86EMU_setupIntrFuncs(intFuncs);
+#endif
cp = mapitin(filename, (off_t) 0, size);
if (devfn) {
printf("Loading ax with BusDevFn = %x\n",devfn);
}
+#if 0
current->ax = devfn ? devfn : 0xff;
current->dx = 0x80;
// current->ip = 0;
@@ -322,68 +348,33 @@ int main(int argc, char **argv)
pushw(X86_SP + 2);
X86_ES = 0x0000;
+#endif
if (trace) {
printf("Switching to single step mode.\n");
//X86EMU_trace_on();
}
if (debugflag) {
+ printf("Enable Debug = %x.\n",debugflag);
//X86EMU_set_debug(debugflag);
}
+#if 0
X86EMU_exec();
- /* Cleaning up */
- pciExit();
-
- return 0;
-}
+#endif
-unsigned short get_device(char *arg_val)
-{
- unsigned short devfn=0;
- long bus=0,dev=0,fn=0,need_pack=0;
- char *tok;
+ ret = biosemu(biosmem, BIOSMEM_SIZE, dev, base);
- tok = strsep(&arg_val,":");
- if (arg_val != NULL) {
- bus = strtol(tok,0,16);
- need_pack = 1;
- }
- else {
- arg_val = tok;
- }
-
- tok = strsep(&arg_val,".");
- if (arg_val != NULL) {
- dev = strtol(tok,0,16);
- fn = strtol(arg_val,0,16);
- need_pack = 1;
- }
- else {
- if (need_pack ==1 && (strlen(tok))) {
- dev = strtol(tok,0,16);
- }
- }
-
- if ( need_pack == 1) {
- devfn = bus<<8 | (dev<<3) | fn;
- }
- else {
- devfn = strtol(tok, 0, 0);
- }
+#if 0
+ current = &p;
+ X86EMU_setMemBase(biosmem, sizeof(biosmem));
+ M.abseg = (unsigned long)abseg;
+ X86EMU_setupPioFuncs(&myfuncs);
+#endif
+ /* Cleaning up */
+ pci_exit();
- return devfn;
+ return 0;
}
-int printk(int msg_level, const char *fmt, ...)
-{
- va_list args;
- int i;
-
- printf ("<%d> ", msg_level);
- va_start(args, fmt);
- i = vprintf(fmt, args);
- va_end(args);
- return i;
-}
diff --git a/util/vgabios/testbios.h b/util/vgabios/testbios.h
index a5a8b0d6b2..a028bf0fa1 100644
--- a/util/vgabios/testbios.h
+++ b/util/vgabios/testbios.h
@@ -1,19 +1,21 @@
-/* Derived from:
- * XFree86 int10 module
- * execute BIOS int 10h calls in x86 real mode environment
- * Copyright 1999 Egbert Eich
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 1999 Egbert Eich
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*/
#ifndef __TESTBIOS_H__
#define __TESTBIOS_H__
-void x86emu_dump_xregs(void);
-int int15_handler(void);
-int int16_handler(void);
-int int1A_handler(void);
-int int42_handler(void);
-int intE6_handler(void);
-
#include <stdtypes.h>
#include <x86emu/x86emu.h>
@@ -57,42 +59,4 @@ int intE6_handler(void);
#define X86_CH M.x86.R_CH
#define X86_DH M.x86.R_DH
-
-/* int10 info structure */
-typedef struct {
- u16 BIOSseg;
- u16 inb40time;
- struct _mem *mem;
- int num;
- int ax;
- int bx;
- int cx;
- int dx;
- int si;
- int di;
- int es;
- int bp;
- int flags;
- int stackseg;
-} _ptr, *ptr;
-
-typedef struct _mem {
- u8(*rb) (ptr, int);
- u16(*rw) (ptr, int);
- u32(*rl) (ptr, int);
- void (*wb) (ptr, int, u8);
- void (*ww) (ptr, int, u16);
- void (*wl) (ptr, int, u32);
-} mem;
-
-#define MEM_WB(where, what) wrb(where,what)
-#define MEM_WW(where, what) wrw(where, what)
-#define MEM_WL(where, what) wrl(where, what)
-
-#define MEM_RB(where) rdb(where)
-#define MEM_RW(where) rdw(where)
-#define MEM_RL(where) rdl(where)
-
-extern ptr current;
-
#endif