Deleted Added
sdiff udiff text old ( 39287 ) new ( 39591 )
full compact
1/*-
2 * Copyright (c) 1998 Kazutaka YOKOTA (yokota@zodiac.mech.utsunomiya-u.ac.jp)
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 12 unchanged lines hidden (view full) ---

21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $Id$
30 */
31
32#include "sc.h"
33#include "opt_vesa.h"
34#include "opt_vm86.h"
35
36#if (NSC > 0 && defined(VESA) && defined(VM86)) || defined(VESA_MODULE)
37

--- 90 unchanged lines hidden (view full) ---

128#define STATE_HW (1<<0)
129#define STATE_DATA (1<<1)
130#define STATE_DAC (1<<2)
131#define STATE_REG (1<<3)
132#define STATE_MOST (STATE_HW | STATE_DATA | STATE_REG)
133#define STATE_ALL (STATE_HW | STATE_DATA | STATE_DAC | STATE_REG)
134static int vesa_bios_state_buf_size(void);
135static int vesa_bios_save_restore(int code, void *p, size_t size);
136static int translate_flags(u_int16_t vflags);
137static int vesa_bios_init(void);
138static void clear_modes(video_info_t *info, int color);
139
140static void
141dump_buffer(u_char *buf, size_t len)
142{
143 int i;
144
145 for(i = 0; i < len;) {
146 printf("%02x ", buf[i]);

--- 130 unchanged lines hidden (view full) ---

277 vmf.vmf_eax = 0x4f04;
278 vmf.vmf_ecx = STATE_MOST;
279 vmf.vmf_edx = code; /* STATE_SAVE/STATE_LOAD */
280 err = vm86_datacall(0x10, &vmf, (char *)p, size,
281 &vmf.vmf_es, &vmf.vmf_bx);
282 return ((err != 0) || (vmf.vmf_eax != 0x4f));
283}
284
285static int
286translate_flags(u_int16_t vflags)
287{
288 static struct {
289 u_int16_t mask;
290 int set;
291 int reset;
292 } ftable[] = {
293 { V_MODECOLOR, V_INFO_COLOR, 0 },
294 { V_MODEGRAPHICS, V_INFO_GRAPHICS, 0 },
295 { V_MODELFB, V_INFO_LENEAR, 0 },

--- 72 unchanged lines hidden (view full) ---

368 vesa_vmode[modes].vi_cheight = vmode.v_cheight;
369 vesa_vmode[modes].vi_window = (u_int)vmode.v_waseg << 4;
370 /* XXX window B */
371 vesa_vmode[modes].vi_window_size = vmode.v_wsize;
372 vesa_vmode[modes].vi_window_gran = vmode.v_wgran;
373 vesa_vmode[modes].vi_buffer = vmode.v_lfb;
374 vesa_vmode[modes].vi_buffer_size = vmode.v_offscreen;
375 /* pixel format, memory model... */
376 vesa_vmode[modes].vi_flags = translate_flags(vmode.v_modeattr)
377 | V_INFO_VESA;
378 ++modes;
379 }
380 vesa_vmode[modes].vi_mode = EOT;
381 if (bootverbose)
382 printf("VESA: %d mode(s) found\n", modes);
383
384 has_vesa_bios = TRUE;
385 return 0;
386}
387
388static void
389clear_modes(video_info_t *info, int color)
390{
391 while (info->vi_mode != EOT) {
392 if ((info->vi_flags & V_INFO_COLOR) != color)
393 info->vi_mode = NA;
394 ++info;
395 }
396}
397

--- 29 unchanged lines hidden (view full) ---

427{
428 int i;
429
430 if ((*prevvidsw.get_info)(ad, mode, info) == 0)
431 return 0;
432
433 if (ad != vesa_adp->va_index)
434 return 1;
435 for (i = 0; vesa_vmode[i].vi_mode != EOT; ++i) {
436 if (vesa_vmode[i].vi_mode == NA)
437 continue;
438 if (vesa_vmode[i].vi_mode == mode) {
439 *info = vesa_vmode[i];
440 return 0;
441 }
442 }

--- 42 unchanged lines hidden (view full) ---

485vesa_set_mode(int ad, int mode)
486{
487 video_info_t info;
488 size_t len;
489
490 if (ad != vesa_adp->va_index)
491 return (*prevvidsw.set_mode)(ad, mode);
492
493#ifdef SC_VIDEO_DEBUG
494 printf("VESA: set_mode(): %d(%x) -> %d(%x)\n",
495 vesa_adp->va_mode, vesa_adp->va_mode, mode, mode);
496#endif
497 /*
498 * If the current mode is a VESA mode and the new mode is not,
499 * restore the state of the adapter first, so that non-standard,
500 * extended SVGA registers are set to the state compatible with

--- 191 unchanged lines hidden (view full) ---

692
693static int
694vesa_diag(int level)
695{
696 struct vesa_mode vmode;
697 u_int32_t p;
698 int i;
699
700 /* general adapter information */
701 printf("VESA: v%d.%d, %dk memory, flags:0x%x, mode table:%p (%x)\n",
702 ((vesa_adp_info->v_version & 0xf000) >> 12) * 10
703 + ((vesa_adp_info->v_version & 0x0f00) >> 8),
704 ((vesa_adp_info->v_version & 0x00f0) >> 4) * 10
705 + (vesa_adp_info->v_version & 0x000f),
706 vesa_adp_info->v_memsize * 64, vesa_adp_info->v_flags,
707 vesa_vmodetab, vesa_adp_info->v_modetable);

--- 93 unchanged lines hidden (view full) ---

801 return ENXIO;
802
803 if (vesa_bios_init())
804 return ENXIO;
805 vesa_adp->va_flags |= V_ADP_VESA;
806
807 /* remove conflicting modes if we have more than one adapter */
808 if (adapters > 1) {
809 clear_modes(vesa_vmode,
810 (vesa_adp->va_flags & V_ADP_COLOR) ?
811 V_INFO_COLOR : 0);
812 }
813
814#ifdef VESA_MODULE
815 s = spltty();
816#endif
817 if ((error = vesa_load_ioctl()) == 0) {
818 bcopy(&biosvidsw, &prevvidsw, sizeof(prevvidsw));
819 bcopy(&vesavidsw, &biosvidsw, sizeof(vesavidsw));

--- 49 unchanged lines hidden ---