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:
parent
87b02a64fa
commit
6931236ba2
1 changed files with 32 additions and 0 deletions
|
|
@ -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…
Add table
Add a link
Reference in a new issue