Adam Lackorzynski <adam <at> os.inf.tu-dresden.de> writes:
On Fri Sep 26, 2014 at 07:22:09 +0000, Zachary wrote:
In cache.h file(..\l4\pkg\l4sys\include\ARCH-arm\cache.h), a piece of
code
is as follows:
l4_cache_op_arm_call(unsigned long op, unsigned long start, unsigned long end) { ...
__asm__ __volatile__ (" <at> l4_cache_op_arm_call(start) \n\t" "mov lr, pc \n\t" "mov pc, %[sc] \n\t" " <at> l4_cache_op_arm_call(end) \n\t" : "=r" (_op), "=r" (_start), "=r" (_end) : [sc] "i" (L4_SYSCALL_MEM_OP), "0" (_op), "1" (_start), "2" (_end) : "cc", "memory", "lr" ); }
My question is whether the code means that PC jumps to the address of L4_SYSCALL_MEM_OP(actual value is -0x00000010)? If it is true, then it
means
the address is 0xFFFFFFF0 ?
Yes.
My second question is whether the address 0xFFFFFFF0 corresponds to the sys_arm_mem_op in the following definition? (..\kernel\fiasco\src\kern\arm\asm_entry.h)
Yes, the syscall table is used to find the function to branch to.
Adam
Thank you, Adam. Based on your reply, I have another question.
As the macro defined in L4Re source code, the branch adress is: L4_SYSCALL_INVOKE 0xFFFFFFF4 L4_SYSCALL_MEM_OP 0xFFFFFFF0
This means the "L4_SYSCALL_INVOKE" is at the higher address.
And in asm_entry.h, the syscall table is: .macro GEN_SYSCALL_TABLE .align 4 .global sys_call_table sys_call_table: ... .word sys_kdb_ke .word sys_ipc_wrapper .word sys_arm_mem_op ... .endm
On the contrary, this table tells me that the "sys_ipc_wrapper" is at the lower address, so, why this happens?
Best, Zacary