libpayload console: Add check for already existing driver
Add support to check if the driver for console_out or console_in is already present in the list. If console_init is called twice, then the driver might get added twice leading to a loop. BUG=None BRANCH=None TEST=With console_init in libpayload and depthcharge both, there are no console loops seen anymore Change-Id: I9103230dfe88added28c51bff33ea4fa1ab034c1 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 6931236ba2cfa71849973fe41cc340b7d70656ad Original-Change-Id: If9a927318b850ec59619d92b1da4dddd0aa09cd1 Original-Signed-off-by: Furquan Shaikh <furquan@google.com> Original-Reviewed-on: https://chromium-review.googlesource.com/214072 Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org> Original-Tested-by: Furquan Shaikh <furquan@chromium.org> Original-Commit-Queue: Furquan Shaikh <furquan@chromium.org> Reviewed-on: http://review.coreboot.org/8739 Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
parent
7aebf3269a
commit
8dd4f98222
|
@ -35,15 +35,47 @@ struct console_output_driver *console_out;
|
|||
struct console_input_driver *console_in;
|
||||
static console_input_type last_getchar_input_type;
|
||||
|
||||
static int output_driver_exists(struct console_output_driver *out)
|
||||
{
|
||||
struct console_output_driver *head = console_out;
|
||||
|
||||
while (head) {
|
||||
if (head == out)
|
||||
return 1;
|
||||
head = head->next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int input_driver_exists(struct console_input_driver *in)
|
||||
{
|
||||
struct console_input_driver *head = console_in;
|
||||
|
||||
while (head) {
|
||||
if (head == in)
|
||||
return 1;
|
||||
head = head->next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void console_add_output_driver(struct console_output_driver *out)
|
||||
{
|
||||
die_if(!out->putchar && !out->write, "Need at least one output func\n");
|
||||
/* Check if this driver was already added to the console list */
|
||||
if (output_driver_exists(out))
|
||||
return;
|
||||
out->next = console_out;
|
||||
console_out = out;
|
||||
}
|
||||
|
||||
void console_add_input_driver(struct console_input_driver *in)
|
||||
{
|
||||
/* Check if this driver was already added to the console list */
|
||||
if (input_driver_exists(in))
|
||||
return;
|
||||
in->next = console_in;
|
||||
console_in = in;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue