mirror of
https://github.com/ipxe/ipxe
synced 2025-12-23 21:41:43 +03:00
[serial] Check for UART existence in uart_select()
Check for existence of the UART in uart_select(), not just in uart_init(). This allows uart_select() to refuse to set a non-working address in uart->base, which in turns means that the serial console code will not attempt to use a non-existent UART. Reported-by: Torgeir Wulfsberg <Torgeir.Wulfsberg@kongsberg.com> Reported-by: Ján ONDREJ (SAL) <ondrejj@salstar.sk> Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -48,15 +48,22 @@ static uint16_t uart_base[] = {
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int uart_select ( struct uart *uart, unsigned int port ) {
|
||||
|
||||
/* Clear UART base */
|
||||
uart->base = NULL;
|
||||
int rc;
|
||||
|
||||
/* Set new UART base */
|
||||
if ( port < ( sizeof ( uart_base ) / sizeof ( uart_base[0] ) ) ) {
|
||||
uart->base = ( ( void * ) ( intptr_t ) uart_base[port] );
|
||||
return 0;
|
||||
} else {
|
||||
return -ENODEV;
|
||||
if ( port >= ( sizeof ( uart_base ) / sizeof ( uart_base[0] ) ) ) {
|
||||
rc = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
uart->base = ( ( void * ) ( intptr_t ) uart_base[port] );
|
||||
|
||||
/* Check that UART exists */
|
||||
if ( ( rc = uart_exists ( uart ) ) != 0 )
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
uart->base = NULL;
|
||||
return rc;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user