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