Subject: help with x86 assembly
To: None <port-xen@netbsd.org>
From: Manuel Bouyer <bouyer@antioche.lip6.fr>
List: port-xen
Date: 12/22/2004 22:40:21
Hi,
I need some help with x86 inline assembly (it's been a while since I wrote
some assembly code, and I've never written any inline assembly, nor
x86 assembly ...)
In xen/stand/xen12load/xenload.c we have:
static int
HYPERVISOR_console_write_pic(const char *str, int count) {
int ret;
__asm__ __volatile__ (
" movl %2,%%ebx ;"
TRAP_INSTR
: "=a" (ret) : "0" (__HYPERVISOR_console_write),
"r" (str), "c" (count)
: "ebx");
return ret;
}
TRAP_INSTR is:
#define TRAP_INSTR int $0x82
In xen2, this has been changed to a __HYPERVISOR_console_io hypercall, which
takes an extra arguent: we now have
HYPERVISOR_console_io(int cmd, int count, char *str)
I tried to remplace the above function with one from include/hypervisor.h:
static int
HYPERVISOR_console_write_pic(int cmd, int count, char *str)
{
int ret;
unsigned long ign1, ign2, ign3;
__asm__ __volatile__ (
TRAP_INSTR
: "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3)
: "0" (__HYPERVISOR_console_io), "1" (cmd), "2" (count), "3" (str)
: "memory" );
return ret;
}
but at compile time I get:
xenload.c: In function `HYPERVISOR_console_write_pic':
xenload.c:86: error: can't find a register in class `BREG' while reloading `asm'
I don't know how to fix this. Could someone please help ?
I also looked at the linux sources, but this part of code is identical.
--
Manuel Bouyer <bouyer@antioche.eu.org>
NetBSD: 26 ans d'experience feront toujours la difference
--