[Developer] what does L4_Copy_regs_to_mrs() actually return?
Carl van Schaik
carl at ok-labs.com
Wed Apr 25 12:41:42 EST 2007
Hi Iyad,
Can you make sure that you are calling L4_Copy_regs_to_mrs() on the user
thread and not the Linux kernel thread.
What you are seeing could possibly be a result of that? Also, after the
crash, are the threads still there? Can you try enter the kernel
debugger (CTRL-K) or L4_KDB_Enter("foo") and dump the thread register
state interactively
regards,
Carl
Iyad Q wrote:
> Thanks Hal,
>
> I am considering a different scenario from syscall, actually I working on crashing a process instead. However, I inspected the 1.4.1.1 release you mentioned, and still have same observations:
>
> 1) The UTCB does not contain register information. Per vergs.h MR are the only registers stored within utcb. Am I overlooking something?
>
> 2) The L4_Copy_regs_to_mrs() seems to retrieve incorrect information. Here is how I reached this conclusion. First listing is the user thread registers captured just before a simulated crash. These are the registers I need to retrieve from L4. The second and third listings are the returned register values from the L4_copy... call. Clearly, these values are captured in totally different context from the target thread identified with thread id passed by L4_copy..() Also, note that the values are always the same regardless of the user thread id passed to L4_copy..() Finally, note the sp returned value, it is zero.
>
> As for latest l4 software, i checked perform_exregs() and it seems to get the context in similar fashion as what I have at the moment.
>
> Iyad
>
> User Registers just be a crash
> ===============================
> r0 = 00000000, r1 = 00000000, r2 = 00000000, r3 = 00000000
>
> r4 = 40838800, r5 = 01FF7E84, r6 = 0081EE08, r7 = 000088D8
>
> r8 = 00000001, r9 = 00A311C4, r10= 00A2F000, fp = 01FF7E74
> ip = 01A00000, sp = 01FF7E38, lr = 01FF7DF8, pc = 00008654
>
> cpsr = 60000010
>
> Thread 1 , L4_Copy_regs_to_mrs()
> ================================
> r0 = 00000001, r1 = 00000000, r2 = 00000000, r3 = 095ffc1c
> r4 = 094871a0, r5 = 09856760, r6 = 095ffbd4, r7 = 095ffbd4
> r8 = 098571c8, r9 = 0900066c, r10= 00000000, fp = 095541e0
> ip = 098a5e98, sp = 00000000, lr = 095cdee0, pc = 09467920
> cpsr = 00000020, spsr = 09000660
>
> Thread 2 , L4_Copy_regs_to_mrs()
> ================================
> r0 = 00000001, r1 = 00000000, r2 = 00000000, r3 = 095ffc1c
> r4 = 094871a0, r5 = 09856760, r6 = 095ffbd4, r7 = 095ffbd4
> r8 = 098571c8, r9 = 0900066c, r10= 00000000, fp = 095541e0
> ip = 098a5e98, sp = 00000000, lr = 095cdee0, pc = 09467920
> cpsr = 00000020, spsr = 09000660
>
>
> ----- Original Message ----
> From: Carl van Schaik <carl at ok-labs.com>
> To: Iyad Q <ikq2754 at yahoo.com>
> Cc: kenge-users at ertos.nicta.com.au
> Sent: Monday, April 23, 2007 9:17:59 PM
> Subject: Re: what does L4_Copy_regs_to_mrs() actually return?
>
> Hi Iyad,
>
> The L4_Copy_regs_to_mrs() calls returns the values of a thread stored in
> the threads L4 TCB. On uniprocessor, this should always contain the
> correct state. The only tine somthing different happens is when the
> thread is in the middle of a system call (eg Ipc).
> Note that system calls don't save much state so many of the register
> values won't mean much.
> Note, it seems you are running an old copy of L4/Iguana? In the old
> ertos release, kernel saving user state was very inconsistant. The
> latest OKL4 does much better. About your question re the PC value... it
> is possible for this to be a valid PC, especially if the thread is
> running in a shared library at the time. (eg libc).
>
> Getting and setting the user registers has always been an interesting
> topic since there are many ways to do it. In Wombat, we try avoid doing
> this as much as possible, except for signal handling. We get the user to
> save their own state by jumping the thread to a special piece of code we
> map into the address space. Linux (other than for debug) does not really
> need access to thread registers so we have not had much need for direct
> thread register reading and setting.
>
> So currently we can get user registers with L4_Copy_regs_to_mrs(), but
> not directly set user registers.
> You may want to experiment with adding the equavalent function to set MRs.
>
> regards,
> Carl
>
> Hal:
>
> Oh yeah one other thing, this list is dead and will shortly be discontinued.
> developer at okl4.org is where it's at now.
> https://lists.okl4.org/mailman/listinfo/developer
>
>
>
> Iyad Q wrote:
>
>> Hi,
>>
>> I am trying to work on user thread debugging in linux, and need access to register content of the user space process. I am using L4_Copy_regs_to_mrs(), but it seems to return incorrect information. For example in the listing below note the return values for fp & lr. As for the pc value, it seems that it does not reflect user thread the address range which should be within 0x9000.
>>
>> r0 = 00000000, r1 = 000008e1, r2 = 000008e1, r3 = 000008e1
>> r4 = 095f3da0, r5 = 095f3d6c, r6 = 07dc6274, r7 = 07dc605c
>> r8 = 00000001, r9 = fffff71f, r10= e0011200, fp = 00000000
>> ip = 07f95074, sp = 07ff2780, lr = 00000001, pc = 07f95060
>> cpsr = e0011200, spsr = 00000000
>>
>> My questions at the moment:
>>
>> 1) what is actually returned by the L4_Copy_regs_to_mrs() ?
>> 2) How can I get user threads register values ?
>> 3) How can I set user threads register values ?
>>
>> Thanks,
>> Iyad
>>
>>
>>
>> __________________________________________________
>> Do You Yahoo!?
>> Tired of spam? Yahoo! Mail has the best spam protection around
>> http://mail.yahoo.com
>>
>> _______________________________________________
>> kenge-users mailing list
>> kenge-users at ertos.nicta.com.au
>> https://lists.ertos.nicta.com.au/mailman/listinfo/kenge-users
>>
>>
>
>
>
>
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
>
>
More information about the Developer
mailing list