summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/arch/unix/plugins
diff options
context:
space:
mode:
authorYang Zhang <yang.z.zhang@intel.com>2015-08-28 09:58:54 +0800
committerYang Zhang <yang.z.zhang@intel.com>2015-09-01 12:44:00 +0800
commite44e3482bdb4d0ebde2d8b41830ac2cdb07948fb (patch)
tree66b09f592c55df2878107a468a91d21506104d3f /qemu/roms/openbios/arch/unix/plugins
parent9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00 (diff)
Add qemu 2.4.0
Change-Id: Ic99cbad4b61f8b127b7dc74d04576c0bcbaaf4f5 Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
Diffstat (limited to 'qemu/roms/openbios/arch/unix/plugins')
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/Kconfig16
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/Makefile13
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/Rules.plugin15
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/loader.c209
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_pci/Makefile7
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_pci/Makefile.old21
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_pci/plugin_pci.c221
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_qt/Makefile37
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_qt/logo.xpm132
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_qt/pciconfig.h42
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.cpp128
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.h44
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.pro18
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_qt/qt_main.cpp102
-rw-r--r--qemu/roms/openbios/arch/unix/plugins/plugin_qt/qt_rom.fs85
15 files changed, 1090 insertions, 0 deletions
diff --git a/qemu/roms/openbios/arch/unix/plugins/Kconfig b/qemu/roms/openbios/arch/unix/plugins/Kconfig
new file mode 100644
index 000000000..43237bf99
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/Kconfig
@@ -0,0 +1,16 @@
+config PLUGINS
+ depends HOST_UNIX
+ bool "Plugin system (obsolete)"
+ default n
+
+config PLUGIN_PCI
+ depends HOST_UNIX && PLUGINS
+ bool "PCI Emulation"
+ default n
+
+config PLUGIN_QT
+ bool "QT Display Emulation"
+ depends HOST_UNIX && PLUGINS && PLUGIN_PCI
+ default n
+ help
+ This plugin needs qt installed. Disable if you don't have qt.
diff --git a/qemu/roms/openbios/arch/unix/plugins/Makefile b/qemu/roms/openbios/arch/unix/plugins/Makefile
new file mode 100644
index 000000000..c6b9a6519
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/Makefile
@@ -0,0 +1,13 @@
+
+include ../../../config/Makefile.top
+
+SUBDIRS-$(CONFIG_PLUGIN_PCI) += plugin_pci
+SUBDIRS-$(CONFIG_PLUGIN_QT) += plugin_qt
+
+PROGRAMS = # loader
+loader-OBJS = loader.o
+loader-LDFLAGS = -dynamic $(LIBDL_LDFLAGS)
+
+INCLUDES = -DBOOTSTRAP
+
+include $(rules)/Rules.make
diff --git a/qemu/roms/openbios/arch/unix/plugins/Rules.plugin b/qemu/roms/openbios/arch/unix/plugins/Rules.plugin
new file mode 100644
index 000000000..9e9b6255d
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/Rules.plugin
@@ -0,0 +1,15 @@
+# -*- makefile -*-
+
+INCLUDES = -I$(top_srcdir)/include -DBOOTSTRAP
+CFLAGS = -fPIC
+
+%.so: %.o
+ $(CC) -shared $(CFLAGS) $(filter %.o,$^) -o $@
+
+THISDIR := $(notdir $(shell pwd))
+
+all-local: $(addprefix $(ODIR)/../,$(PLUGINS))
+
+$(ODIR)/../%.so: $(ODIR)/%.so
+ install -d ../$(ODIR)
+ ln -f "../$(THISDIR)"/$< $@
diff --git a/qemu/roms/openbios/arch/unix/plugins/loader.c b/qemu/roms/openbios/arch/unix/plugins/loader.c
new file mode 100644
index 000000000..d3781de79
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/loader.c
@@ -0,0 +1,209 @@
+/* tag: openbios plugin loader
+ *
+ * Copyright (C) 2003 Stefan Reinauer
+ *
+ * See the file "COPYING" for further information about
+ * the copyright and warranty status of this work.
+ */
+
+/* This is a simple plugin loader. OpenBIOS duplicates some
+ * of this code in kernel/arch/unix/plugins.c. This code is
+ * here for reference and simple testing.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <unistd.h> // sleep
+
+#include "unix/plugins.h"
+
+#define PLUGINDIR "/usr/share/OpenBIOS/plugins"
+#define PATHSIZE 256
+
+#define DEBUG_PLUGINS
+
+typedef struct iorange iorange_t;
+struct iorange {
+ const char *name;
+ unsigned int start;
+ unsigned int end;
+ io_ops_t *ops;
+ iorange_t *next;
+};
+
+iorange_t *ioranges = NULL;
+
+typedef struct plugin plugin_t;
+struct plugin {
+ const char *name;
+ plugin_t *next;
+};
+
+plugin_t *plugins = NULL;
+
+int register_iorange(const char *name, io_ops_t * ops, unsigned int rstart,
+ unsigned int rend)
+{
+ iorange_t *newrange;
+
+ /* intersection check */
+ newrange = ioranges;
+ while (newrange) {
+ int fail = 0;
+ /* new section swallows old section */
+ if (newrange->start >= rstart && newrange->end <= rend)
+ fail = -1;
+ /* new section start or end point are within range */
+ if (newrange->start <= rstart && newrange->end >= rstart)
+ fail = -1;
+ if (newrange->start <= rend && newrange->end >= rend)
+ fail = -1;
+ if (fail) {
+ printf("Error: overlapping IO regions: %s and %s\n",
+ newrange->name, name);
+ return -1;
+ }
+ newrange = newrange->next;
+ }
+
+ newrange = malloc(sizeof(iorange_t));
+
+ newrange->name = name;
+ newrange->ops = ops;
+ newrange->start = rstart;
+ newrange->end = rend;
+ newrange->next = ioranges;
+
+ ioranges = newrange;
+
+ return 0;
+}
+
+int is_loaded(const char *plugin_name)
+{
+ plugin_t *p = plugins;
+ while (p) {
+ if (!strcmp(plugin_name, p->name))
+ return -1;
+ p = p->next;
+ }
+ return 0;
+}
+
+int load_plugin(const char *plugin_name)
+{
+ void *handle;
+ char *error;
+ char path[PATHSIZE];
+
+ int (*init_plugin) (void);
+ char **deps;
+ char **plugin_info;
+ plugin_t *p;
+
+ if (is_loaded(plugin_name)) {
+ printf("Plugin %s already loaded.\n", plugin_name);
+ return 0;
+ }
+
+ strncpy(path, PLUGINDIR, PATHSIZE);
+ strncat(path, "/plugin_", PATHSIZE);
+ strncat(path, plugin_name, PATHSIZE);
+ strncat(path, ".so", PATHSIZE);
+
+#if DEBUG
+ printf("Opening plugin %s\n", path);
+#endif
+
+ handle = dlopen(path, RTLD_LAZY | RTLD_GLOBAL);
+ if (!handle) {
+ error = dlerror();
+ printf("Error: Could not open plugin \"%s\": %s\n",
+ plugin_name, error);
+ exit(1);
+ }
+#ifdef DEBUG_PLUGINS
+ plugin_info = dlsym(handle, "plugin_author");
+ if ((error = dlerror()) == NULL)
+ printf("Plugin %s author: %s\n", plugin_name, *plugin_info);
+ plugin_info = dlsym(handle, "plugin_license");
+ if ((error = dlerror()) == NULL)
+ printf("Plugin %s license: %s\n", plugin_name, *plugin_info);
+ plugin_info = dlsym(handle, "plugin_description");
+ if ((error = dlerror()) == NULL)
+ printf("Plugin %s descr.: %s\n", plugin_name, *plugin_info);
+#endif
+ p = malloc(sizeof(plugin_t));
+ p->next = plugins;
+ p->name = plugin_name;
+ plugins = p;
+
+ deps = dlsym(handle, "plugin_deps");
+ if ((error = dlerror()) != NULL)
+ deps = NULL;
+
+
+ strncpy(path, "plugin_", PATHSIZE);
+ strncat(path, plugin_name, PATHSIZE);
+ strncat(path, "_init", PATHSIZE);
+
+ init_plugin = dlsym(handle, path);
+ if ((error = dlerror()) != NULL) {
+ printf("error: %s\n", error);
+ exit(1);
+ }
+
+ if (deps) {
+ int i = 0;
+ char *walk = deps[0];
+#ifdef DEBUG_PLUGINS
+ printf("\nPlugin %s dependencies:", plugin_name);
+#endif
+ while (walk) {
+ printf(" %s", walk);
+ if (!is_loaded(walk)) {
+#ifdef DEBUG_PLUGINS
+ printf("(loading)\n");
+#endif
+ load_plugin(walk);
+ }
+#ifdef DEBUG_PLUGINS
+ else {
+ printf("(loaded)");
+ }
+#endif
+ walk = deps[++i];
+ }
+ }
+
+ printf("\n");
+#if DEBUG
+ printf("Initializing module:\n");
+#endif
+
+ return init_plugin();
+
+ // We don't dlclose the handle here since
+ // we want to keep our symbols for later use.
+}
+
+int main(void)
+{
+ iorange_t *r;
+
+ // load_plugin("kbd");
+ // load_plugin("pci");
+ load_plugin("qt");
+
+ printf("\nRegistered IO Ranges:\n");
+ r = ioranges;
+ while (r) {
+ printf(" %s: %x-%x\n", r->name, r->start, r->end);
+ r = r->next;
+ }
+
+ sleep(10);
+ return 0;
+}
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_pci/Makefile b/qemu/roms/openbios/arch/unix/plugins/plugin_pci/Makefile
new file mode 100644
index 000000000..e46a6cdae
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_pci/Makefile
@@ -0,0 +1,7 @@
+
+include ../../../../config/Makefile.top
+
+PLUGINS = plugin_pci.so
+
+include ../Rules.plugin
+include $(rules)/Rules.make
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_pci/Makefile.old b/qemu/roms/openbios/arch/unix/plugins/plugin_pci/Makefile.old
new file mode 100644
index 000000000..10d0555d9
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_pci/Makefile.old
@@ -0,0 +1,21 @@
+# tag: Makefile for OpenBIOS PCI plugin
+#
+# Copyright (C) 2003 Stefan Reinauer
+#
+# See the file "COPYING" for further information about
+# the copyright and warranty status of this work.
+#
+
+PLUGIN_SOURCES = plugin_pci.c
+PLUGIN_NAME = plugin_pci.so
+
+INCLUDES := -I$(TOPDIR)/include -I$(BUILDDIR) -I..
+VPATH := $(VPATH):.
+
+all: $(PLUGIN_NAME)
+
+$(PLUGIN_NAME): $(PLUGIN_SOURCES)
+ $(CC) -shared -Wall -Os -fPIC $(INCLUDES) $< -o $(BUILDDIR)/$@
+
+clean:
+ rm -f plugin_*.so
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_pci/plugin_pci.c b/qemu/roms/openbios/arch/unix/plugins/plugin_pci/plugin_pci.c
new file mode 100644
index 000000000..586ea2aaf
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_pci/plugin_pci.c
@@ -0,0 +1,221 @@
+/* tag: openbios pci plugin
+ *
+ * Copyright (C) 2003 Stefan Reinauer
+ *
+ * See the file "COPYING" for further information about
+ * the copyright and warranty status of this work.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "unix/plugins.h"
+#include "unix/plugin_pci.h"
+
+#define DEBUG
+
+u32 pci_conf_addr = 0;
+pci_dev_t *pci_devices = NULL;
+
+static pci_dev_t *find_device(u32 conf_addr)
+{
+ pci_dev_t *devs = pci_devices;
+ unsigned bus = (conf_addr >> 16) & 0xff;
+ unsigned dev = (conf_addr >> 11) & 0x1f;
+ unsigned fn = (conf_addr >> 8) & 0x7;
+
+ // printf("Looking for device %x\n",conf_addr);
+
+ while (devs) {
+ if (devs->bus == bus && devs->dev == dev && devs->fn == fn)
+ return devs;
+ devs = devs->next;
+ }
+ return NULL;
+}
+
+/*
+ * IO functions. These manage all the magic of providing a PCI
+ * compatible interface to OpenBIOS' unix version of the kernel.
+ */
+
+static u8 pci_inb(u32 reg)
+{
+ u32 basereg = (reg & 0xfffc);
+ u32 basepos = (reg & 0x03);
+ pci_dev_t *dev;
+
+ if (basereg == 0xcf8) {
+ return (pci_conf_addr >> (basepos << 3));
+ }
+
+ /* still here? so we're 0xCFC */
+ dev = find_device(pci_conf_addr);
+ if (!dev || !dev->config)
+ return 0xff;
+
+ return dev->config[(pci_conf_addr + basepos) & 0xff];
+}
+
+static u16 pci_inw(u32 reg)
+{
+ u32 basereg = (reg & 0xfffc);
+ u32 basepos = (reg & 0x02);
+ pci_dev_t *dev;
+
+ if (basereg == 0xcf8) {
+ return (pci_conf_addr >> (basepos << 3));
+ }
+
+ /* still here? so we're 0xCFC */
+ dev = find_device(pci_conf_addr);
+ if (!dev || !dev->config)
+ return 0xffff;
+
+ return *(u16 *) (dev->config + ((pci_conf_addr + basepos) & 0xff));
+}
+
+static u32 pci_inl(u32 reg)
+{
+ u32 basereg = (reg & 0xfffc);
+ pci_dev_t *dev;
+
+ if (basereg == 0xcf8) {
+ return pci_conf_addr;
+ }
+
+ /* still here? so we're 0xCFC */
+ dev = find_device(pci_conf_addr);
+ if (!dev || !dev->config)
+ return 0xffffffff;
+
+ return *(u32 *) (dev->config + (pci_conf_addr & 0xff));
+}
+
+static void pci_outb(u32 reg, u8 val)
+{
+ u32 basereg = (reg & 0xfffc);
+ u32 basepos = (reg & 0x03);
+ pci_dev_t *dev;
+
+ if (basereg == 0xcf8) {
+ pci_conf_addr &= (~(0xff << (basepos << 3)));
+ pci_conf_addr |= (val << (basepos << 3));
+ return;
+ }
+
+ /* still here? so we're 0xCFC */
+ dev = find_device(pci_conf_addr);
+ if (!dev || !dev->config)
+ return;
+
+ dev->config[pci_conf_addr & 0xff] = val;
+}
+
+static void pci_outw(u32 reg, u16 val)
+{
+ u32 basereg = (reg & 0xfffc);
+ u32 basepos = (reg & 0x02);
+ pci_dev_t *dev;
+
+ if (basereg == 0xcf8) {
+ pci_conf_addr &= (~(0xffff << (basepos << 3)));
+ pci_conf_addr |= (val << (basepos << 3));
+ return;
+ }
+
+ /* still here? so we're 0xCFC */
+ dev = find_device(pci_conf_addr);
+ if (!dev || !dev->config)
+ return;
+
+ *(u16 *) (dev->config + (pci_conf_addr & 0xff)) = val;
+}
+
+static void pci_outl(u32 reg, u32 val)
+{
+ u32 basereg = (reg & 0xfffc);
+ pci_dev_t *dev;
+
+ if (basereg == 0xcf8) {
+ pci_conf_addr = val;
+ return;
+ }
+
+ /* still here? so we're 0xCFC */
+ dev = find_device(pci_conf_addr);
+ if (!dev || !dev->config)
+ return;
+
+ *(u32 *) (dev->config + (pci_conf_addr & 0xff)) = val;
+}
+
+static io_ops_t pci_io_ops = {
+ inb:pci_inb,
+ inw:pci_inw,
+ inl:pci_inl,
+ outb:pci_outb,
+ outw:pci_outw,
+ outl:pci_outl
+};
+
+/*
+ * Functions visible to modules depending on this module.
+ */
+
+int pci_register_device(unsigned bus, unsigned dev, unsigned fn,
+ u8 * config)
+{
+ pci_dev_t *newdev;
+ u32 caddr = (1 << 31) | (bus << 16) | (dev << 11) | (fn << 8);
+
+ if (find_device(caddr)) {
+ printf("Error: pci device %02x:%02x.%01x already exists\n",
+ bus, dev, fn);
+ return -1;
+ }
+
+ newdev = malloc(sizeof(pci_dev_t));
+
+ if (!newdev) {
+ printf("Out of memory\n");
+ return -1;
+ }
+
+ newdev->bus = bus;
+ newdev->dev = dev;
+ newdev->fn = fn;
+ newdev->config = config;
+ newdev->next = pci_devices;
+
+ pci_devices = newdev;
+
+ return 0;
+}
+
+/*
+ * Initialization is really simple. We just grab the
+ * PCI conf1 io range for our emulation functions.
+ */
+extern int plugin_pci_init( void );
+
+int plugin_pci_init(void)
+{
+#ifdef DEBUG
+ printf("Plugin \"pci\" initializing... ");
+#endif
+ register_iorange("pci", &pci_io_ops, 0xcf8, 0xcff);
+#ifdef DEBUG
+ printf("done.\n");
+#endif
+ return 0;
+}
+
+/* plugin meta information available for the plugin loader */
+PLUGIN_AUTHOR ("Stefan Reinauer <stepan@openbios.org>")
+PLUGIN_DESCRIPTION ("Generic PCI Device Emulation")
+PLUGIN_LICENSE ("GPL v2")
+
+/* This plugin has no dependencies. Otherwise the following
+ * macro would be uncommented:
+ * PLUGIN_DEPENDENCIES ("this", "that")
+ */
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_qt/Makefile b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/Makefile
new file mode 100644
index 000000000..371dc2f0b
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/Makefile
@@ -0,0 +1,37 @@
+
+include ../../../../config/Makefile.top
+
+PLUGINS = plugin_qt.so
+
+QMAKE = qmake
+PLUGINDIR = $(shell cd .. ; pwd )
+TOPDIR = $(shell cd $(top_srcdir) ; pwd)
+ABSOINC = $(shell cd $(ARCHINCLUDES) 2> /dev/null ; pwd )
+
+export PLUGINDIR TOPDIR ABSOINC
+
+qt_rom.fc: qt_rom.fs
+ $(TOKE) -v qt_rom.fs
+
+fcode.h: qt_rom.fc
+ @echo "static const u8 qt_fcode[] = {" > $@
+ @cat $< | hexdump -ve '1/0 "\t" 8/1 "0x%02x, " 1/0 "\n"' \
+ | sed 's/0x ,//g' >> $@
+ @echo "};" >> $@
+
+$(ODIR)/makefile.qmake: plugin_qt.pro Makefile
+ @test -d $(ODIR) || $(INSTALL) -d $(ODIR)
+ @test -d $(ODIR)/qbuild || $(INSTALL) -d $(ODIR)/qbuild
+ @cp plugin_qt.pro $(ODIR)/
+ cd $(ODIR) ; $(QMAKE) -o makefile.qmake
+
+$(ODIR)/plugin_qt.so: fcode.h $(ODIR)/makefile.qmake $(wildcard *.cpp)
+ cd $(ODIR) ; $(MAKE) -f makefile.qmake
+ @ln -f $(ODIR)/qbuild/plugin_qt.so $@
+
+clean-local:
+ @rm -f $(ODIR)/makefile.qmake
+ @rm -rf $(QBUILDDIR) $(ODIR)/*.fc $(ODIR)/fcode.h
+
+include ../Rules.plugin
+include $(rules)/Rules.make
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_qt/logo.xpm b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/logo.xpm
new file mode 100644
index 000000000..9e2ac60b4
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/logo.xpm
@@ -0,0 +1,132 @@
+/* This logo was created by Stephan Lau,
+ * created to xpm by Stefan Reinauer
+ */
+static char *logo[] = {
+/* columns rows colors chars-per-pixel */
+"300 80 44 1",
+" c #010101",
+". c #070709",
+"X c #0B0B0B",
+"o c #0F0F11",
+"O c #121212",
+"+ c #1B1B1B",
+"@ c #1F1F21",
+"# c #232323",
+"$ c #262628",
+"% c #2B2B2C",
+"& c #2E2E30",
+"* c #333333",
+"= c #373739",
+"- c #3B3B3B",
+"; c #434343",
+": c #464648",
+"> c #4B4B4B",
+", c #4E4E50",
+"< c #535353",
+"1 c #5B5B5B",
+"2 c #5E5E60",
+"3 c #646464",
+"4 c #666668",
+"5 c #6B6B6B",
+"6 c #747474",
+"7 c #767678",
+"8 c #7B7B7B",
+"9 c #838383",
+"0 c #8A8A8A",
+"q c #939394",
+"w c #979799",
+"e c #9B9B9B",
+"r c #A3A3A3",
+"t c #ABABAB",
+"y c #B4B4B4",
+"u c #BBBBBB",
+"i c #C3C3C3",
+"p c #CBCBCB",
+"a c #D3D3D3",
+"s c #DBDBDB",
+"d c #E3E3E3",
+"f c #EBEBEB",
+"g c #F3F3F3",
+"h c #FEFEFE",
+/* pixels */
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgfdssaapuuuytteeewq0009998867666555555555555565666778899000qwwerttyyuuppassdfghhhhhhhhhhgfgggghhhgfgfghhhhggffghhhhggffghhhhgfggghhhhgfggghhhhgfgfghhhhfgfgghhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfdsapuytrwq0986555554455555555555555555555555555555555555555555555555555555555555555555555555556790qertyiuuuafhhhfpiishhhhfipidhhhhfiiidhhhhdiiifhhhhsiiifhhhhsiipghhhhaiipghhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgfdaiuttq0976555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555558iuue5579wuuuuiasfduuishhhhduuudhhhhduuudhhhhsuuufhhhhauuughhhhauuughhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfdaittw086555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555558yuur55549uuiw55569uuutyiadsuuudhhhhsuuudhhhhsuuufhhhhauuughhhhauuughhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgfapyrw975555555555555555555555555555555555555555555555555555555555555555555555555555555554555555555555555555554455555555555555555555558uuue54559uuuw55559uuuq55550uiutypafduuufhhhhsuuufhhhhsuuufhhhhauuughhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdautw965555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555679qqerttuuppaasdddffgghghhhhhhhhhghhggfduuupaappuuuuyeq090uuuq55559uyi05555quuuuadghsuuufhhhhauuufhhhhauuighhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfsite0655555555555555555555555555555555555555555555555555555555555555555555555455555555555555555690wrtiiaddghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfuuuahhhhfuuushhhhfuuuaaiittuuuq55550uuu95560tuuudhhhhsuuughhhhauuufhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhgsite955555555555555555555555555455555555555555555555555555555555555555555555555545555555555570wryiadfhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhguuuahhhhfuuuahhhhfuuushhhhduuudfsaiuuuuq5555qiuu99etipuuifhhhhauuughhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgaut0655555555555555555555555555555555555555555555556555555555555555555555555555555555554559qruisfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdsdfhhhhgdddfhhhhfddsfhhhhgdddfhhhhfddsffspyteeq755559qetisfhgfdddghhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgsir065555555555555555555555555555455555555555555555554555555555555555555555555555555555580rupsghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhsuudhhhhhhhhhhhhfuuphhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgspyt085555560tudghhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgaue9555555555555555554<----=---=---==-==<555555---:3:--=--=-*--==--<55555545<;------==->135890phhhhhy009tfq0009009090909wshhhhhhg<;;:;;;:<9fhhhhhhhf$ rhhhhhs3# ;phhhhhhhf0# Owghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdpue0655559wuaghhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgsue855555455555555555555:O. *5455- *. &44555>O 6ghhh+ 5O ehghhh9 . Xighhhhh9 -gfggf3 +sddffd8O rddffffffffgffffgffffffffggffffffffgffffgffdaute09868eusghhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfpr955555555555555555555555% .%=************& +2555o +=************% +3343% X-<3568888787884. ;dggq. O19888888888888, 8fgghsO . 1fggghsO ysdfiO 9ttuu> . 1rtuyuuuuuuuuuuuuiuuuuuuuuuuuuuuuuuuuuuuuuuuuiiuuuut06449rpdhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhduw85555555555555555555555555* .,111<1111111111< #113- #<<111111111111< #123- Xtssaaaaaaaaaaaaa <sdf@ Otaaaaasaaaaaaaae 9sdgg, =sdggh< 2ipa0 7etr# <etttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuighfauw857wudhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhfie7555555555555555555555554555: =1<<<<<<<<<<<<<<& -<<3X X<<><<<<1,,<<<<<& ;7e8 9apiiiiiipiiiiii6 0ia9 8uuuiipipiiiiiii> oyisdt X%% 2iadgy Xrty6 @69& X90e; *3% 49wttuuuuuuuuuuuuuuuuuuuuuuuuuuuyuyyyuuyuuuuuuuuuuihhhhhhgayw86eifhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhar8555555555555555555555555555543. +<,>>>,>><>>>>,,:. O;:<& -:;>>><>,,<><>,:. $eytO -puuyuuuuuuuuuiutX %rytO *ytrtyuuiuuuuuuu9 1ruis%. 108- . 8tisd% <qw9X #tre> *59, -86* O47qetuuuuuuuuuuuuuuuuuuuuuuuuuuuiasddsaiuuuuuuuuuuighhhhhhhhhgatq9tahhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhgiq55555555555555555555555555555555- ;>:>:,<<<,<<<<<<# . %-;: . O:;;;>>,<<>,,<38; 5qr3 eutttuuiiiipiiii1 5wr< qreeryuiipiiipii$ X0wru8 O976& +9wya0 O999O qeq9O >3< +751. &159wtyuuuuuuuuuuuuuuuuuuuuuuuuisfhhhhhhgdpuuuuuiuuihhhhhhhhhhhhhhdierighhhhhhh",
+"hhhhhhhhhhhhhhhhhfi05555555555555555555555555555555552 #>;;:,,<<<11<11<> +--;+ ;;--;><<1116qtpy -009 ,ttrrtuppaaaaaaay -q09 ;ewqrtupaaaaaaap9 10qrtX .3754X . >60tuX 387% 3w09: +3<O. 153% O:159wtyuuuuiuuuuuuuuuuuuuuuuuuaghhhhhhhhhhhdiuuuuuuighhhhhhhhhhhhhhhhfaupghhhhh",
+"hhhhhhhhhhhhhhhhiq55555555555555555555555555555555555+ X;:;;><<112311212+ .---& $;-;;><138eusddd- X000% oerrrtuaadsdddddd- o090$ Xwqqetypadddsddsao .%q9qr3 $856- +160t5 $761 X9097X ;1& &54< *;159wtyuuuuuuuuuuuuuuuuuuuuuushhhhhhhhhhhhhhdpyuuuuihhhhhhhhhhhhhhhhhhhhgsdhhhh",
+"hhhhhhhhhhhhhhsr555555545555555555555555555555555555, %;;-:><123333535> %---O .;--;;<5wifgfgfgt 1w04 2ewerupsffgffggft 1w05 1wqqeyasffgfgggg9 7q0wq 6665 ,360w 666O <999= %32. . <31+. +>>160rtuuuuuuuuuuuuuuuuuuuuuyshhhhhhhhhhhhhhhhfuuuuuighhhhhhhhhhhhhhhhhhhhhhhghh",
+"hhhhhhhhhhhhhi05555555555555555555555555555555555555o .X;;-::<1335555454X X:--$ &:--,6rsfghhghgh# Orq0O <<<<156999090999# +rqqO +qqqetisgghhghhha >rqqe* >867# *358e* >76; #9994 . .44- o2<>++++O>><48qrtuuuuuuuuuuuuiuuuuuuuuphhhhhhhhhhhhhhhhhhsyuiuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhu65555555555555555555555555555555555555- *;-->>1355555554- *;--. O;-<5rpdfhhhhhhh9 7rq< 6eq, 5w0wtisdgghhhhhh< Oqwqw8 X7773 X45608 X666. 3779% ;55X. %<1356651<<369etyuuuuuuuuuuuuuuuuuuuuudhhhhhhhhhhhhhhhhhhgpyuuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhi755555555555555555555555555555555555553. +;--;><2555555553. O:--$ *16qtiafhghhhhhgO *rq9X @,>:><356787888787653rq9X %wqqryadfghhhhhhy 3rqqrO <669O >569q+ <66* =8781 O953 &<24698533359qryuuuuuuuuuuuiuuuuuuuuuphhhhhhhhhhhhhhhhhhhhsyuuihhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhs955555555555555555555555555555555555555% -;;;><1335555555$ -;;* %9wweypdfhhhhhhh4 eeq- 90990rtupaaaaaaaapiutee- 9qqerusfhhhhhhhh# +twqr1 @868= $867q1 @873 o5689O 166; &<36999865690etyyuuuuuuuuuuuuuuuuuuuudhhhhhhhhhhhhhhhhhhhhfiuuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhy55555555555555555555555555555555555555< #;--:,<3355555551 #;;-+ Xqwqetisfhghhhhhp 1eq7 >q999qrtuuipipuippuytrr8 :wqqruadfhhhhhhh9 6ewweX 363% #6689qX 276# >769, $867* +13800q9999qrtyuuuuuuuuuuuuuuuuuuuuuufhhhhhhhhhhhhhhhhhhhhhpuuihhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhh955555555555555555555555555555555555555@ .:-;;:<1335555554+ .;:-* 1wqqrupfghhhhhhh; Oeeq$ ..q0990qrtuuuuuuuuuuuuttr& XqqqetpdfghhhhhhfO *tewe> %8869q< *76< O6687X 4669$ .X159qeeeqqqrryuuuuuuuuuuuuuuuuuuuiuuighhhhhhhhhhhhhhhhhhhhhpyuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhh55555555555555555555555555555555555555: $;-;;,<335555554: $:-2+ +qqqeyidgghhhhhhr 1rq3 1q000rryuipiiipiiiiiuuu7 1wqwtuadghhhhhhh6 qwww0 =20979q9 X566X <679= . -8680- . >69errtrrrtyyuuuuuuuuuuuuuuuuuuuuuuihhhhhhhhhhhhhhhhhhhhhhpyuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhh95555555555555555555555555555555555555O X:--;><2355555553O O:162 3eqerusdghhhhhhf# $tqqO +qqqwrtipaaaaaaaaaaaaapp+ Oeqqetpsgghhhhhhs >ewqr&. ;q0998qe* >86; #7685 O6680e1 *50ettyyyyyuuuuuuuuuuuuuuuuuuuuuuuuuhhhhhhhhhhhhhhhhhhhhhhpuuihhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhht655555555555555555555555555555555555: %;-;:<1335555555& .:500X +eqerypsghhhhhhh6 Oqeq3 1qqwryiasddddddddddddsd7 8wqqtuafghhhhhhh; Oreqw7 -999qw7. +665X 4679@ :789wt6 O50etyyuuuuuuuuuuuuuuuuuuuuuuuuuiuuughhhhhhhhhhhhhhhhhhhhhpyuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhs955555555555555555555555555555555555% --;;>1135555553- ,0eq> =wqerisfghhhhhf9 8rwq- 9qqetpsdffgfgffgfdttgfa *rqqryadghhhhhhhq 4rqwrO *-@ 79qeu+ ,76* . *7681 O8680ruy X49etyuuuuuuuuuuuuuuuuuuuuiuuuuuuuuudhhhhhhhhhhhhhhhhhhhhgiuuuhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhu65555555555555555555555555555555554# .4eew9 X Oqteww= #dgg; 9wqwtisfghhhhhhfX Xewqe3 %63< @70ey5 #961 X6678X 3679ruip& 48wryuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuphhhhhhhhhhhhhhhhhhhhduuuihhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhu7555555555555555554555555555555545,@X . .+>qyrre& X8O O-7utreer9=X ufg5 +ewqruadghhhhhhf; >eqweX . 451> -6qyyO 366# ;769< $769wtpaa3 O36qrtuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuighhhhhhhhhhhhhhhhhhhpyuuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhp95455555555555555555555555555555331:;---;><1111111117tutre8 1q999wtipaaasssaaaiutrrrruyrq09qruiasasasasassssddddaitrwetisfhghhhhhhgfautewr; -654% o56eu< =86: . O8687 6669ruada4 @160ryuuuuuuuuuuuuuuuuuuiuuuuuuuuuuuuahhhhhhhhhhhhhhhhhhsuuuuihhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhde555555555555555555555555555555331,;---;;,<<<<<1<<8tutrtt+ Or099qwtuipppppppiiuytrtyiiiteq0qryupppppppppppppssdspurreriafghhhhhhhhgdaueee8 X665< ;38e9 X765X 1679% >669wyadfd5 *150rtuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuushhghhhhhhhhhhhhhgiyuuuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhiq555555555555555555555555555533<<:;-;;>>,>,>,,,6ttyttt3 5q9990rttuuuuuuyuuyyttyupaapurewertyyuuuuuuuuuuuipasaputttypsgghhhhhhhggsautrt* ,667# .+159e* >86;. $6695 .8680tisfgd3 X:160rtuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuudhhhhhhhhhhhhhhgiuiuuuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhfi055555555555555555555555555332<>>:;:>>>,<>,>6tuuuiiuX *eq00wrryyuuuuyuuuuuyuiiasdsaputrtttuuyuyuuuuyyuupaassaiuyupsfghhhhhhhhhgdaiuy6 O967< 146q3 O865 5679O ,769wuafggfX #:150rtuuuuuuuuuuuuuuuuuuuuuuiuuuuuuuuuuushhhhhhhhhhhhfiuuuuuuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhfiq5555555555555555555554555431<<<,<<<<<<<15tippppa<. 0wqqetyippppppppppippaasdfgfdsapiipipppppppppppppaadddsaapasfghhhhhhhhhggfsapi+ 1678O -5589+ 176% -679, +85O rgg0 X-,36qrtuuuuuuuuuuuuiuuuuuuuuuuuuuuuuiuuuuupfghhhhhhhfauuuuuuuuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhat85555555555555555555555433221111111113tsssssdr >eqqetupaasaaasaasssasddfgggggfdssasassaassasaasssddffffddddfgghhhhhhhhhhhgfdd8 $878> X55601 $761 X5788o 37- -dfd@ &>,39qryuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuypsdffdspuuuuuuuuuuihhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhfiw6555555555555555555555333332322331efffdffs+ qqwetiadfffdfddfffdfffffgghhhgggfffdfdffdfdfdfdfdfffggfggfggghhhhhhhhhhhhggggp 6666 >6699 676+ >679- =73 .yss8 .O,,159etyuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuyuyuuuuuuuuuuuuihhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhfiw7545555555555555555555545353350dgggghg4 -rqqruadfggghghhggghgghhhhhhhhhhghghhghgghghghghghghhhhhhhhghghhhhhhhhhhhhhhhg< ;669& +666q* -76, . O8686 X66$ <uiuO . -><57qryuuuuuuuuuuuuuuuuuuuuuuuuuiuuuuuuuuiuuuuuuuuuuuuuuuuuuuuuughhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdir955555555555555555555555555uhhhhhhhgfsuteqrtpdfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhu X7764 . 15696 .766# . <679$. <7< oqty- %<<149etyuuuuuuuuuuuuuiuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuiuuuuuighhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhsue85555455555555555555559dhhhhhhhgfauteeriadghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh* >865X -667q# >765 668= =86% -0q1 +4357qtiasdddddddddddddddsdddddddsddddddsddddddddddddsddddddddddddshhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfaue755555555555555555ehhhhhhhhgdautrtuadghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq ;-% +76703 O868: . >>% +975 %2* X6669wuadghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhsit06553555555555phhhhhhhggfaiuuupsfghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfO . +76680X 3869- . %986> . . X5877qtpsgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgaur065455555dhhhhhhhhgfdaapadfghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh6 . -8767q> *7699* . . -0989; +98669qusfggfffghhhhgfffghhhhgfffghhhhgdfdghhhhgfffghhhhgfffghhhhdfffghhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgspte955fhhhhhhhhggfddddfghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs . O3987800 5760e4 O3099997 X;996136qpdfhfuuuahhhhduuushhhhduuudhhhhduuufhhhhsuuufhhhhauuughhhhauuughhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfahhhhhhhhhhggffggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh- X%>688780r& ,869qry< #;89999qwr3o O=58887559rdghhguuushhhhfuuishhhhduuudhhhhduuufhhhhsuuufhhhhauuufhhhhauuighhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdauq841<15566890ryupute9880ruuur3<;1156889qrtyyr41>,145670979qyfgghfuuuahhhhfuuushhhhdiuudhhhhduuudhhhhsuuufhhhhauiughhhhauuughhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhggdptq8433356789qrupaaite990ruppitq85345790wtypiitw84335680qe0qrugghhfuuushhhhfuuushhhhduuudhhhhsuuudhhhhauuufhhhhsuuufhhhhpuuighhhhhhhhhhhhhghhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg7-&508666880qrtipssaiyeqqrtpsspue076699qetipsaaurq866790ettwrtphhhhfuuuahhhhfuuudhhhhduuudhhhhduuidhhhhsuuufhhhhauuifsfhhauuughhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg9O550eqq0qwertuisdffsauyttupsddsayrqqqqrtupaddfdpureq0qeryiprtyahhhhfuuushhhhfuuushhhhfuuudhhhhduuudhhhhsuuufhhhhauuug;0hhauuighhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh;8saiuuttuyuipaddgggfsaiiiasffgfaaiytyuupaddgggfdpuuyyuupadauuuahhhhfiuiahhhhfiuudhhhhduuidhhhhduuufhhhhsiiufhhhhauuug>0hhpiuughhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhO ysaaaOt3 4dggp% %usssu& *ifssaaaasdffghOpggsOtaat- -ufggXahhpOfggOp7 .5fgfgghhhgggf9 6gggOphhhXigg9 6gggX 9gggi* *pghhO; 4@+dhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhp*4tgffdf %&er phh+;yu&&gfg+:uu*%hgffddfffghhh uhgd tdd@%yy:+hhh uhhu hhh **tr ahhhhhhhhhhh 0uut<hhh uhhf uhh 0uut<hhhp*4uufhhh$;uu**hhh *0 7*0hhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:9hhgghg 3ggh<shh uhhu hgh uhhu hghggghgghhhh<5hhwOggg uhhy hhh thhu hhh 4hhh<shhhhhhhhhhh4 5uhhhhh<5hheOhhh4 5uhhhhhh;0hhhhhh uhhu hhh uu h;0hhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh00phhhhhhhhhhhhhhh90phhhhhhhhhhhhhhh00phhhhhhhhhhhhhh:0hhhhhh uhhhhhhh *;;* hhh *;;* hhhhhhhhhhhhht fh@9hhh uhhu hhh;9hhu hhh uhhhhhhhhhhhhhhhghu< *phhhr fh#0hhhhu< *phhhh;0hhhhhh &>;* hhh uu h>9hhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh 0hhhhhhhhhhhhhhh 0hhhhhhhhhhhhhhh 0hhhhhhhhhhhhhh;0hhhhhh uhhhhhhh 40900hhh 40900hhhhhhhhhhhhhh@0r fhhh uhhu hhh;0hht hhh uhhhhhhhhhhhhhhhhhhhs<#hhhh#0t fhhhhhhs<#hhhh;0hhuhhh 39000hhh uy h9>hhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh00phhhhhhhhhhhhhhh90phhhhhhhhhhhhhhh00phhhhhhhhhhhhhh;9hhhhhh uhhhhhhh@<uuuphhh@1uuuphhhhghhhhhhhhh0O#5hhhh*%uu*&hhh<<u4 hhh uhhhhhhhhhhhhhhhh<tuu0Ohhhh0O#4hhhh<ruu0Ohhhh1<u9 uhh@1uuuphhh uu h0;hhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh<0hhhhhhXphhhhhhhs;. Xhhhs> Ohhhhhhhhhhhhhhg3 shhhhp; ;ahhha+ ;wOhhhXahhhhhhhhhhhhhhhh6 Owhhhhf4 shhhh6 Oqhhhhp$ 6hhhs; OhhhXpaOh0<hhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhh3;hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4;hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh09 uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhh09 uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh<:5hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh<:4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"
+};
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_qt/pciconfig.h b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/pciconfig.h
new file mode 100644
index 000000000..88b0e1aa8
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/pciconfig.h
@@ -0,0 +1,42 @@
+/* tag: pci config space dump for qt plugin's pci device.
+ *
+ * Copyright (C) 2003 Stefan Reinauer
+ *
+ * See the file "COPYING" for further information about
+ * the copyright and warranty status of this work.
+ */
+
+static unsigned char pci_config_space[256]={
+ 0x02, 0x10, 0x36, 0x43, 0x87, 0x02, 0xb0, 0x02,
+ 0x00, 0x00, 0x00, 0x03, 0x10, 0x42, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0xf0, 0x01, 0xb0, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0xe8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x34, 0x17, 0x0a, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x08, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x34, 0x17, 0x0a, 0x10,
+ 0x01, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x50, 0x20, 0x00, 0x07, 0x02, 0x00, 0x2f,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.cpp b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.cpp
new file mode 100644
index 000000000..07234dc0a
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.cpp
@@ -0,0 +1,128 @@
+/* tag: qt plugin framebuffer class
+ *
+ * Copyright (C) 2003 Stefan Reinauer
+ *
+ * See the file "COPYING" for further information about
+ * the copyright and warranty status of this work.
+ */
+
+#include "plugin_qt.h"
+#include "logo.xpm"
+
+#include <iostream>
+
+static const int sizex=640;
+static const int sizey=480;
+static const int depth=8;
+
+static unsigned char color[256][3]={
+ { 0x00, 0x00, 0x00 },
+ { 0x00, 0x00, 0xaa },
+ { 0x00, 0xaa, 0x00 },
+ { 0x00, 0xaa, 0xaa },
+ { 0xaa, 0x00, 0x00 },
+ { 0xaa, 0x00, 0xaa },
+ { 0xaa, 0x55, 0x00 },
+ { 0xaa, 0xaa, 0xaa },
+ { 0x55, 0x55, 0x55 },
+ { 0x55, 0x55, 0xff },
+ { 0x55, 0xff, 0x55 },
+ { 0x55, 0xff, 0xff },
+ { 0xff, 0x55, 0x55 },
+ { 0xff, 0x55, 0xff },
+ { 0xff, 0xff, 0x55 },
+ { 0xff, 0xff, 0xff },
+};
+
+FrameBufferWidget::FrameBufferWidget(QWidget *parent, const char * name)
+: QWidget(parent, name, Qt::WType_TopLevel)
+{
+ setCaption ("OpenBIOS");
+ setIcon(QPixmap(logo));
+
+ QPopupMenu *file = new QPopupMenu (this);
+
+ file->insertItem( "E&xit", this, SLOT(quit()), CTRL+Key_Q );
+
+ QPopupMenu *help = new QPopupMenu( this );
+ help->insertItem("&About OpenBIOS", this, SLOT(about()), CTRL+Key_H );
+ help->insertItem( "About &Qt", this, SLOT(aboutQt()) );
+
+ menu = new QMenuBar( this );
+ Q_CHECK_PTR( menu );
+ menu->insertItem( "&File", file );
+ menu->insertSeparator();
+ menu->insertItem( "&Help", help );
+ menu->setSeparator( QMenuBar::InWindowsStyle );
+
+ setFixedSize(sizex,sizey+menu->heightForWidth(sizex));
+
+ buffer.create(sizex, sizey, depth, 256);
+
+ for (int i=16; i < 256; i++) {
+ color[i][0]=i;
+ color[i][1]=i;
+ color[i][2]=i;
+ }
+
+ for (int i=0; i< 256; i++)
+ buffer.setColor(i, qRgb(color[i][0], color[i][1], color[i][2]));
+
+ buffer.fill( 0 );
+
+ updatetimer=new QTimer(this);
+ connect( updatetimer, SIGNAL(timeout()), this, SLOT(update()) );
+ updatetimer->start(200,FALSE);
+
+ setMouseTracking( TRUE );
+}
+
+unsigned char * FrameBufferWidget::getFrameBuffer(void)
+{
+ return buffer.bits();
+}
+
+void FrameBufferWidget::paintEvent ( QPaintEvent * )
+{
+ QPainter p( this );
+ p.drawImage(0,menu->heightForWidth(sizex),buffer, 0,0, sizex, sizey);
+}
+
+void FrameBufferWidget::about()
+{
+ QMessageBox::about( this, "About OpenBIOS",
+ " Welcome to OpenBIOS 1.01\n"
+ " IEEE 1275-1994 Open Firmware implementation\n\n"
+ "written by Stefan Reinauer <stepan@openbios.org>\n\n"
+ " http://www.openbios.org/\n");
+}
+
+void FrameBufferWidget::aboutQt()
+{
+ QMessageBox::aboutQt( this, "OpenBIOS" );
+}
+
+void FrameBufferWidget::quit()
+{
+ extern volatile int gui_running;
+ extern volatile int interruptforth;
+
+ gui_running=0;
+ interruptforth=1;
+
+ qApp->quit();
+}
+
+void FrameBufferWidget::update()
+{
+ QPainter p( this );
+ p.drawImage(0,menu->heightForWidth(sizex),buffer, 0,0, sizex, sizey);
+}
+
+void FrameBufferWidget::keyPressEvent(QKeyEvent * e)
+{
+ int a=e->ascii();
+ if (a) {
+ std::cout << " key '" << e->text() << "' pressed" << std::endl;
+ }
+}
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.h b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.h
new file mode 100644
index 000000000..a1ed76fe5
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.h
@@ -0,0 +1,44 @@
+/* tag: qt plugin framebuffer class description
+ *
+ * Copyright (C) 2003 Stefan Reinauer
+ *
+ * See the file "COPYING" for further information about
+ * the copyright and warranty status of this work.
+ */
+
+#ifndef __framebufferwidget_h
+#define __framebufferwidget_h
+
+#include <qapplication.h>
+#include <qwidget.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qmessagebox.h>
+#include <qstatusbar.h>
+#include <qtimer.h>
+
+class FrameBufferWidget : public QWidget {
+ Q_OBJECT
+ public:
+ FrameBufferWidget(QWidget *parent=0, const char *name=0);
+ unsigned char *getFrameBuffer(void);
+
+ public slots:
+ void quit();
+ void about();
+ void aboutQt();
+ void update();
+
+ private:
+ QImage buffer;
+ QMenuBar *menu;
+ QStatusBar *status;
+ QTimer *updatetimer;
+ void paintEvent ( QPaintEvent * );
+ protected:
+ void keyPressEvent(QKeyEvent * e);
+};
+
+#endif
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.pro b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.pro
new file mode 100644
index 000000000..96accd36b
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/plugin_qt.pro
@@ -0,0 +1,18 @@
+# tag: qmake project file for OpenBIOS QT plugin
+#
+# Copyright (C) 2003 Stefan Reinauer
+#
+# See the file "COPYING" for further information about
+# the copyright and warranty status of this work.
+#
+
+TEMPLATE = app
+CONFIG += qt thread warn_on release
+LIBS = -shared
+INCLUDEPATH = qbuild $(ABSOINC) $(TOPDIR)/include $(PLUGINDIR)/plugin_pci
+DESTDIR = qbuild
+OBJECTS_DIR = qbuild
+MOC_DIR = qbuild
+TARGET = plugin_qt.so
+HEADERS = $(PLUGINDIR)/plugin_qt/plugin_qt.h
+SOURCES = $(PLUGINDIR)/plugin_qt/plugin_qt.cpp $(PLUGINDIR)/plugin_qt/qt_main.cpp
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_qt/qt_main.cpp b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/qt_main.cpp
new file mode 100644
index 000000000..ea558d319
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/qt_main.cpp
@@ -0,0 +1,102 @@
+/* tag: openbios qt plugin skeleton
+ *
+ * Copyright (C) 2003 Stefan Reinauer
+ *
+ * See the file "COPYING" for further information about
+ * the copyright and warranty status of this work.
+ */
+
+
+extern "C" {
+#include <pthread.h>
+#include <unistd.h>
+#include "unix/plugins.h"
+#include "unix/plugin_pci.h"
+}
+#include "plugin_qt.h"
+#include "pciconfig.h"
+#include "fcode.h"
+
+#define DEBUG
+
+volatile unsigned char * fb=0;
+volatile int gui_running=0;
+
+typedef struct {
+ int argc;
+ char **argv;
+} threaddata;
+
+void *gui_thread(void *ptr)
+{
+ threaddata *td=(threaddata *)ptr;
+
+ QApplication a(td->argc, td->argv);
+ FrameBufferWidget w;
+
+ a.setMainWidget(&w);
+ w.show();
+
+ fb=w.getFrameBuffer();
+
+ gui_running=-1;
+ a.exec();
+ gui_running=0;
+
+ return 0;
+}
+
+extern "C" {
+extern int plugin_qt_init(void);
+int plugin_qt_init(void)
+{
+ pthread_t mythread;
+ char *args[]={ "plugin_qt" };
+ threaddata mytd = { 1, args };
+
+#ifdef DEBUG
+ printf("Initializing \"framebuffer\" plugin...");
+#endif
+ pthread_create(&mythread, NULL, gui_thread, &mytd);
+ while (!fb)
+ usleep(20);
+
+ /* now we have the framebuffer start address.
+ * updating pci config space to reflect this
+ */
+#if (BITS > 32)
+ *(u32 *)(pci_config_space+0x14)=(u32)((unsigned long)fb>>32);
+#else
+ *(u32 *)(pci_config_space+0x14)=0;
+#endif
+ *(u32 *)(pci_config_space+0x10)=(u32)((unsigned long)fb&0xffffffff);
+
+ /* next is to write the rom address. We write that at a random
+ * address in pci config space for now.
+ */
+#if (BITS > 32)
+ *(u32 *)(pci_config_space+0x34)=(u32)((unsigned long)qt_fcode>>32);
+#else
+ *(u32 *)(pci_config_space+0x34)=0;
+#endif
+ *(u32 *)(pci_config_space+0x30)=(u32)((unsigned long)qt_fcode&0xffffffff);
+
+ /* FIXME: we need to put the fcode image for this
+ * device to the rom resource, once it exists
+ */
+
+ /* register pci device to be available to beginagain */
+ pci_register_device(0, 2, 0, pci_config_space);
+
+#ifdef DEBUG
+ printf("done.\n");
+#endif
+ return 0;
+}
+
+PLUGIN_AUTHOR("Stefan Reinauer <stepan@openbios.org>")
+PLUGIN_DESCRIPTION("QT gui plugin emulating framebuffer device")
+PLUGIN_LICENSE("GPL v2")
+PLUGIN_DEPENDENCIES("pci")
+
+}
diff --git a/qemu/roms/openbios/arch/unix/plugins/plugin_qt/qt_rom.fs b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/qt_rom.fs
new file mode 100644
index 000000000..1879c3654
--- /dev/null
+++ b/qemu/roms/openbios/arch/unix/plugins/plugin_qt/qt_rom.fs
@@ -0,0 +1,85 @@
+\ tag: Property management
+\
+\ this code implements an IEEE 1275-1994 fcode driver
+\ for the OpenBIOS qt interface
+\
+\ Copyright (C) 2003 Stefan Reinauer
+\
+\ See the file "COPYING" for further information about
+\ the copyright and warranty status of this work.
+\
+
+hex
+
+tokenizer[ 1002 4336 0300 23 ]tokenizer ( -- vid did classid revision )
+
+pci-revision
+
+pci-header
+
+fcode-version2
+headers
+
+" dev /pci" evaluate
+new-device
+
+ " ATY,QTEMU" device-name
+ " display" device-type
+
+ " iso8859-1" encode-string
+ " character-set" property
+
+ true encode-int
+ " iso6429-1983-colors" property
+
+ : qt-open
+ \ [..]
+ ." opening framebuffer device." cr
+ 10 10 " pci-l@" evaluate
+ /n 8 = if
+ 10 14 " pci-l@" evaluate
+ 20 << or
+ then
+ ." framebuffer pointer is at 0x" dup . cr
+ to frame-buffer-adr
+ default-font set-font
+ d# 640 d# 480 d# 80 d# 30 fb8-install
+ true
+ ;
+
+ : qt-close
+ ." QT Interface closed." cr
+ 0 to frame-buffer-adr
+ ;
+
+ : qt-selftest
+ ." QT Interface selftest" cr
+ 0
+ ;
+
+ ['] qt-open is-install
+ ['] qt-close is-remove
+ ['] qt-selftest is-selftest
+
+ external
+
+\ the following words will be defined by fb8-install
+\
+
+\ : open ( -- true )
+\ ;
+
+\ : write ( addr len -- actual )
+\ ;
+
+\ : draw-logo ( line# addr width height -- )
+\ ;
+
+\ : restore ( -- )
+\ ;
+
+finish-device
+
+fcode-end
+
+pci-end