|
From: | Antonio Ricci |
Subject: | Re: [Qemu-devel] question about syscall |
Date: | Mon, 9 Feb 2009 20:23:22 +0100 |
/****************************************************/I can't understand why I have to intercept the case 0xcd. Can you explain me?
a piece of code handling interrupt in translate.c:
case 0xcd: /* int N */
val = ldub_code(s->pc++);
/* asia: start */
if (val == 0x80){
gen_op_handle_syscall();
break;
}
if (s->vm86 && s->iopl != 3) {
gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base);
} else {
gen_interrupt(s, val, pc_start - s->cs_base, s->pc - s->cs_base);
}
break;
/*********************************************************/
Hi
I assume you ask about full system emulation. Try to check how Qemu
On Sat, Feb 7, 2009 at 8:15 PM, Antonio Ricci <address@hidden> wrote:
> Hi all,
> i'd want to understand how Qemu handles system calls while executing both
> Linux and Windows operating system. I've searched on the web with no
> results.
> Do you know if there is some documentation about syscall handling in Qemu?
> Thanks in advance for help
intercept int 80h or SYSENTER/SYSCALL instruction (if the guest OS is
Linux). Not sure what Windows does when doing system call, maybe by
executing int instruction toward certain vectors too.
As usual, related interrupt handler will be executed (and translated).
So from Qemu point of view, it's strictly a matter of intercepting
code and translating it. It's the guest OS that does the real work on
syscall handling.
In user space emulation only, system call is intercepted by the normal
dynamic code translation, but syscall is handled by syscall() C
function. The complication could arise if the guest OS is not the same
type as the host OS. Some "interpretations" are needed here.
regards,
Mulyadi.
[Prev in Thread] | Current Thread | [Next in Thread] |