Fix hard lockup caused by kbdmux(4) when kbdmux(4), PS/2 keyboard
(atkbd(4)) and PS/2 mouse (psm(4)) are used together. Turns out that atkbd(4) check_char() method may return "true" while read_char() method returns NOKEY. When this happens kbdmux(4) was simply stuck in the dead loop. Avoid dead loop in kbdmux(4) by breaking out of the loop if read_char() method returns NOKEY. It almost seems like a bug in atkkbd(4), atkbd_check_char() calls kbdc_data_ready(), and, the later will return "true" if there are pending data in either kbd or aux queue. However, because both aux and kbd are on the same controller, I'm not sure if this is a bug or feature. Tested by: markus MFC after: 1 day
This commit is contained in:
parent
9945e9d0d9
commit
fd4df69975
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=156010
@ -250,7 +250,7 @@ kbdmux_kbd_event(keyboard_t *kbd, int event, void *arg)
|
||||
while (KBDMUX_CHECK_CHAR(kbd)) {
|
||||
c = KBDMUX_READ_CHAR(kbd, 0);
|
||||
if (c == NOKEY)
|
||||
continue;
|
||||
break;
|
||||
if (c == ERRKEY)
|
||||
continue; /* XXX ring bell */
|
||||
if (!KBD_IS_BUSY(kbd))
|
||||
|
Loading…
Reference in New Issue
Block a user