From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1LXCLT-0008R4-Td for mharc-grub-devel@gnu.org; Wed, 11 Feb 2009 05:29:31 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LXCLR-0008Pf-Un for grub-devel@gnu.org; Wed, 11 Feb 2009 05:29:29 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LXCLR-0008OO-3Q for grub-devel@gnu.org; Wed, 11 Feb 2009 05:29:29 -0500 Received: from [199.232.76.173] (port=42668 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LXCLQ-0008O5-NL for grub-devel@gnu.org; Wed, 11 Feb 2009 05:29:28 -0500 Received: from fg-out-1718.google.com ([72.14.220.158]:39219) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LXCLP-0006yX-GX for grub-devel@gnu.org; Wed, 11 Feb 2009 05:29:28 -0500 Received: by fg-out-1718.google.com with SMTP id l27so38097fgb.30 for ; Wed, 11 Feb 2009 02:29:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from :user-agent:mime-version:to:subject:content-type; bh=DNnISW6eZtG71E3YxaFH6j89ScSQFlbwYC4Hwj4+POs=; b=XAuOzM4HYgtB14E802jOv7NlIuuDDiPSByrkezW42sYKsnKt4weAKMK2xz4tqAF5Nn hei1OJiPtAhCbtesh7AlzQQHdmaFG2ZgF3FU/z2b9eWFDGds8hYlDWBMCXDrI/hCfV6B 9LMzkRncnl7o6mqJ3VPZSNzQthZeArhvQELxo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject :content-type; b=AkRkpwkoeU34z5LtbxVfAACaWlFcqtjQlt0lI+w2MS2DRxiS166VoL6r9p9jaWVQZ2 B9w6zbzk3ycUSm6GuF46OiJjPn/o2m9wvGMhnUJfqHIej7+VxVlEemvDNkY1UlZrSyBx WCIamXceC7npd7wrZvwbxuUv8qHXYNFkG/cOc= Received: by 10.86.72.15 with SMTP id u15mr519551fga.8.1234348165957; Wed, 11 Feb 2009 02:29:25 -0800 (PST) Received: from ?192.168.1.25? (230-40.1-85.cust.bluewin.ch [85.1.40.230]) by mx.google.com with ESMTPS id 4sm4916615fgg.45.2009.02.11.02.29.25 (version=SSLv3 cipher=RC4-MD5); Wed, 11 Feb 2009 02:29:25 -0800 (PST) Message-ID: <4992A884.4050406@gmail.com> Date: Wed, 11 Feb 2009 11:29:24 +0100 From: phcoder User-Agent: Thunderbird 2.0.0.19 (X11/20090105) MIME-Version: 1.0 To: The development of GRUB 2 Content-Type: multipart/mixed; boundary="------------040200080704000508030905" X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [Patch] remove bsd asm helper functions X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Feb 2009 10:29:30 -0000 This is a multi-part message in MIME format. --------------040200080704000508030905 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hello. Asm helper functions for bsd aren't really needed. Actually BSD entry point may be called directly as cdecl function. With this approach theese helper functions don't take place in kernel anymore. Tested with freebsd, openbsd and netbsd. However my tests were limited to launching kernel and see if it complains about not being able to mount root. Can someone test it with complete system? Thanks Vladimir 'phcoder' Serbinenko --------------040200080704000508030905 Content-Type: text/x-diff; name="bsd.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="bsd.patch" Index: kern/i386/loader.S =================================================================== --- kern/i386/loader.S (revision 1989) +++ kern/i386/loader.S (working copy) @@ -117,23 +117,0 @@ -/* - * Use cdecl calling convention for *BSD kernels. - */ - -FUNCTION(grub_unix_real_boot) - - call EXT_C(grub_dl_unload_all) - call EXT_C(grub_stop_floppy) - - /* Interrupts should be disabled. */ - cli - - /* Discard `grub_unix_real_boot' return address. */ - popl %eax - - /* Fetch `entry' address ... */ - popl %eax - - /* - * ... and put our return address in its place. The kernel will - * ignore it, but it expects %esp to point to it. - */ - call *%eax Index: include/grub/i386/loader.h =================================================================== --- include/grub/i386/loader.h (revision 1989) +++ include/grub/i386/loader.h (working copy) @@ -22,7 +22,6 @@ #include #include #include -#include extern grub_uint32_t EXPORT_VAR(grub_linux_prot_size); extern char *EXPORT_VAR(grub_linux_tmp_addr); @@ -33,22 +32,21 @@ void EXPORT_FUNC(grub_multiboot2_real_boot) (grub_addr_t entry, struct grub_multiboot_info *mbi) __attribute__ ((noreturn)); -void EXPORT_FUNC(grub_unix_real_boot) (grub_addr_t entry, ...) - __attribute__ ((cdecl,noreturn)); extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_orig); extern grub_addr_t EXPORT_VAR(grub_multiboot_payload_dest); extern grub_size_t EXPORT_VAR(grub_multiboot_payload_size); extern grub_uint32_t EXPORT_VAR(grub_multiboot_payload_entry_offset); /* It is necessary to export these functions, because normal mode commands reuse rescue mode commands. */ void grub_rescue_cmd_linux (int argc, char *argv[]); void grub_rescue_cmd_initrd (int argc, char *argv[]); extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator); extern grub_uint8_t EXPORT_VAR(grub_multiboot_forward_relocator_end); extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator); extern grub_uint8_t EXPORT_VAR(grub_multiboot_backward_relocator_end); +void EXPORT_FUNC(grub_stop_floppy) (void); #define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator) #endif /* ! GRUB_LOADER_CPU_HEADER */ Index: loader/i386/bsd.c =================================================================== --- loader/i386/bsd.c (revision 1989) +++ loader/i386/bsd.c (working copy) @@ -302,9 +302,17 @@ bi.bi_kernend = kern_end; - grub_unix_real_boot (entry, bootflags | FREEBSD_RB_BOOTINFO, bootdev, - 0, 0, 0, &bi, bi.bi_modulep, kern_end); + grub_stop_floppy (); + asm volatile ("cli"); + + ((void (* __attribute__ ((cdecl,regparm (0)))) + (grub_uint32_t, grub_uint32_t, grub_uint32_t, grub_uint32_t, + grub_uint32_t, struct grub_freebsd_bootinfo *, + grub_addr_t, grub_addr_t))entry) + (bootflags | FREEBSD_RB_BOOTINFO, bootdev, + 0, 0, 0, &bi, bi.bi_modulep, kern_end); + /* Not reached. */ return GRUB_ERR_NONE; } @@ -348,10 +356,18 @@ bootdev = (OPENBSD_B_DEVMAGIC + (unit << OPENBSD_B_UNITSHIFT) + (part << OPENBSD_B_PARTSHIFT)); - grub_unix_real_boot (entry, bootflags, bootdev, OPENBSD_BOOTARG_APIVER, - 0, grub_upper_mem >> 10, grub_lower_mem >> 10, - (char *) pa - buf, buf); + grub_stop_floppy (); + asm volatile ("cli"); + + ((void (* __attribute__ ((cdecl,regparm (0)))) + (grub_uint32_t, grub_uint32_t, grub_uint32_t, grub_uint32_t, + grub_uint32_t, grub_uint32_t, + grub_uint32_t, char *)) entry) + (bootflags, bootdev, OPENBSD_BOOTARG_APIVER, + 0, grub_upper_mem >> 10, grub_lower_mem >> 10, + (char *) pa - buf, buf); + /* Not reached. */ return GRUB_ERR_NONE; } @@ -376,9 +392,16 @@ bootinfo->bi_count = 1; bootinfo->bi_data[0] = rootdev; - grub_unix_real_boot (entry, bootflags, 0, bootinfo, - 0, grub_upper_mem >> 10, grub_lower_mem >> 10); + grub_stop_floppy (); + asm volatile ("cli"); + + ((void (* __attribute__ ((cdecl,regparm (0)))) + (grub_uint32_t, grub_uint32_t, struct grub_netbsd_bootinfo *, + grub_uint32_t, grub_uint32_t, grub_uint32_t)) entry) + (bootflags, 0, bootinfo, + 0, grub_upper_mem >> 10, grub_lower_mem >> 10); + /* Not reached. */ return GRUB_ERR_NONE; } --------------040200080704000508030905--