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>