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:
Furquan Shaikh 2014-08-25 15:06:18 -07:00 committed by Patrick Georgi
parent 7aebf3269a
commit 8dd4f98222
1 changed files with 32 additions and 0 deletions

View File

@ -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;
}