Re: FPU state management in L4Fiasco.OC program
"Mai, Haohui" <[email protected]>
| Newsgroups | gmane.comp.micro-kernel.l4.devel |
|---|---|
| Message-ID | <CAKT8GbugQQDyhcYSaD=Qm5F3owN+LtK_txnPQF3vRC1OZ-xqQA@mail.gmail.com> |
Hi, I forgot to mention that my OS is running simultaneously with L4Linux. In this case, it seems that Thread::transfer_fpu() becomes a no-op -- since the vcpu task for L4Linux has the FPU, but is the owner of FPU, and my OS doesn't. Therefore my OS cannot grant my user-level task the FPU since it doesn't have it. However, my OS can grant the FPU to my user-level task, once I insert an floating-point instruction right before trying to grant my user-level process the FPU. In this case my OS magically becomes the owner of the FPU, and everything works smoothly. What I really don't understand is that how this "magic" works. First, both L4Linux and my OS are started independently by ned: (1) If FPU ownership can only be transferred via exception #7 and IPC, I don't understand why my OS can grab the FPU transparently, simply by executing an floating-point instruction. (2) If there's some transparent way that an process can get an FPU, then I don't understand why my user-level process can't grab the FPU transparently. Maybe this is because that my OS is a non-alien task but my user-level task is an alien? I really appreciate if you can explain it a little bit --- I'm really appreciated if you can share your idea of what would be the correct way of implementing it. ~Haohui On Tue, Apr 10, 2012 at 5:07 PM, Adam Lackorzynski < [email protected]> wrote: > > On Sun Apr 08, 2012 at 17:22:21 -0500, Mai, Haohui wrote: > > I'm writing a new OS kernel atop of L4Fiasco.OC. I'm having some > > difficulties to let my OS support user-level processes that uses > > floating-point instruction. > > > > So far, My OS closely follows L4Linux, it creates a new task for each > > user-level process, and marks as all threads of the task as alien thread > to > > capture all page faults and exceptions. > > > > My OS works fines with page fault and syscalls. However, I'm confused > with > > what I should do with floating-point exception (exception #7), which is > > issued to my kernel at the first time it tries to perform floating-point > > arithmetic. > > > > I tried to return to the user-level process with an empty message ( > > l4_msgtag_t tag = l4_msgtag(0, 0, 0, 0) ), or an empty message with > > L4_MSGTAG_TRANSFER_FPU (l4_msgtag_t tag = l4_msgtag(0, 0, 0, > > L4_MSGTAG_TRANSFER_FPU) ), but I had no luck. > > > > The user-level process immediately calls "int $0x3" and stops. > > > > I read through L4Linux's code and it seems it's doing similar thing, > except > > that it did initialize the FPU state before asking L4 to transfer the FPU > > state to user-level process. > > I do not see anything (obvious) wrong. Can you pinpoint where the int3 > is? > > > > > Adam > -- > Adam [email protected] > Lackorzynski http://os.inf.tu-dresden.de/~adam/ > > _______________________________________________ > l4-hackers mailing list > [email protected] > http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers > _______________________________________________ l4-hackers mailing list [email protected] http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers