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: If9a927318b850ec59619d92b1da4dddd0aa09cd1
Signed-off-by: Furquan Shaikh <furquan@google.com>
Reviewed-on: https://chromium-review.googlesource.com/214072
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Tested-by: Furquan Shaikh <furquan@chromium.org>
Commit-Queue: Furquan Shaikh <furquan@chromium.org>
This commit is contained in:
Furquan Shaikh 2014-08-25 15:06:18 -07:00 committed by chrome-internal-fetch
commit 6931236ba2

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