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:
parent
5474eb15ef
commit
b81362a82e
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue