Project Home
Project Home
Documents
Documents
Wiki
Wiki
Discussion Forums
Discussions
Project Information
Project Info
Forum Topic - cpu_pte_split() problem in QNX procnto.: (2 Items)
   
cpu_pte_split() problem in QNX procnto.  
Dear QNX-OSTech,

We are working on ARM based platform. While the procnto starts running we are seeing a hard crash. Please check the 
below call stack.
It is appearing like there is some problem while preparing a Page Table entry by making pte split, which was called by 
mmap().
In our case we are trying to allocate 1560 bytes memory, for that  it is trying to split a 10MB space and create pte 
entry . Please find the MMU entries below.
From the trace messages Mmap() is trying to map the physical address paddr = 0x80C36000, to vaddr = 0x78000000.
To  allocate the physical address 0x80C36000 from the MMU table entries ,it is observed that the 10MB+ has to be split.

we found similar issue at  http://community.qnx.com/sf/go/projects.core_os/discussion.newcode.topc3141

Please suggest /provide some solution.

CallStack

__hardcrash(asm)

exception
cpu_pte_split(
    vaddr = 0x78000000,
    data = 0xE8AFBBE0 = BUILDENV_qss+0x0E8AFBBDF -> (
      paddr = 0x80C36000,
      adp = 0xE8CDF49C = BUILDENV_qss+0x0E8CDF49B,
      start = 0x78000000,
      end = 0x78001FFF,
      split_end = 0x78001FFF,
      first = 0x78000000,
      prot = 0x0561,
      op = 0x81,
      special = 0x0,
      shmem_flags = 0x00030002))
  flags = 0x8
  r = 0x78000000
  va = 0x78000000
  asid = 0x2
  pte = 0xFFBF0780 = end+0x1B1E058 -> 0xC0C0C0C0
  ptp = 0xFFFF3E00 = end+0x1F216D8 -> 0xC0C0C0C0

do_manipulation(
    manip = 0xE8AFBBE0 = BUILDENV_qss+0x0E8AFBBDF -> (
     data = (paddr = 0x80C36000, adp = 0xE8CDF49C = BUILDENV_qss+0x0E8CDF49B, start = 0x78000000, end =
      state = 0x0,
      mapped = 0x78000000))

ker_manipulate(
    data = 0xE8AFBBE0 = BUILDENV_qss+0x0E8AFBBDF -> )

ker_ring0(
  ?,
  ?)


MMU page table

_________address_____________|_physical____________________|sec|_d_|_size____|_permissions____________________|_glb|_shr
|_pageflags_(
    C:0002:00000000--DFFFFFFF|                             |   |   |         |                                |    |    
|
    C:0002:E0000000--E8CFFFFF|      A:00:80200000--88EFFFFF| ns| 00| 00100000| P:readwrite U:noaccess  exec   | yes| no 
| strongly or
    C:0002:E8D00000--FC3FFFFF|                             |   |   |         |                                |    |    
|
    C:0002:FC400000--FC403FFF|      A:00:80CD4000--80CD7FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC404000--FC404FFF|      A:00:80CDC000--80CDCFFF| ns| 00| 00001000| P:readwrite U:readonly  exec   | yes| no 
| strongly or
    C:0002:FC405000--FC405FFF|      A:00:0209A000--0209AFFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC406000--FC408FFF|      A:00:02000000--02002FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC409000--FC40BFFF|      A:00:02000000--02002FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC40C000--FC40EFFF|      A:00:02000000--02002FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC40F000--FC411FFF|      A:00:02000000--02002FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC412000--FC413FFF|      A:00:00800000--00801FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC414000--FC414FFF|      A:00:2A03F000--2A03FFFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC415000--FC416FFF|      A:00:00800000--00801FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC417000--FC417FFF|      A:00:2A03F000--2A03FFFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC418000--FC418FFF|      A:00:02000000--02000FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| no 
| strongly or
    C:0002:FC419000--FC41AFFF|      A:00:00800000--00801FFF| ns| 00| 00001000|...
View Full Message
Re: cpu_pte_split() problem in QNX procnto.  
A crash in cpu_pte_manipulate typically means that an L2 table
is not mapped - the code checks whether there is a valid L1
entry for the address range, and if so, expects that there is
an L2 table allocated. The L2 tables are mapped within a sparse
4MB space where 4K of tables should be mapped for each 4MB area
that is covered by valid L1 entries. The code will crash if the
mapping in that region is not present.

What OS version and cpu target are you using?
Is this the first user address space that has been created?

	Sunil.

On 12-03-08 5:59 AM, ravinder are wrote:
> Dear QNX-OSTech,
>
> We are working on ARM based platform. While the procnto starts running we are seeing a hard crash. Please check the 
below call stack.
> It is appearing like there is some problem while preparing a Page Table entry by making pte split, which was called by
 mmap().
> In our case we are trying to allocate 1560 bytes memory, for that  it is trying to split a 10MB space and create pte 
entry . Please find the MMU entries below.
>  From the trace messages Mmap() is trying to map the physical address paddr = 0x80C36000, to vaddr = 0x78000000.
> To  allocate the physical address 0x80C36000 from the MMU table entries ,it is observed that the 10MB+ has to be split
.
>
> we found similar issue at  http://community.qnx.com/sf/go/projects.core_os/discussion.newcode.topc3141
>
> Please suggest /provide some solution.
>
> CallStack
>
> __hardcrash(asm)
>
> exception
> cpu_pte_split(
>      vaddr = 0x78000000,
>      data = 0xE8AFBBE0 = BUILDENV_qss+0x0E8AFBBDF ->  (
>        paddr = 0x80C36000,
>        adp = 0xE8CDF49C = BUILDENV_qss+0x0E8CDF49B,
>        start = 0x78000000,
>        end = 0x78001FFF,
>        split_end = 0x78001FFF,
>        first = 0x78000000,
>        prot = 0x0561,
>        op = 0x81,
>        special = 0x0,
>        shmem_flags = 0x00030002))
>    flags = 0x8
>    r = 0x78000000
>    va = 0x78000000
>    asid = 0x2
>    pte = 0xFFBF0780 = end+0x1B1E058 ->  0xC0C0C0C0
>    ptp = 0xFFFF3E00 = end+0x1F216D8 ->  0xC0C0C0C0
>
> do_manipulation(
>      manip = 0xE8AFBBE0 = BUILDENV_qss+0x0E8AFBBDF ->  (
>       data = (paddr = 0x80C36000, adp = 0xE8CDF49C = BUILDENV_qss+0x0E8CDF49B, start = 0x78000000, end =
>        state = 0x0,
>        mapped = 0x78000000))
>
> ker_manipulate(
>      data = 0xE8AFBBE0 = BUILDENV_qss+0x0E8AFBBDF ->  )
>
> ker_ring0(
>    ?,
>    ?)
>
>
> MMU page table
>
> _________address_____________|_physical____________________|sec|_d_|_size____|_permissions____________________|_glb|
_shr|_pageflags_(
>      C:0002:00000000--DFFFFFFF|                             |   |   |         |                                |    | 
   |
>      C:0002:E0000000--E8CFFFFF|      A:00:80200000--88EFFFFF| ns| 00| 00100000| P:readwrite U:noaccess  exec   | yes| 
no | strongly or
>      C:0002:E8D00000--FC3FFFFF|                             |   |   |         |                                |    | 
   |
>      C:0002:FC400000--FC403FFF|      A:00:80CD4000--80CD7FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| 
no | strongly or
>      C:0002:FC404000--FC404FFF|      A:00:80CDC000--80CDCFFF| ns| 00| 00001000| P:readwrite U:readonly  exec   | yes| 
no | strongly or
>      C:0002:FC405000--FC405FFF|      A:00:0209A000--0209AFFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| 
no | strongly or
>      C:0002:FC406000--FC408FFF|      A:00:02000000--02002FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| 
no | strongly or
>      C:0002:FC409000--FC40BFFF|      A:00:02000000--02002FFF| ns| 00| 00001000| P:readwrite U:noaccess  notexec| yes| 
no | strongly or
>      C:0002:FC40C000--FC40EFFF|      A:00:02000000--02002FFF| ns| 00| 00001000| P:readwrite...
View Full Message