Hello,

I wanted to observe some debug messages, so I increased the log level from 6 to 7. Otherwise, my configuration matches 'qemu_arm_defconfig'. This resulted in a PREFETCH fault. The backtrace is included below.

My u-boot version is v2021.01. My compiler is arm-none-eabi-gcc 7.3.1 from Debian. I tested qemu 3.1.0 (from Debian) and 5.1.0 (which I built), invoked like this:

qemu-system-arm -machine virt -cpu cortex-a15 -m 2G -bios u-boot/build.qemu_arm/u-boot.bin

I think this is happening because the code has been relocated and the MMU enabled, but the functions pointed to by gd->cur_serial_dev->driver->ops still point to the code in flash:


(gdb) p *((struct dm_serial_ops*)(gd->cur_serial_dev->driver->ops))
$3 = {setbrg = 0x4296c <pl01x_serial_setbrg>, getc = 0x42af0 <pl01x_serial_getc>, putc = 0x42b34 <pl01x_serial_putc>, pending = 0x42b68 <pl01x_serial_pending>, clear = 0x0 <v7_arch_cp15_set_l2aux_ctrl>, getconfig = 0x0 <v7_arch_cp15_set_l2aux_ctrl>, setconfig = 0x0 <v7_arch_cp15_set_l2aux_ctrl>, getinfo = 0x0 <v7_arch_cp15_set_l2aux_ctrl>}


I was able to workaround this behavior by adding

        gd->cur_serial_dev = NULL;

in board_init_r before the post-relocation initialization sequence is executed. Rearranging init_sequence_r so that log_init runs after serial_initialize works too.

I would like to contribute a patch, but I require some guidance. Is there a better way to indicate that log messages should not be output until the driver has been reinitialized by board_init_r? Or is there a better initialization order?


Thanks and best regards,
Zack Marvel


Backtrace:

#0 pl01x_serial_putc (dev=0x401fe180, ch=105 'i') at ../drivers/serial/serial_pl01x.c:316 #1 0xbff73504 in _serial_putc (dev=dev@entry=0x401fe180, ch=<optimized out>) at ../drivers/serial/serial-uclass.c:187 #2 0xbff736a8 in _serial_puts (str=0xbedf0a05 "nitcall: 00017180 (relocated to bff48180)\n", dev=0x401fe180) at ../drivers/serial/serial-uclass.c:194 #3 serial_puts (str=<optimized out>) at ../drivers/serial/serial-uclass.c:271
#4  0xbffb0e30 in printf (fmt=0xbffd0c6a "%s%s") at ../lib/vsprintf.c:805
#5 0xbff58f24 in log_console_emit (ldev=<optimized out>, rec=0xbedf0c44) at ../common/log_console.c:39
#6  0xbff58cc4 in log_dispatch (rec=0xbedf0c3c) at ../common/log.c:218
#7 _log (cat=LOGC_NONE, level=LOGL_DEBUG, file=<optimized out>, line=<optimized out>, func=0xbffbcdb1 "initcall_run_list", fmt=0xbffc0ef3 "initcall: %p (relocated to %p)\n") at ../common/log.c:252 #8 0xbff48388 in initcall_run_list (init_sequence=0xbffe03a0) at ../include/initcall.h:39 #9 board_init_r (new_gd=<optimized out>, dest_addr=<optimized out>) at ../common/board_r.c:928
#10 0xbff327cc in ?? () at ../arch/arm/lib/crt0.S:167

Reply via email to