Skip to contentSkip to conversation

MIPS: asm/debug_ll_ns16550.h: add nop in delay slot

PATCH In review Du Huanpeng 2 participants 2 messages Sep 8, 2020 MIPS

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 MIPS: asm/debug_ll_ns16550.h: add nop in delay slot

In the debug_ll_outc_a0 macro, a0 is written to the uart data register many times in a delay slot when the uart is not ready to send data. insert a nop to avoid this.

---
 arch/mips/include/asm/debug_ll_ns16550.h | 1 +
 1 file changed, 1 insertion(+)
arch/mips/include/asm/debug_ll_ns16550.h +1 -0
index df58c4c..cf666d1 100644
@@ -88,6 +88,7 @@ static inline void PUTC_LL(char ch)
 201:	lbu	t1, UART_LSR(t0)	/* get line status */
 	andi	t1, t1, UART_LSR_THRE	/* check for transmitter empty */
 	beqz	t1, 201b			/* try again */
+	nop
 
 	sb	a0, UART_THR(t0)	/* write the character */
 
Signature · 7 lines
2.7.4


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
#1 lore raw

On Tue, 8 Sep 2020 14:25:05 +0800
Du Huanpeng <[email protected]> wrote:

Hi!

Adding nop is not necessary.

Please see full text of debug_ll_outc_a0:

.macro debug_ll_outc_a0
#ifdef CONFIG_DEBUG_LL
.set push
.set reorder <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

la t0, DEBUG_LL_UART_ADDR

201:    lbu     t1, UART_LSR(t0)        /* get line status */
        andi    t1, t1, UART_LSR_THRE   /* check for transmitter empty */
        beqz    t1, 201b                        /* try again */

sb a0, UART_THR(t0) /* write the character */

.set pop
#endif /* CONFIG_DEBUG_LL */
.endm

There is '.set reorder' so assembler has insert nop after beqz automatically.

I have compiled barebox for qemu-malta with DEBUG_LL enabled.

barebox$ mips-linux-gnu-objdump -D arch/mips/boards/qemu-malta/lowlevel.pbl.o | grep -A 10 "_nmon_outc_a0>:$"

00000314 <_nmon_outc_a0>:
314: 3c08b800 lui t0,0xb800
318: 350803f8 ori t0,t0,0x3f8
31c: 91090005 lbu t1,5(t0)
320: 31290020 andi t1,t1,0x20
324: 1120fffd beqz t1,31c <_nmon_outc_a0+0x8>
328: 00000000 nop <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
32c: a1040000 sb a0,0(t0)
330: 03e00008 jr ra
334: 00000000 nop

Quoted 29 lines

In the debug_ll_outc_a0 macro, a0 is written to the uart data register many times in a delay slot when the uart is not ready to send data. insert a nop to avoid this.

---
 arch/mips/include/asm/debug_ll_ns16550.h | 1 +
 1 file changed, 1 insertion(+)
arch/mips/include/asm/debug_ll_ns16550.h +1 -0
index df58c4c..cf666d1 100644
@@ -88,6 +88,7 @@ static inline void PUTC_LL(char ch)
 201:	lbu	t1, UART_LSR(t0)	/* get line status */
 	andi	t1, t1, UART_LSR_THRE	/* check for transmitter empty */
 	beqz	t1, 201b			/* try again */
+	nop
 
 	sb	a0, UART_THR(t0)	/* write the character */
 
Signature · 7 lines
2.7.4


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
Signature · 7 lines
Best regards,
  Antony Pavlov

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox