Hi Alex,
when configuring the device like:
devices.h
#define UART0_PPTR 0xfff01c00
#define UART0_PADDR 0x02530000
hardware.h
UART0_PADDR,
UART0_PPTR,
io.c
putDebugChar(unsigned char c)
{
if (status_activate_global_pd) {
while ((*UART_REG(ULSR, (UART0_PPTR)) & ULSR_THRE) == 0);
*UART_REG(UTHR,(UART0_PPTR)) = c;
} else {
while ((*UART_REG(ULSR, (UART0_PADDR + 0xc00)) & ULSR_THRE) == 0);
*UART_REG(UTHR,(UART0_PADDR + 0xc00)) = c;
}
}
I can the the kernel successfully booting, but there is pretty early
an crash in the userspace - memset():
seL4test/libs/libmuslc/src/string/memset.c:14
14930: e5431001 strb r1, [r3, #-1]
So, I am still not sure if the device is correctly configured?
ELF-loader started on CPU: ARM Ltd. Cortex-A15 r2p4
paddr=[c0008000..c049441f]
ELF-loading image 'kernel'
paddr=[81000000..8102efff]
vaddr=[e0000000..e002efff]
virt_entry=e0000000
ELF-loading image 'sel4test-driver'
paddr=[8102f000..81411fff]
vaddr=[10000..3f2fff]
virt_entry=1e8d4
Enabling MMU and paging
Jumping to kernel-image entry point...
Bootstrapping kernel
Caught cap fault in send phase at address 0x0
while trying to handle:
vm fault on data at address 0xdf7fefff with status 0x805
in thread 0xffdfad00 "sel4test-driver" at address 0x14930
With stack:
0x2f2278: 0x7
0x2f227c: 0x1
0x2f2280: 0x2f22d0
0x2f2284: 0x2f2290
0x2f2288: 0x2d9ea4
0x2f228c: 0xdf7fe000
0x2f2290: 0x1
0x2f2294: 0x443
0x2f2298: 0x2dda68
0x2f229c: 0x5
0x2f22a0: 0xc
0x2f22a4: 0x0
0x2f22a8: 0x2d9ea4
0x2f22ac: 0x4f
0x2f22b0: 0x0
0x2f22b4: 0x1ba40
Thanks in advance!
- Wladi
2017-01-27 21:52 GMT+01:00
Hi Wladi,
The addresses must be aligned to the size of the frame to be mapped. For a small page, it must be aligned to 0x1000. This is a requirement of the ARM hardware rather than the seL4 kernel.
The simple workaround is to add an additional offset to the mapped address. You can see how the issue was solved for imx6: https://github.com/seL4/seL4/blob/master/include/plat/imx6/plat/machine/devi...
- Alex
On Fri, 2017-01-27 at 16:40 +0100, Wladislav Wiebe wrote:
Hello,
I wonder how to map a device to the kernel where the first 3 bytes are not 0. Like the UART device which is phyically connected to 0x02530c00.
The abort handler in pte_pte_small_new() get called when the first 3 bytes are not 0 (on this SoC are the first 3 bytes for the UART c00).
Any advice how to deal with this?
Thanks in advance! - Wladi
2017-01-25 22:22 GMT+01:00 Wladislav Wiebe
: Hi Alex,
A trick that I use to overcome this problem is to introduce a global variable that reflects the status of the PD. The UART driver then switches between the physical and virtual address of the UART as required.
that's it - seems before kernel activates the PD, Kernel might run into assertion which wants to print. I've changed the UART driver like --- a/src/plat/keystone/machine/io.c +++ b/src/plat/keystone/machine/io.c @@ -18,14 +18,19 @@ #define ULSR 0x14 /* UART Line Status Register */ #define ULSR_THRE BIT(5) /* Transmit Holding Register Empty */
-#define UART_REG(x) ((volatile uint32_t *)(UART0_PPTR + (x))) +#define UART_REG(x,uart_addr) ((volatile uint32_t *)(uart_addr + (x)))
#if defined(CONFIG_PRINTING) || defined(CONFIG_DEBUG_BUILD) void putDebugChar(unsigned char c) { - while ((*UART_REG(ULSR) & ULSR_THRE) == 0); - *UART_REG(UTHR) = c; + if (status_activate_global_pd) { + while ((*UART_REG(ULSR, UART0_PPTR) & ULSR_THRE) == 0); + *UART_REG(UTHR,UART0_PPTR) = c; + } else { + while ((*UART_REG(ULSR, UART0_PADDR) & ULSR_THRE) == 0); + *UART_REG(UTHR,UART0_PADDR) = c; + } } #endif
When running the machine now, I am at least able to see the assertion .. ELF-loader started on CPU: ARM Ltd. Cortex-A15 r2p4 paddr=[90000000..9048841f] ELF-loading image 'kernel' paddr=[80000000..8002ffff] vaddr=[e0000000..e002ffff] virt_entry=e0000000 ELF-loading image 'sel4test-driver' paddr=[80030000..80411fff] vaddr=[10000..3f1fff] virt_entry=1e920 Enabling MMU and paging Jumping to kernel-image entry point...
seL4 failed assertion '(address & ~0xfffff000ul) == ((0 && (address & (1ul << 31))) ? 0x0 : 0)' at ./arch/object/structures_gen.h:2495 in function pte_pte_small_new halting...
Thanks! - Wladi
2017-01-25 1:10 GMT+01:00
: Hi Wladislav,
If the fault occurs before the activation of the kernel PD, this likely means that you are trying to printf before the UART is mapped.
If you are using printf for debugging before the PD is activated, you will need to change your kernel UART driver to use the physical address of the peripheral (the elfloader sets up unity mappings for 0x00000000-0xe0000000).
A trick that I use to overcome this problem is to introduce a global variable that reflects the status of the PD. The UART driver then switches between the physical and virtual address of the UART as required.
- Alex
On Tue, 2017-01-24 at 23:55 +0100, Wladislav Wiebe wrote:
Hi Alex,
thanks for pointing that out - I will double check the device mapping.
- Wladislav Wiebe
2017-01-24 23:24 GMT+01:00
: A "Synchronous Data abort" occurs when a virtual memory translation fails on load/store operations. A "Prefetch abort" occurs when a virtual memory translation fails when loading instructions into the CPU pipeline. An "Asynchronous Data abort" occurs when a physical memory translation fails (ie, no RAM or peripheral is mapped to the physical address)
The address of the fault corresponds to a kernel device mapping. My guess is that you are not mapping kernel devices correctly at boot time: https://github.com/seL4/seL4/blob/master/include/plat/exynos5/plat/machine/d... https://github.com/seL4/seL4/blob/master/include/plat/exynos5/plat/machine/h... https://github.com/seL4/seL4/blob/master/src/arch/arm/32/machine/hardware.c#...
- Alex
On Tue, 2017-01-24 at 17:17 +0100, Wladislav Wiebe wrote: > could it be an TLB fault? For my understandig, based on > http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0438g/BABFFDF... > it is the DFSR = 0x7 -> b00111 > Translation fault, 2nd level. > > > Thanks! > - Wladislav Wiebe > > 2017-01-24 15:42 GMT+01:00 Wladislav Wiebe
: > > Hello, > > > > has somebody experience with running into arm_data_abort_exception > > after enabling the MMU/paging and jumping to the kernel image: > > .. > > ELF-loader started on CPU: ARM Ltd. Cortex-A15 r2p4 > > paddr=[90000000..904b041f] > > ELF-loading image 'kernel' > > paddr=[80000000..80033fff] > > vaddr=[f0000000..f0033fff] > > virt_entry=f0000000 > > ELF-loading image 'sel4test-driver' > > paddr=[80034000..8042dfff] > > vaddr=[10000..409fff] > > virt_entry=1e924 > > Enabling MMU and paging > > Jumping to kernel-image entry point... > > > > check_data_abort_exception() > > DFAR = 0xfff01014 > > DFSR = 0x7 > > ADFSR = 0x0 > > abort() called. > > > > I've dumped the DFAR/DFSR register -- > > > > Relevant config parts about the setup: > > CONFIG_ARCH_ARM_V7A=y > > CONFIG_ARCH_ARM=y > > CONFIG_ARCH_AARCH32=y > > CONFIG_ARM_CORTEX_A15=y > > CONFIG_PLAT_KEYSTONE=y > > > > > > Thanks in advance! > > -- > > WBR, Wladislav WIebe > > > -- WBR, Wladislav WIebe
-- WBR, Wladislav WIebe