From: Michael Brown Date: Wed, 7 May 2025 13:16:06 +0000 (+0100) Subject: [riscv] Add debug printing of hexadecimal values in libprefix.S X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=12dee2dab2ea6bc619603c2036e6512889813c4c;p=thirdparty%2Fipxe.git [riscv] Add debug printing of hexadecimal values in libprefix.S Add millicode routines to print hexadecimal values (with any number of digits), and macros to print register contents or symbol addresses. Signed-off-by: Michael Brown --- diff --git a/src/arch/riscv/prefix/libprefix.S b/src/arch/riscv/prefix/libprefix.S index 1a2b992d6..7f4e2bc98 100644 --- a/src/arch/riscv/prefix/libprefix.S +++ b/src/arch/riscv/prefix/libprefix.S @@ -77,8 +77,9 @@ print_message: print_message_alt: /* Register usage: * - * t0 - character pointer * a0 - current character + * t0 - alternate link register + * t1 - character pointer * t2 - preserved a0 * t3 - preserved a1 * t4 - preserved a6 @@ -121,6 +122,97 @@ progress_\@: #endif .endm +/***************************************************************************** + * + * Print hexadecimal value to debug console + * + ***************************************************************************** + * + * Print a register value in hexadecimal to the debug console. + * + * This function does not require a valid stack. + * + * Note that the parameters are passed in registers t1 and t2 (rather + * than a0) and all non-temporary registers are preserved. + * + * Parameters: + * + * t1 - Value to print + * t2 - Number of bits to print (must be a multiple of 4) + * + * Returns: none + * + */ + .section ".prefix.print_hex_value", "ax", @progbits + .globl print_hex_value +print_hex_value: + /* Handle alternate link register */ + mv t0, ra +print_hex_value_alt: + /* Register usage: + * + * a0 - current digit / general temporary + * t0 - alternate link register + * t1 - current value + * t2 - digit counter + * t3 - preserved a0 + * t4 - preserved a1 + * t5 - preserved a6 + * t6 - preserved a7 + */ + mv t3, a0 + mv t4, a1 + mv t5, a6 + mv t6, a7 + + /* Skip any unprinted digits */ + li a0, __riscv_xlen + sub a0, a0, t2 + sll t1, t1, a0 + +1: /* Print each digit in turn */ + srli a0, t1, ( __riscv_xlen - 4 ) + addi a0, a0, -10 + bltz a0, 2f + addi a0, a0, ( 'a' - ( '0' + 10 ) ) +2: addi a0, a0, ( '0' + 10 ) + li a7, SBI_DBCN + li a6, SBI_DBCN_WRITE_BYTE + ecall + slli t1, t1, 4 + addi t2, t2, -4 + bgtz t2, 1b + + /* Restore registers and return (via alternate link register) */ + mv a7, t6 + mv a6, t5 + mv a1, t4 + mv a0, t3 + jr t0 + .size print_hex_value, . - print_hex_value + + /* + * Display hexadecimal register value (if debugging is enabled) + */ + .macro print_hex_reg reg, bits=__riscv_xlen +#ifndef NDEBUG + mv t1, \reg + li t2, \bits + jal t0, print_hex_value_alt +#endif + .endm + + /* + * Display hexadecimal symbol address (if debugging is enabled) + */ + .macro print_hex_addr sym +#ifndef NDEBUG + la t1, \sym + li t2, __riscv_xlen + jal t0, print_hex_value_alt +#endif + .endm + /***************************************************************************** * * Apply compressed relocation records