
Am Mittwoch, 20. November 2002 15:18 schrieb Daniel Engström:
The i386 can do indirect calls on the ebp register. So we could let the application know the location of the syscall table by providing it in a register on entry. The applications initialization code can then store it in a suitable location (called syscall_table below).
The syscall would than be done like this:
movl $SYSCALL_NR, %eax movl syscall_table, %ebp shll $2, %eax addl %eax, %ebp call *%ebp ret
Exactly, except that I would do it in C:
---------------------------- cut here ---------------------------- /* ** The U-Boot's anchor :-) ** This is an absolute address that is otherwise unused. ** U-boot sets it to contain the address of the syscall ** jumptable, so clients can make calls into U-boot. */ #define UBOOT_ANCHOR 0x.....
struct syscall_jmptbl { int (*j_mon_getc)(void); int (*j_mon_tstc)(void); void (*j_mon_putc)(const char); void (*j_mon_puts)(const char*); void (*j_mon_printf)(const char* fmt, ...); void (*j_mon_install_hdlr)(int, interrupt_handler_t*, void*); void (*j_mon_free_hdlr)(int); void *(*j_mon_malloc)(size_t); void (*j_mon_free)(void*); void (*j_mon_udelay)(unsigned long); unsigned long (*j_mon_get_timer)(unsigned long); };
... in U-BOOT startup:
static struct syscall_jmptbl jmptable;
...
jmptable.j_mon_getc = mon_getc; jmptable.j_mon_tstc = mon_tstc; jmptable.j_mon_putc = mon_putc; jmptable.j_mon_puts = mon_puts; jmptable.j_mon_printf = mon_printf; jmptable.j_mon_install_hdlr = mon_install_hdlr; jmptable.j_mon_free_hdlr = mon_free_hdlr; jmptable.j_mon_malloc = mon_malloc; jmptable.j_mon_free = mon_free; jmptable.j_mon_udelay = mon_udelay; jmptable.j_mon_get_timer= mon_get_timer;
/* publish location of jump table */ *((struct syscall_jmptbl**)UBOOT_ANCHOR) = &jmptable;
....
in client:
struct syscall_jmptbl *tbl;
tbl = *((struct syscall_jmptbl**)UBOOT_ANCHOR);
tbl->j_mon_printf("Hello\n");
... ---------------------------- cut here ----------------------------
This would essentially do the same thing, but it should work on all platforms.
Rob
---------------------------------------------------------------- Robert Kaiser email: rkaiser@sysgo.de SYSGO AG Am Pfaffenstein 14 phone: (49) 6136 9948-762 D-55270 Klein-Winternheim / Germany fax: (49) 6136 9948-10