On Mon, 02 Oct 2006 08:31:10 +0200, [EMAIL PROTECTED] said: > Quoting Hollis Blanchard <[EMAIL PROTECTED]>: > > > On Fri, 2006-09-29 at 08:59 +0200, [EMAIL PROTECTED] wrote: > > > Quoting Hollis Blanchard <[EMAIL PROTECTED]>: > > > > > > > On Thu, 2006-09-28 at 15:45 +0200, [EMAIL PROTECTED] wrote: > > > > > > > > > > if (grub_strcmp (name, "grub_mod_init") == 0) > > > > > mod->init = (void (*) (grub_dl_t)) sym->st_value; > > > > > > > > > > This won't work on ia64 AFAIK. > > > > > > > > Can't this problem be solved with an architecture-specific macro? > > > > > > > > FWIW, 64-bit PowerPC also uses function descriptors. They look something > > > > like: > > > > long code_address > > > > long table_of_contents > > > > long unused > > > > > > > > The table_of_contents (TOC) value needs to be placed into r2 when > > > > jumping at code_address (and of course the old one needs to be restored > > > > when returning). > > > Indeed, same issue. > > > > > > >I assume IA64 is similar here, and given that, a > > > > module_jump function implemented in assembly by each architecture would > > > > solve this problem. > > > I'd prefer modules to export pointers. Seems to be easier to deal. > > > > I don't know what you mean; please elaborate (with pseudo-code if > > possible). > > I'd propose modules export struct grub_dl. This struct contains init and > fini > functions pointers. > Getting the address of a data structure is much more portable. > Dealing with function pointers would be a matter of the relocator.
It looks like this is only done twice in the current code: mod->init and mod->fini. Wouldn't it be easy to do this: --- kern/dl.c 28 May 2006 23:01:43 -0000 1.12 +++ kern/dl.c 3 Oct 2006 02:15:51 -0000 @@ -380,9 +380,9 @@ grub_dl_resolve_symbols (grub_dl_t mod, return grub_errno; if (grub_strcmp (name, "grub_mod_init") == 0) - mod->init = (void (*) (grub_dl_t)) sym->st_value; + mod->init = grub_dl_arch_func (sym->st_value); else if (grub_strcmp (name, "grub_mod_fini") == 0) - mod->fini = (void (*) (void)) sym->st_value; + mod->fini = grub_dl_arch_func (sym->st_value); break; case STT_SECTION: -Hollis _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel