Padajici vga aplikace

peak na kerberos.troja.mff.cuni.cz peak na kerberos.troja.mff.cuni.cz
Úterý Srpen 12 11:38:06 CEST 1997


On Fri, 1 Aug 1997, Hynek Med wrote:

> Od jiste doby mi pada dosemu, kdyz spustim v dosu nejakou aplikaci, ktera
> pouziva nejaky graficky SVGA mod. 
> 
> ERROR: cpu exception in dosemu code outside of VM86()!
> trapno: 0x0d  errorcode: 0x00000000  cr2: 0x00000000
> eip: 0x401324a3  esp: 0xbffffafc  eflags: 0x00010612
       ^^^^^^^^^^
> cs: 0x0023  ds: 0x002b  es: 0x002b  ss: 0x002b
> General protection exception
> GDT selector: 0x0000
> Exception was caused by DOSEMU
> ERROR: timed/signalled out in leavedos()
> 
> Horsi je, ze se zablokuje klavesnice a s pocitacem nelze nic delat.. Totez
> mi dela i SVGA doom. ZGV funguje dobre. Tak nevim. Vite nekdo?

to je zajimave, ze to zhebne v nejake knihovne
pro zacatek bych zjistil, ve ktere (a v jake funkci, bude-li mozno) 

jinak co se tyce blokovani klavesnice, tak doporucuji opatchovat
linux/drivers/char/keyboard.c, aby se dal vypnout raw-mode klavesnice;
pro zajimavost nize uvadim reseni, co pouzivam ja (ktere zresetuje jak
klavesnici tak videomod a souvisejici veci, takze dostanu pouzitelnou
konzoli; spolehlive usmrti Xserver, dosemu i programy pouzivajici svgalib)
ach jo, s GGI by to bylo jednodussi...

--Pavel Kankovsky aka Peak (troja.mff.cuni.cz network administration)

Priloha 1: patch pro keyboard.c (testovano s kernelem 2.0.28)

--- keyboard.c.orig	Sat Nov 16 14:24:32 1996
+++ keyboard.c	Sat Aug  9 12:43:15 1997
@@ -501,15 +501,40 @@
 	} else
  		rep = set_bit(keycode, key_down);
 
-	if (raw_mode)
-		return;
-
 	if (kbd->kbdmode == VC_MEDIUMRAW) {
 		/* soon keycodes will require more than one byte */
  		put_queue(keycode + up_flag);
-		return;
+		raw_mode = 1;
  	}
 
+	if (test_bit(56, key_down) /* LAlt */ &&
+	    test_bit(29, key_down) /* LCtrl */ &&
+	    !up_flag)
+	{
+		if (keycode == E0_BREAK /* Break = Ctrl+Pause */) {
+			struct vt_struct *fg_vt = vt_cons[fg_console];
+			if (tty && tty->pgrp > 0)
+				kill_pg(tty->pgrp, SIGINT, 1);
+			if (!fg_vt) {
+				printk(KERN_ERR "no fg console, wierdo");
+				return;
+			}
+			if (fg_vt->vt_mode.mode == VT_PROCESS)
+				kill_proc(fg_vt->vt_pid, SIGKILL, 1);
+			reset_vc(fg_console);
+			/* ask init to do user-mode stuff */
+			spawn_console();
+			return;
+		} else
+		if (keycode == E0_DEL /* Del */) {
+			ctrl_alt_del();
+			return;
+		}
+	}
+
+	if (raw_mode)
+		return;
+ 
  	/*
 	 * Small change in philosophy: earlier we defined repetition by
 	 *	 rep = keycode == prev_keycode;

Priloha 2: /usr/local/bin/vcreset

#!/bin/sh

INVOKE=

if [ "$1" = "-d" ]; then
	INVOKE='open -ws --'
fi

case "`stty size`" in
'50 80')
	MODE=80x50
	FONT=default8x8
	;;
'25 80')
	MODE=80x25
	FONT=default8x16
	;;
*)
	echo "$0: warning: unknown screen size"
	MODE=80x25
	FONT=default8x16
	;;
esac

$INVOKE sh -c "
restoretextmode -r /usr/lib/kbd/videomodes/${MODE}
setfont /usr/lib/kbd/consolefonts/${FONT}
restorepalette
"

reset -IQ

Priloha 3: neco do /etc/inittab

# reset vc state
kr::kbrequest:/usr/local/bin/vcreset -d </dev/console >/dev/console 2>&1



Další informace o konferenci Linux