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 <wladislav...@gmail.com>:
> 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  <alexander.k...@data61.csiro.au>:
>> 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  <alexander.k...@data61.csiro.au>:
>>> > 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/devices.h#L15
>>> > https://github.com/seL4/seL4/blob/master/include/plat/exynos5/plat/machine/hardware.h#L26
>>> > https://github.com/seL4/seL4/blob/master/src/arch/arm/32/machine/hardware.c#L51
>>> >
>>> >
>>> >  - 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/BABFFDFD.html
>>> >> it is the DFSR  = 0x7 -> b00111
>>> >> Translation fault, 2nd level.
>>> >>
>>> >>
>>> >> Thanks!
>>> >> - Wladislav Wiebe
>>> >>
>>> >> 2017-01-24 15:42 GMT+01:00 Wladislav Wiebe <wladislav...@gmail.com>:
>>> >> > 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

_______________________________________________
Devel mailing list
Devel@sel4.systems
https://sel4.systems/lists/listinfo/devel

Reply via email to