Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Sep 2009 09:50:32 +0000 (UTC)
From:      Xin LI <delphij@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r197025 - in head: lib share/man/man4 share/man/man4/man4.i386 sys/amd64/conf sys/conf sys/dev/dpms sys/dev/fb sys/dev/syscons sys/i386/conf sys/i386/include/pc sys/i386/isa sys/modules...
Message-ID:  <200909090950.n899oWOC079768@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: delphij
Date: Wed Sep  9 09:50:31 2009
New Revision: 197025
URL: http://svn.freebsd.org/changeset/base/197025

Log:
   - Teach vesa(4) and dpms(4) about x86emu. [1]
   - Add vesa kernel options for amd64.
   - Connect libvgl library and splash kernel modules to amd64 build.
   - Connect manual page dpms(4) to amd64 build.
   - Remove old vesa/dpms files.
  
  Submitted by:	paradox <ddkprog yahoo com> [1], swell k at gmail.com
  		(with some minor tweaks)

Added:
  head/share/man/man4/dpms.4
     - copied unchanged from r197022, head/share/man/man4/man4.i386/dpms.4
Deleted:
  head/share/man/man4/man4.i386/dpms.4
  head/sys/i386/include/pc/vesa.h
  head/sys/i386/isa/dpms.c
  head/sys/i386/isa/vesa.c
Modified:
  head/lib/Makefile
  head/share/man/man4/Makefile
  head/sys/amd64/conf/NOTES
  head/sys/conf/files.amd64
  head/sys/conf/files.i386
  head/sys/conf/options.amd64
  head/sys/dev/dpms/dpms.c
  head/sys/dev/fb/s3_pci.c
  head/sys/dev/fb/vesa.c
  head/sys/dev/fb/vesa.h
  head/sys/dev/fb/vga.c
  head/sys/dev/syscons/scvesactl.c
  head/sys/i386/conf/NOTES
  head/sys/modules/Makefile
  head/sys/modules/dpms/Makefile
  head/sys/modules/vesa/Makefile

Modified: head/lib/Makefile
==============================================================================
--- head/lib/Makefile	Wed Sep  9 09:34:13 2009	(r197024)
+++ head/lib/Makefile	Wed Sep  9 09:50:31 2009	(r197025)
@@ -112,6 +112,7 @@ _libsmb=	libsmb
 _libncp=	libncp
 .endif
 _libsmb=	libsmb
+_libvgl=	libvgl
 .endif
 
 .if ${MACHINE_ARCH} == "powerpc"

Modified: head/share/man/man4/Makefile
==============================================================================
--- head/share/man/man4/Makefile	Wed Sep  9 09:34:13 2009	(r197024)
+++ head/share/man/man4/Makefile	Wed Sep  9 09:50:31 2009	(r197025)
@@ -85,6 +85,7 @@ MAN=	aac.4 \
 	digi.4 \
 	disc.4 \
 	divert.4 \
+	${_dpms.4} \
 	dpt.4 \
 	dummynet.4 \
 	ed.4 \
@@ -611,6 +612,7 @@ _amdtemp.4=	amdtemp.4
 _asmc.4=	asmc.4
 _coretemp.4=	coretemp.4
 _cpuctl.4=	cpuctl.4
+_dpms.4=	dpms.4
 _hptiop.4=	hptiop.4
 _hptmv.4=	hptmv.4
 _hptrr.4=	hptrr.4

Copied: head/share/man/man4/dpms.4 (from r197022, head/share/man/man4/man4.i386/dpms.4)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/man/man4/dpms.4	Wed Sep  9 09:50:31 2009	(r197025, copy of r197022, head/share/man/man4/man4.i386/dpms.4)
@@ -0,0 +1,58 @@
+.\" Copyright (c) 2008 Yahoo!, Inc.
+.\" All rights reserved.
+.\" Written by: John Baldwin <jhb@FreeBSD.org>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the author nor the names of any co-contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd August 23, 2008
+.Dt DPMS 4
+.Os
+.Sh NAME
+.Nm dpms
+.Nd VESA BIOS DPMS driver
+.Sh SYNOPSIS
+.Cd "device dpms"
+.Sh DESCRIPTION
+The
+.Nm
+driver uses the VESA BIOS to manage an external display during suspend and
+resume.
+When the machine suspends,
+the
+.Nm
+driver turns the external display off.
+When the machine resumes,
+it restores the display to its state when the driver was first loaded.
+.Sh SEE ALSO
+.Xr acpi_video 4
+.Sh BUGS
+.Pp
+The VESA BIOS DPMS calls do not provide any way to identify a particular
+display or adapter to manipulate.
+As a result,
+this driver may have unexpected results on systems with multiple displays
+and/or adapters.

Modified: head/sys/amd64/conf/NOTES
==============================================================================
--- head/sys/amd64/conf/NOTES	Wed Sep  9 09:34:13 2009	(r197024)
+++ head/sys/amd64/conf/NOTES	Wed Sep  9 09:50:31 2009	(r197025)
@@ -154,6 +154,12 @@ options 	AGP_DEBUG
 #####################################################################
 # HARDWARE DEVICE CONFIGURATION
 
+# To include support for VGA VESA video modes (depends on X86EMU)
+options 	VESA
+
+# Turn on extra debugging checks and output for VESA support.
+options 	VESA_DEBUG
+
 #
 # Optional devices:
 #

Modified: head/sys/conf/files.amd64
==============================================================================
--- head/sys/conf/files.amd64	Wed Sep  9 09:34:13 2009	(r197024)
+++ head/sys/conf/files.amd64	Wed Sep  9 09:50:31 2009	(r197025)
@@ -162,6 +162,7 @@ dev/atkbdc/atkbdc_subr.c	optional	atkbdc
 dev/atkbdc/psm.c		optional	psm atkbdc
 dev/coretemp/coretemp.c		optional	coretemp
 dev/cpuctl/cpuctl.c		optional	cpuctl
+dev/dpms/dpms.c			optional	dpms x86emu
 # There are no systems with isa slots, so all ed isa entries should go..
 dev/ed/if_ed_3c503.c		optional	ed isa ed_3c503
 dev/ed/if_ed_isa.c		optional	ed isa
@@ -169,6 +170,7 @@ dev/ed/if_ed_wd80x3.c		optional	ed isa
 dev/ed/if_ed_hpp.c		optional	ed isa ed_hpp
 dev/ed/if_ed_sic.c		optional	ed isa ed_sic
 dev/fb/fb.c			optional	fb | vga
+dev/fb/vesa.c			optional	vga vesa x86emu
 dev/fb/vga.c			optional	vga
 dev/ichwd/ichwd.c		optional	ichwd
 dev/if_ndis/if_ndis.c		optional	ndis
@@ -217,6 +219,7 @@ dev/sio/sio_puc.c		optional	sio puc
 dev/speaker/spkr.c		optional	speaker
 dev/syscons/apm/apm_saver.c	optional	apm_saver apm
 dev/syscons/scterm-teken.c	optional	sc
+dev/syscons/scvesactl.c		optional	sc vga vesa x86emu
 dev/syscons/scvgarndr.c		optional	sc vga
 dev/syscons/scvtb.c		optional	sc
 dev/uart/uart_cpu_amd64.c	optional	uart

Modified: head/sys/conf/files.i386
==============================================================================
--- head/sys/conf/files.i386	Wed Sep  9 09:34:13 2009	(r197024)
+++ head/sys/conf/files.i386	Wed Sep  9 09:50:31 2009	(r197025)
@@ -150,12 +150,14 @@ dev/ctau/if_ct.c		optional ctau
 dev/cx/csigma.c			optional cx
 dev/cx/cxddk.c			optional cx
 dev/cx/if_cx.c			optional cx
+dev/dpms/dpms.c			optional dpms x86emu
 dev/ed/if_ed_3c503.c		optional ed isa ed_3c503
 dev/ed/if_ed_isa.c		optional ed isa
 dev/ed/if_ed_wd80x3.c		optional ed isa
 dev/ed/if_ed_hpp.c		optional ed isa ed_hpp
 dev/ed/if_ed_sic.c		optional ed isa ed_sic
 dev/fb/fb.c			optional fb | vga
+dev/fb/vesa.c			optional vga vesa x86emu
 dev/fb/vga.c			optional vga
 dev/fdc/fdc.c			optional fdc
 dev/fdc/fdc_acpi.c		optional fdc
@@ -217,7 +219,7 @@ dev/sio/sio_puc.c		optional sio puc
 dev/speaker/spkr.c		optional speaker
 dev/syscons/apm/apm_saver.c	optional apm_saver apm
 dev/syscons/scterm-teken.c	optional sc
-dev/syscons/scvesactl.c		optional sc vga vesa
+dev/syscons/scvesactl.c		optional sc vga vesa x86emu
 dev/syscons/scvgarndr.c		optional sc vga
 dev/syscons/scvtb.c		optional sc
 dev/uart/uart_cpu_i386.c	optional uart
@@ -329,7 +331,6 @@ i386/isa/clock.c		optional native
 i386/xen/clock.c		optional xen
 i386/xen/xen_clock_util.c	optional xen
 i386/xen/xen_rtc.c		optional xen
-i386/isa/dpms.c			optional dpms
 i386/isa/elcr.c			standard
 i386/isa/elink.c		optional ep | ie
 i386/isa/isa.c			optional isa
@@ -339,7 +340,6 @@ i386/isa/npx.c			optional npx
 i386/isa/pmtimer.c		optional pmtimer
 i386/isa/prof_machdep.c		optional profiling-routine
 i386/isa/spic.c			optional spic
-i386/isa/vesa.c			optional vga vesa
 i386/linux/imgact_linux.c	optional compat_linux
 i386/linux/linux_dummy.c	optional compat_linux
 i386/linux/linux_locore.s	optional compat_linux	\

Modified: head/sys/conf/options.amd64
==============================================================================
--- head/sys/conf/options.amd64	Wed Sep  9 09:34:13 2009	(r197024)
+++ head/sys/conf/options.amd64	Wed Sep  9 09:50:31 2009	(r197025)
@@ -37,6 +37,9 @@ VGA_NO_MODE_CHANGE	opt_vga.h
 VGA_SLOW_IOACCESS	opt_vga.h
 VGA_WIDTH90		opt_vga.h
 
+VESA
+VESA_DEBUG		opt_vesa.h
+
 # AGP debugging support
 AGP_DEBUG		opt_agp.h
 

Modified: head/sys/dev/dpms/dpms.c
==============================================================================
--- head/sys/dev/dpms/dpms.c	Wed Sep  9 09:34:13 2009	(r197024)
+++ head/sys/dev/dpms/dpms.c	Wed Sep  9 09:50:31 2009	(r197025)
@@ -67,7 +67,11 @@ __FBSDID("$FreeBSD$");
 #include <sys/libkern.h>
 #include <sys/module.h>
 
-#include <machine/vm86.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <contrib/x86emu/x86emu.h>
+#include <contrib/x86emu/x86emu_regs.h>
 
 /*
  * VESA DPMS States 
@@ -90,6 +94,9 @@ struct dpms_softc {
 	int	dpms_initial_state;
 };
 
+static struct x86emu vesa_emu;
+static unsigned char *emumem = NULL;
+
 static int	dpms_attach(device_t);
 static int	dpms_detach(device_t);
 static int	dpms_get_supported_states(int *);
@@ -119,6 +126,59 @@ static driver_t dpms_driver = {
 static devclass_t dpms_devclass;
 
 DRIVER_MODULE(dpms, vgapci, dpms_driver, dpms_devclass, NULL, NULL);
+MODULE_DEPEND(dpms, x86emu, 1, 1, 1);
+
+static uint8_t
+vm86_emu_inb(struct x86emu *emu, uint16_t port)
+{
+	if (port == 0xb2) /* APM scratch register */
+		return 0;
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return 0;
+	return inb(port);
+}
+
+static uint16_t
+vm86_emu_inw(struct x86emu *emu, uint16_t port)
+{
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return 0;
+	return inw(port);
+}
+
+static uint32_t
+vm86_emu_inl(struct x86emu *emu, uint16_t port)
+{
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return 0;
+	return inl(port);
+}
+
+static void
+vm86_emu_outb(struct x86emu *emu, uint16_t port, uint8_t val)
+{
+	if (port == 0xb2) /* APM scratch register */
+		return;
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return;
+	outb(port, val);
+}
+
+static void
+vm86_emu_outw(struct x86emu *emu, uint16_t port, uint16_t val)
+{
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return;
+	outw(port, val);
+}
+
+static void
+vm86_emu_outl(struct x86emu *emu, uint16_t port, uint32_t val)
+{
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return;
+	outl(port, val);
+}
 
 static void
 dpms_identify(driver_t *driver, device_t parent)
@@ -132,6 +192,7 @@ dpms_identify(driver_t *driver, device_t
 	 */
 	if (devclass_get_device(dpms_devclass, 0) == NULL)
 		device_add_child(parent, "dpms", 0);
+
 }
 
 static int
@@ -139,6 +200,21 @@ dpms_probe(device_t dev)
 {
 	int error, states;
 
+	emumem = pmap_mapbios(0x0, 0xc00000);
+
+	memset(&vesa_emu, 0, sizeof(vesa_emu));
+	x86emu_init_default(&vesa_emu);
+
+	vesa_emu.emu_inb = vm86_emu_inb;
+	vesa_emu.emu_inw = vm86_emu_inw;
+	vesa_emu.emu_inl = vm86_emu_inl;
+	vesa_emu.emu_outb = vm86_emu_outb;
+	vesa_emu.emu_outw = vm86_emu_outw;
+	vesa_emu.emu_outl = vm86_emu_outl;
+
+	vesa_emu.mem_base = (char *)emumem;
+	vesa_emu.mem_size = 1024 * 1024;
+
 	error = dpms_get_supported_states(&states);
 	if (error)
 		return (error);
@@ -164,6 +240,8 @@ dpms_attach(device_t dev)
 static int
 dpms_detach(device_t dev)
 {
+	if (emumem)
+		pmap_unmapdev((vm_offset_t)emumem, 0xc00000);
 
 	return (0);
 }
@@ -189,21 +267,19 @@ dpms_resume(device_t dev)
 static int
 dpms_call_bios(int subfunction, int *bh)
 {
-	struct vm86frame vmf;
-	int error;
+	vesa_emu.x86.R_AX = VBE_DPMS_FUNCTION;
+	vesa_emu.x86.R_BL = subfunction;
+	vesa_emu.x86.R_BH = *bh;
+	vesa_emu.x86.R_ES = 0;
+	vesa_emu.x86.R_DI = 0;
+	x86emu_exec_intr(&vesa_emu, 0x10);
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_ax = VBE_DPMS_FUNCTION;
-	vmf.vmf_bl = subfunction;
-	vmf.vmf_bh = *bh;
-	vmf.vmf_es = 0;
-	vmf.vmf_di = 0;
-	error = vm86_intcall(0x10, &vmf);
-	if (error == 0 && (vmf.vmf_eax & 0xffff) != 0x004f)
-		error = ENXIO;
-	if (error == 0)
-		*bh = vmf.vmf_bh;
-	return (error);
+	if ((vesa_emu.x86.R_EAX & 0xffff) != 0x004f)
+		return (ENXIO);
+
+	*bh = vesa_emu.x86.R_BH;
+
+	return (0);
 }
 
 static int

Modified: head/sys/dev/fb/s3_pci.c
==============================================================================
--- head/sys/dev/fb/s3_pci.c	Wed Sep  9 09:34:13 2009	(r197024)
+++ head/sys/dev/fb/s3_pci.c	Wed Sep  9 09:50:31 2009	(r197025)
@@ -56,7 +56,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/md_var.h>
 #include <machine/vm86.h>
 #include <machine/pc/bios.h>
-#include <machine/pc/vesa.h>
+#include <dev/fb/vesa.h>
 
 #include <dev/fb/fbreg.h>
 #include <dev/fb/vgareg.h>

Modified: head/sys/dev/fb/vesa.c
==============================================================================
--- head/sys/dev/fb/vesa.c	Wed Sep  9 09:34:13 2009	(r197024)
+++ head/sys/dev/fb/vesa.c	Wed Sep  9 09:50:31 2009	(r197025)
@@ -45,19 +45,16 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_param.h>
 #include <vm/pmap.h>
 
-#include <machine/md_var.h>
-#include <machine/vm86.h>
-#include <machine/pc/bios.h>
-#include <machine/pc/vesa.h>
+#include <dev/fb/vesa.h>
 
 #include <dev/fb/fbreg.h>
 #include <dev/fb/vgareg.h>
 
-#ifndef __i386__
 #include <isa/isareg.h>
-#else
-#include <i386/isa/isa.h>
-#endif
+#include <machine/cpufunc.h>
+
+#include <contrib/x86emu/x86emu.h>
+#include <contrib/x86emu/x86emu_regs.h>
 
 #define	VESA_VIA_CLE266		"VIA CLE266\r\n"
 
@@ -76,8 +73,7 @@ typedef struct adp_state adp_state_t;
 /* VESA video adapter */
 static video_adapter_t *vesa_adp = NULL;
 static int vesa_state_buf_size = 0;
-#define VESA_VM86_BUFSIZE	(3 * PAGE_SIZE)
-static void *vesa_vm86_buf;
+#define VESA_X86EMU_BUFSIZE	(3 * PAGE_SIZE)
 
 /* VESA functions */
 #if 0
@@ -109,7 +105,8 @@ static vi_fill_rect_t		vesa_fill_rect;
 static vi_bitblt_t		vesa_bitblt;
 static vi_diag_t		vesa_diag;
 static int			vesa_bios_info(int level);
-static struct vm86context	vesa_vmcontext;
+
+static struct x86emu		vesa_emu;
 
 static video_switch_t vesavidsw = {
 	vesa_probe,
@@ -200,8 +197,6 @@ static int vesa_bios_set_start(int x, in
 static int vesa_map_gen_mode_num(int type, int color, int mode);
 static int vesa_translate_flags(u_int16_t vflags);
 static int vesa_translate_mmodel(u_int8_t vmodel);
-static void *vesa_fix_ptr(u_int32_t p, u_int16_t seg, u_int16_t off, 
-			  u_char *buf);
 static int vesa_bios_init(void);
 static void vesa_clear_modes(video_info_t *info, int color);
 static vm_offset_t vesa_map_buffer(u_int paddr, size_t size);
@@ -211,6 +206,77 @@ static void vesa_unmap_buffer(vm_offset_
 static int vesa_get_origin(video_adapter_t *adp, off_t *offset);
 #endif
 
+#define SEG_ADDR(x)	(((x) >> 4) & 0x00F000)
+#define SEG_OFF(x)	((x) & 0x0FFFF)
+
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#define B_O16(x)	(x)
+#define B_O32(x)	(x)
+#else
+#define B_O16(x)	((((x) & 0xff) << 8) | (((x) & 0xff) >> 8))
+#define B_O32(x)	((((x) & 0xff) << 24) | (((x) & 0xff00) << 8) \
+		| (((x) & 0xff0000) >> 8) | (((x) & 0xff000000) >> 24))
+#endif
+
+#define L_ADD(x)	(B_O32(x) & 0xffff) + ((B_O32(x) >> 12) & 0xffff00)
+#define FARP(p)		(((unsigned)(p & 0xffff0000) >> 12) | (p & 0xffff))
+
+#define REALOFF(x)	(x*4096)
+
+static unsigned char *emumem = NULL;
+
+static uint8_t
+vm86_emu_inb(struct x86emu *emu, uint16_t port)
+{
+	if (port == 0xb2) /* APM scratch register */
+		return 0;
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return 0;
+	return inb(port);
+}
+
+static uint16_t
+vm86_emu_inw(struct x86emu *emu, uint16_t port)
+{
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return 0;
+	return inw(port);
+}
+
+static uint32_t
+vm86_emu_inl(struct x86emu *emu, uint16_t port)
+{
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return 0;
+	return inl(port);
+}
+
+static void
+vm86_emu_outb(struct x86emu *emu, uint16_t port, uint8_t val)
+{
+	if (port == 0xb2) /* APM scratch register */
+		return;
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return;
+	outb(port, val);
+}
+
+static void
+vm86_emu_outw(struct x86emu *emu, uint16_t port, uint16_t val)
+{
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return;
+	outw(port, val);
+}
+
+static void
+vm86_emu_outl(struct x86emu *emu, uint16_t port, uint32_t val)
+{
+	if (port >= 0x80 && port < 0x88) /* POST status register */
+		return;
+	outl(port, val);
+}
+
 static void
 dump_buffer(u_char *buf, size_t len)
 {
@@ -227,11 +293,9 @@ dump_buffer(u_char *buf, size_t len)
 static int
 int10_set_mode(int mode)
 {
-	struct vm86frame vmf;
+	vesa_emu.x86.R_EAX = 0x0000 | mode;
+	x86emu_exec_intr(&vesa_emu, 0x10);
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x0000 | mode;
-	vm86_intcall(0x10, &vmf);
 	return 0;
 }
 
@@ -239,84 +303,83 @@ int10_set_mode(int mode)
 static int
 vesa_bios_get_mode(int mode, struct vesa_mode *vmode)
 {
-	struct vm86frame vmf;
 	u_char *buf;
-	int err;
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f01; 
-	vmf.vmf_ecx = mode;
-	buf = vesa_vm86_buf;
-	vm86_getptr(&vesa_vmcontext, (vm_offset_t)buf, &vmf.vmf_es, &vmf.vmf_di);
+	vesa_emu.x86.R_EAX = 0x4f01;
+	vesa_emu.x86.R_ECX = mode;
+
+	buf = (emumem + REALOFF(3));
+	vesa_emu.x86.R_ES = SEG_ADDR(REALOFF(3));
+	vesa_emu.x86.R_DI = SEG_OFF(REALOFF(3));
 
-	err = vm86_datacall(0x10, &vmf, &vesa_vmcontext);
-	if ((err != 0) || (vmf.vmf_ax != 0x4f))
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	if ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
 		return 1;
+
 	bcopy(buf, vmode, sizeof(*vmode));
+
 	return 0;
 }
 
 static int
 vesa_bios_set_mode(int mode)
 {
-	struct vm86frame vmf;
-	int err;
+	vesa_emu.x86.R_EAX = 0x4f02;
+	vesa_emu.x86.R_EBX = mode;
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f02;
-	vmf.vmf_ebx = mode;
-	err = vm86_intcall(0x10, &vmf);
-	return ((err != 0) || (vmf.vmf_ax != 0x4f));
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	return ((vesa_emu.x86.R_AX & 0xff) != 0x4f);
 }
 
 static int
 vesa_bios_get_dac(void)
 {
-	struct vm86frame vmf;
-	int err;
+	vesa_emu.x86.R_EAX = 0x4f08;
+	vesa_emu.x86.R_EBX = 1;
+
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	if ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
+		return 6;
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f08;
-	vmf.vmf_ebx = 1;	/* get DAC width */
-	err = vm86_intcall(0x10, &vmf);
-	if ((err != 0) || (vmf.vmf_ax != 0x4f))
-		return 6;	/* XXX */
-	return ((vmf.vmf_ebx >> 8) & 0x00ff);
+	return ((vesa_emu.x86.R_EBX >> 8) & 0x00ff);
 }
 
 static int
 vesa_bios_set_dac(int bits)
 {
-	struct vm86frame vmf;
-	int err;
+	vesa_emu.x86.R_EAX = 0x4f08;
+	vesa_emu.x86.R_EBX = (bits << 8);
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f08;
-	vmf.vmf_ebx = (bits << 8);
-	err = vm86_intcall(0x10, &vmf);
-	if ((err != 0) || (vmf.vmf_ax != 0x4f))
-		return 6;	/* XXX */
-	return ((vmf.vmf_ebx >> 8) & 0x00ff);
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	if ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
+		return 6;
+
+	return ((vesa_emu.x86.R_EBX >> 8) & 0x00ff);
 }
 
 static int
 vesa_bios_save_palette(int start, int colors, u_char *palette, int bits)
 {
-	struct vm86frame vmf;
 	u_char *p;
-	int err;
 	int i;
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f09;
-	vmf.vmf_ebx = 1;	/* get primary palette data */
-	vmf.vmf_ecx = colors;
-	vmf.vmf_edx = start;
-	p = vesa_vm86_buf;
-	vm86_getptr(&vesa_vmcontext, (vm_offset_t)p, &vmf.vmf_es, &vmf.vmf_di);
+	vesa_emu.x86.R_EAX = 0x4f09;
+	vesa_emu.x86.R_EBX = 1;
+	vesa_emu.x86.R_ECX = colors;
+	vesa_emu.x86.R_EDX = start;
+
+	vesa_emu.x86.R_ES = SEG_ADDR(REALOFF(2));
+	vesa_emu.x86.R_DI = SEG_OFF(REALOFF(2));
 
-	err = vm86_datacall(0x10, &vmf, &vesa_vmcontext);
-	if ((err != 0) || (vmf.vmf_ax != 0x4f))
+	p = emumem + REALOFF(2);
+
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	if ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
 		return 1;
 
 	bits = 8 - bits;
@@ -332,21 +395,22 @@ static int
 vesa_bios_save_palette2(int start, int colors, u_char *r, u_char *g, u_char *b,
 			int bits)
 {
-	struct vm86frame vmf;
 	u_char *p;
-	int err;
 	int i;
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f09;
-	vmf.vmf_ebx = 1;	/* get primary palette data */
-	vmf.vmf_ecx = colors;
-	vmf.vmf_edx = start;
-	p = vesa_vm86_buf;
-	vm86_getptr(&vesa_vmcontext, (vm_offset_t)p, &vmf.vmf_es, &vmf.vmf_di);
+	vesa_emu.x86.R_EAX = 0x4f09;
+	vesa_emu.x86.R_EBX = 1;
+	vesa_emu.x86.R_ECX = colors;
+	vesa_emu.x86.R_EDX = start;
+
+	vesa_emu.x86.R_ES = SEG_ADDR(REALOFF(2));
+	vesa_emu.x86.R_DI = SEG_OFF(REALOFF(2));
 
-	err = vm86_datacall(0x10, &vmf, &vesa_vmcontext);
-	if ((err != 0) || (vmf.vmf_ax != 0x4f))
+	p = emumem + REALOFF(2);
+
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	if ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
 		return 1;
 
 	bits = 8 - bits;
@@ -361,12 +425,11 @@ vesa_bios_save_palette2(int start, int c
 static int
 vesa_bios_load_palette(int start, int colors, u_char *palette, int bits)
 {
-	struct vm86frame vmf;
 	u_char *p;
-	int err;
 	int i;
 
-	p = vesa_vm86_buf;
+	p = (emumem + REALOFF(2));
+
 	bits = 8 - bits;
 	for (i = 0; i < colors; ++i) {
 		p[i*4]	   = palette[i*3 + 2] >> bits;
@@ -375,15 +438,17 @@ vesa_bios_load_palette(int start, int co
 		p[i*4 + 3] = 0;
 	}
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f09;
-	vmf.vmf_ebx = 0;	/* set primary palette data */
-	vmf.vmf_ecx = colors;
-	vmf.vmf_edx = start;
-	vm86_getptr(&vesa_vmcontext, (vm_offset_t)p, &vmf.vmf_es, &vmf.vmf_di);
+	vesa_emu.x86.R_EAX = 0x4f09;
+	vesa_emu.x86.R_EBX = 0;
+	vesa_emu.x86.R_ECX = colors;
+	vesa_emu.x86.R_EDX = start;
+
+	vesa_emu.x86.R_ES = SEG_ADDR(REALOFF(2));
+	vesa_emu.x86.R_DI = SEG_OFF(REALOFF(2));
 
-	err = vm86_datacall(0x10, &vmf, &vesa_vmcontext);
-	return ((err != 0) || (vmf.vmf_ax != 0x4f));
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	return ((vesa_emu.x86.R_AX & 0xff) != 0x4f);
 }
 
 #ifdef notyet
@@ -391,12 +456,11 @@ static int
 vesa_bios_load_palette2(int start, int colors, u_char *r, u_char *g, u_char *b,
 			int bits)
 {
-	struct vm86frame vmf;
 	u_char *p;
-	int err;
 	int i;
 
-	p = vesa_vm86_buf;
+	p = (emumem + REALOFF(2));
+
 	bits = 8 - bits;
 	for (i = 0; i < colors; ++i) {
 		p[i*4]	   = b[i] >> bits;
@@ -405,92 +469,94 @@ vesa_bios_load_palette2(int start, int c
 		p[i*4 + 3] = 0;
 	}
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f09;
-	vmf.vmf_ebx = 0;	/* set primary palette data */
-	vmf.vmf_ecx = colors;
-	vmf.vmf_edx = start;
-	vm86_getptr(&vesa_vmcontext, (vm_offset_t)p, &vmf.vmf_es, &vmf.vmf_di);
+	vesa_emu.x86.R_EAX = 0x4f09;
+	vesa_emu.x86.R_EBX = 0;
+	vesa_emu.x86.R_ECX = colors;
+	vesa_emu.x86.R_EDX = start;
+
+	vesa_emu.x86.R_ES = SEG_ADDR(REALOFF(2));
+	vesa_emu.x86.R_DI = SEG_OFF(REALOFF(2));
 
-	err = vm86_datacall(0x10, &vmf, &vesa_vmcontext);
-	return ((err != 0) || (vmf.vmf_ax != 0x4f));
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	return ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
 }
 #endif
 
 static int
 vesa_bios_state_buf_size(void)
 {
-	struct vm86frame vmf;
-	int err;
+	vesa_emu.x86.R_EAX = 0x4f04;
+	vesa_emu.x86.R_ECX = STATE_ALL;
+	vesa_emu.x86.R_EDX = STATE_SIZE;
+
+	x86emu_exec_intr(&vesa_emu, 0x10);
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f04; 
-	vmf.vmf_ecx = STATE_ALL;
-	vmf.vmf_edx = STATE_SIZE;
-	err = vm86_intcall(0x10, &vmf);
-	if ((err != 0) || (vmf.vmf_ax != 0x4f))
+	if ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
 		return 0;
-	return vmf.vmf_bx*64;
+
+	return vesa_emu.x86.R_BX*64;
 }
 
 static int
 vesa_bios_save_restore(int code, void *p, size_t size)
 {
-	struct vm86frame vmf;
 	u_char *buf;
-	int err;
 
-	if (size > VESA_VM86_BUFSIZE)
+	if (size > VESA_X86EMU_BUFSIZE)
 		return (1);
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f04; 
-	vmf.vmf_ecx = STATE_ALL;
-	vmf.vmf_edx = code;	/* STATE_SAVE/STATE_LOAD */
-	buf = vesa_vm86_buf;
-	vm86_getptr(&vesa_vmcontext, (vm_offset_t)buf, &vmf.vmf_es, &vmf.vmf_bx);
+	vesa_emu.x86.R_EAX = 0x4f04;
+	vesa_emu.x86.R_ECX = STATE_ALL;
+	vesa_emu.x86.R_EDX = code;
+
+	buf = emumem + REALOFF(2);
+
+	vesa_emu.x86.R_ES = SEG_ADDR(REALOFF(2));
+	vesa_emu.x86.R_DI = SEG_OFF(REALOFF(2));
+
 	bcopy(p, buf, size);
 
-	err = vm86_datacall(0x10, &vmf, &vesa_vmcontext);
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
 	bcopy(buf, p, size);
-	return ((err != 0) || (vmf.vmf_ax != 0x4f));
+
+	return ((vesa_emu.x86.R_AX & 0xff) != 0x4f);
 }
 
 static int
 vesa_bios_get_line_length(void)
 {
-	struct vm86frame vmf;
-	int err;
+	vesa_emu.x86.R_EAX = 0x4f06;
+	vesa_emu.x86.R_EBX = 1;
+
+	x86emu_exec_intr(&vesa_emu, 0x10);
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f06; 
-	vmf.vmf_ebx = 1;	/* get scan line length */
-	err = vm86_intcall(0x10, &vmf);
-	if ((err != 0) || (vmf.vmf_ax != 0x4f))
+	if ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
 		return -1;
-	return vmf.vmf_bx;	/* line length in bytes */
+	return vesa_emu.x86.R_BX;
 }
 
 static int
 vesa_bios_set_line_length(int pixel, int *bytes, int *lines)
 {
-	struct vm86frame vmf;
-	int err;
+	vesa_emu.x86.R_EAX = 0x4f06;
+	vesa_emu.x86.R_EBX = 0;
+	vesa_emu.x86.R_ECX = pixel;
+
+	x86emu_exec_intr(&vesa_emu, 0x10);
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f06; 
-	vmf.vmf_ebx = 0;	/* set scan line length in pixel */
-	vmf.vmf_ecx = pixel;
-	err = vm86_intcall(0x10, &vmf);
 #if VESA_DEBUG > 1
-	printf("bx:%d, cx:%d, dx:%d\n", vmf.vmf_bx, vmf.vmf_cx, vmf.vmf_dx); 
+	printf("bx:%d, cx:%d, dx:%d\n", vesa_emu.x86.R_BX, vesa_emu.x86.R_CX, vesa_emu.x86.R_DX);
 #endif
-	if ((err != 0) || (vmf.vmf_ax != 0x4f))
-		return 1;
+	if ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
+		return -1;
+
 	if (bytes)
-		*bytes = vmf.vmf_bx;
+		*bytes = vesa_emu.x86.R_BX;
 	if (lines)
-		*lines = vmf.vmf_dx;
+		*lines = vesa_emu.x86.R_DX;
+
 	return 0;
 }
 
@@ -498,17 +564,17 @@ vesa_bios_set_line_length(int pixel, int
 static int
 vesa_bios_get_start(int *x, int *y)
 {
-	struct vm86frame vmf;
-	int err;
+	vesa_emu.x86.R_EAX = 0x4f07;
+	vesa_emu.x86.R_EBX = 1;
+
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	if ((vesa_emu.x86.R_AX & 0xff) != 0x4f)
+		return -1;
+
+	*x = vesa_emu.x86.R_CX;
+	*y = vesa_emu.x86.R_DX;
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f07; 
-	vmf.vmf_ebx = 1;	/* get display start */
-	err = vm86_intcall(0x10, &vmf);
-	if ((err != 0) || (vmf.vmf_ax != 0x4f))
-		return 1;
-	*x = vmf.vmf_cx;
-	*y = vmf.vmf_dx;
 	return 0;
 }
 #endif
@@ -516,16 +582,14 @@ vesa_bios_get_start(int *x, int *y)
 static int
 vesa_bios_set_start(int x, int y)
 {
-	struct vm86frame vmf;
-	int err;
+	vesa_emu.x86.R_EAX = 0x4f07;
+	vesa_emu.x86.R_EBX = 0x80;
+	vesa_emu.x86.R_EDX = y;
+	vesa_emu.x86.R_ECX = x;
+
+	x86emu_exec_intr(&vesa_emu, 0x10);
 
-	bzero(&vmf, sizeof(vmf));
-	vmf.vmf_eax = 0x4f07; 
-	vmf.vmf_ebx = 0x80;	/* set display start */
-	vmf.vmf_edx = y;
-	vmf.vmf_ecx = x;
-	err = vm86_intcall(0x10, &vmf);
-	return ((err != 0) || (vmf.vmf_ax != 0x4f));
+	return ((vesa_emu.x86.R_AX & 0xff) != 0x4f);
 }
 
 /* map a generic video mode to a known mode */
@@ -595,30 +659,15 @@ vesa_translate_mmodel(u_int8_t vmodel)
 	return V_INFO_MM_OTHER;
 }
 
-static void
-*vesa_fix_ptr(u_int32_t p, u_int16_t seg, u_int16_t off, u_char *buf)
-{
-	if (p == 0)
-		return NULL;
-	if (((p >> 16) == seg) && ((p & 0xffff) >= off))
-		return (void *)(buf + ((p & 0xffff) - off));
-	else {
-		p = BIOS_SADDRTOLADDR(p);
-		return (void *)BIOS_PADDRTOVADDR(p);
-	}
-}
-
 static int
 vesa_bios_init(void)
 {
-	static u_char buf[512];
-	struct vm86frame vmf;
+	static struct vesa_info buf;
 	struct vesa_mode vmode;
 	video_info_t *p;
 	u_char *vmbuf;
 	int is_via_cle266;
 	int modes;
-	int err;
 	int i;
 
 	if (vesa_init_done)
@@ -629,28 +678,24 @@ vesa_bios_init(void)
 	vesa_vmode_max = 0;
 	vesa_vmode[0].vi_mode = EOT;
 
-	/* Allocate a buffer and add each page to the vm86 context. */
-	vesa_vm86_buf = malloc(VESA_VM86_BUFSIZE, M_DEVBUF, M_WAITOK | M_ZERO);
-	KASSERT(((vm_offset_t)vesa_vm86_buf & PAGE_MASK) == 0,
-	    ("bad vesa_vm86_buf alignment"));
-	for (i = 0; i < howmany(VESA_VM86_BUFSIZE, PAGE_SIZE); i++)
-		vm86_addpage(&vesa_vmcontext, i + 1,
-		    (vm_offset_t)vesa_vm86_buf + PAGE_SIZE * i);
-
-	vmbuf = vesa_vm86_buf;
-	bzero(&vmf, sizeof(vmf));	/* paranoia */
+	vmbuf = (emumem + REALOFF(2));
 	bcopy("VBE2", vmbuf, 4);	/* try for VBE2 data */
-	vmf.vmf_eax = 0x4f00;
-	vm86_getptr(&vesa_vmcontext, (vm_offset_t)vmbuf, &vmf.vmf_es, &vmf.vmf_di);
 
-	err = vm86_datacall(0x10, &vmf, &vesa_vmcontext);
-	if ((err != 0) || (vmf.vmf_ax != 0x4f) || bcmp("VESA", vmbuf, 4))
+	vesa_emu.x86.R_EAX = 0x4f00;
+	vesa_emu.x86.R_ES = SEG_ADDR(REALOFF(2));
+	vesa_emu.x86.R_DI = SEG_OFF(REALOFF(2));
+
+	x86emu_exec_intr(&vesa_emu, 0x10);
+
+	if (((vesa_emu.x86.R_AX & 0xff) != 0x4f) || bcmp("VESA", vmbuf, 4))
 		return 1;
-	bcopy(vmbuf, buf, sizeof(buf));
-	vesa_adp_info = (struct vesa_info *)buf;
+
+	bcopy(vmbuf, &buf, sizeof(buf));
+
+	vesa_adp_info = &buf;
 	if (bootverbose) {
 		printf("VESA: information block\n");
-		dump_buffer(buf, 64);
+		dump_buffer((u_char *)&buf, sizeof(buf));
 	}
 	if (vesa_adp_info->v_version < 0x0102) {
 		printf("VESA: VBE version %d.%d is not supported; "
@@ -662,28 +707,21 @@ vesa_bios_init(void)
 		return 1;
 	}
 
-	/* fix string ptrs */
-	vesa_oemstr = (char *)vesa_fix_ptr(vesa_adp_info->v_oemstr,
-					   vmf.vmf_es, vmf.vmf_di, buf);
+	vesa_oemstr = (char *)(emumem + L_ADD(vesa_adp_info->v_oemstr));
+
 	is_via_cle266 = strcmp(vesa_oemstr, VESA_VIA_CLE266) == 0;
 

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909090950.n899oWOC079768>