On Thu, 27 Feb, at 12:09:21PM, H. Peter Anvin wrote: > > That being said, is there a reason we can't simply write this as: > > efi_system_table_##bits##_t table; > > /* ... */ > > func = (typeof(func))(unsigned long)table->con_out; > c->text_output = *func; Oh, yeah that's much better. I was being overly cautious with trying to not dereference the pointers in the regular efi_system_table_t, and what you've written is much more compact both in terms of C and generated object code. Things end up looking like this, --- #define BOOT_SERVICES(bits) \ static void setup_boot_services##bits(struct efi_config *c) \ { \ efi_system_table_##bits##_t *table; \ efi_boot_services_##bits##_t *bt; \ \ table = (typeof(table))sys_table; \ \ c->text_output = table->con_out; \ \ bt = (typeof(bt))(unsigned long)(table->boottime); \ \ c->allocate_pool = bt->allocate_pool; \ c->allocate_pages = bt->allocate_pages; \ c->get_memory_map = bt->get_memory_map; \ c->free_pool = bt->free_pool; \ c->free_pages = bt->free_pages; \ c->locate_handle = bt->locate_handle; \ c->handle_protocol = bt->handle_protocol; \ c->exit_boot_services = bt->exit_boot_services; \ } BOOT_SERVICES(32); BOOT_SERVICES(64); -- Matt Fleming, Intel Open Source Technology Center -- To unsubscribe from this list: send the line "unsubscribe linux-efi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html