libpayload-x86: i8042: fix i8042_data_ready_ps2 and i8042_data_ready_aux

keyboard_disconnect was called without keyboard_init being called and in this
case keyboard_havechar returns true because i8042_data_ready_ps2 is
dereferencing uninitialized variable ps2_fifo from within fifo_is_empty causing
keyboard_disconnect to be stuck in this while loop.
while (keyboard_havechar())
    keyboard_getchar();

BUG=b:80299098
TEST=Check if the normal mode path in depthcharge is not causing a hang

Change-Id: I944b4836005c887a2715717dff2df1b5a220818e
Signed-off-by: Hannah Williams <hannah.williams@intel.com>
Reviewed-on: https://review.coreboot.org/26590
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
Hannah Williams 2018-05-27 09:58:25 -07:00 committed by Furquan Shaikh
parent 5474eb15ef
commit b81362a82e
2 changed files with 9 additions and 0 deletions

View File

@ -87,6 +87,8 @@ static void fifo_push(struct fifo *fifo, u8 c)
*/ */
static int fifo_is_empty(struct fifo *fifo) static int fifo_is_empty(struct fifo *fifo)
{ {
if (!fifo)
return 1;
return fifo->tx == fifo->rx; return fifo->tx == fifo->rx;
} }
@ -332,6 +334,8 @@ static void i8042_data_poll(void)
*/ */
u8 i8042_data_ready_ps2(void) u8 i8042_data_ready_ps2(void)
{ {
if (!initialized)
return 0;
i8042_data_poll(); i8042_data_poll();
return !fifo_is_empty(ps2_fifo); return !fifo_is_empty(ps2_fifo);
} }
@ -341,6 +345,8 @@ u8 i8042_data_ready_ps2(void)
*/ */
u8 i8042_data_ready_aux(void) u8 i8042_data_ready_aux(void)
{ {
if (!initialized)
return 0;
i8042_data_poll(); i8042_data_poll();
return !fifo_is_empty(aux_fifo); return !fifo_is_empty(aux_fifo);
} }

View File

@ -324,6 +324,9 @@ void keyboard_disconnect(void)
if (inb(0x64) == 0xFF) if (inb(0x64) == 0xFF)
return; return;
if (!i8042_has_ps2())
return;
/* Empty keyboard buffer */ /* Empty keyboard buffer */
while (keyboard_havechar()) while (keyboard_havechar())
keyboard_getchar(); keyboard_getchar();