diff --git a/src/arch/i386/firmware/pcbios/bios_console.c b/src/arch/i386/firmware/pcbios/bios_console.c index 55ab21bb..1ecd07dd 100644 --- a/src/arch/i386/firmware/pcbios/bios_console.c +++ b/src/arch/i386/firmware/pcbios/bios_console.c @@ -22,6 +22,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include +#include #define ATTR_BOLD 0x08 @@ -228,6 +229,22 @@ static const char * scancode_to_ansi_seq ( unsigned int scancode ) { return NULL; } +/** + * Map a key + * + * @v character Character read from console + * @ret character Mapped character + */ +static int bios_keymap ( unsigned int character ) { + struct key_mapping *mapping; + + for_each_table_entry ( mapping, KEYMAP ) { + if ( mapping->from == character ) + return mapping->to; + } + return character; +} + /** * Get character from BIOS console * @@ -251,9 +268,9 @@ static int bios_getchar ( void ) { : "=a" ( keypress ) : "a" ( 0x1000 ) ); character = ( keypress & 0xff ); - /* If it's a normal character, just return it */ + /* If it's a normal character, just map and return it */ if ( character && ( character < 0x80 ) ) - return character; + return bios_keymap ( character ); /* Otherwise, check for a special key that we know about */ if ( ( ansi_seq = scancode_to_ansi_seq ( keypress >> 8 ) ) ) { diff --git a/src/include/ipxe/keymap.h b/src/include/ipxe/keymap.h new file mode 100644 index 00000000..9ac42a6b --- /dev/null +++ b/src/include/ipxe/keymap.h @@ -0,0 +1,30 @@ +#ifndef _IPXE_KEYMAP_H +#define _IPXE_KEYMAP_H + +/** + * @file + * + * Keyboard mappings + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include +#include + +/** A keyboard mapping */ +struct key_mapping { + /** Character read from keyboard */ + uint8_t from; + /** Character to be used instead */ + uint8_t to; +} __attribute__ (( packed )); + +/** Keyboard mapping table */ +#define KEYMAP __table ( struct key_mapping, "keymap" ) + +/** Define a keyboard mapping */ +#define __keymap __table_entry ( KEYMAP, 01 ) + +#endif /* _IPXE_KEYMAP_H */