From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1LsQSD-0004Sz-77 for mharc-grub-devel@gnu.org; Fri, 10 Apr 2009 19:48:13 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LsQSB-0004Sl-J4 for grub-devel@gnu.org; Fri, 10 Apr 2009 19:48:11 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LsQS6-0004SF-NF for grub-devel@gnu.org; Fri, 10 Apr 2009 19:48:11 -0400 Received: from [199.232.76.173] (port=41105 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LsQS6-0004SA-HN for grub-devel@gnu.org; Fri, 10 Apr 2009 19:48:06 -0400 Received: from fg-out-1718.google.com ([72.14.220.156]:23658) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LsQS5-0002Fv-QR for grub-devel@gnu.org; Fri, 10 Apr 2009 19:48:06 -0400 Received: by fg-out-1718.google.com with SMTP id l27so95493fgb.7 for ; Fri, 10 Apr 2009 16:48:04 -0700 (PDT) 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=BzBtZiRvfKIduW4jvIGe27ekQ0UyrODoTNNLX7ffqnE=; b=bTQnPEbBXWLuGjyFPnMlNfI81VaObTCJXXDWnNvlwpw622fTfEswDpc6MKkmnOWzUy H9qXEELI5F/jBW2oApw9K06FQuyDs74DL0S2OO3hqC4T5mkxjjb6J+HMIl964dyA+YHB Lv8I7RxVgjuuF6+nTXG5UoYOY+Uu11Ec++qbc= 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=mYo66RcyZorlfERD02s2sUmuvCUw9QbucL2I/DzlvvVSuxJbjZlt1aDTHw2zybX4rX zxGcVQkPrr5iOFyKkggsf0rRqPey/5H93JRP59CZ8CN3vnsX7xArnnq9ahhoPKhEs9Dd OYJFoosXJGFoBn8wpuLAs0Bvzagqfjtn5SFCY= Received: by 10.86.90.2 with SMTP id n2mr2011783fgb.39.1239407284717; Fri, 10 Apr 2009 16:48:04 -0700 (PDT) Received: from ?192.168.1.25? (16-189.62-81.cust.bluewin.ch [81.62.189.16]) by mx.google.com with ESMTPS id 4sm3158581fge.13.2009.04.10.16.48.04 (version=SSLv3 cipher=RC4-MD5); Fri, 10 Apr 2009 16:48:04 -0700 (PDT) Message-ID: <49DFDAB7.1080009@gmail.com> Date: Sat, 11 Apr 2009 01:48:07 +0200 From: phcoder User-Agent: Thunderbird 2.0.0.21 (X11/20090318) MIME-Version: 1.0 To: The development of GRUB 2 Content-Type: multipart/mixed; boundary="------------010109090800090002050206" X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [PATCH] Preboot support 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: Fri, 10 Apr 2009 23:48:11 -0000 This is a multi-part message in MIME format. --------------010109090800090002050206 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hello, here is the preboot hooks support. Apply on top of my bootmove patch. They are very useful for patches like sendkey (my old patch that I'll rediff), badram, acpi (2 patches in separate threads) or drivemap -- Regards Vladimir 'phcoder' Serbinenko --------------010109090800090002050206 Content-Type: text/x-diff; name="preboot.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="preboot.patch" diff --git a/ChangeLog b/ChangeLog index a69e381..2b37e04 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2009-04-06 Vladimir Serbinenko + + Preboot hooks support + + * commands/boot.c (struct grub_preboot_t): new declaration + (preboots_head): new variable + (preboots_tail): likewise + (grub_loader_add_preboot): new function + (grub_loader_remove_preboot): likewise + (grub_loader_set): launch preboot hooks + * include/grub/loader.h (grub_loader_add_preboot): new declaration + (grub_loader_remove_preboot): likewise + 2009-03-22 Vladimir Serbinenko Move loader out of the kernel diff --git a/commands/boot.c b/commands/boot.c index 9a08fea..3eaf111 100644 --- a/commands/boot.c +++ b/commands/boot.c @@ -22,12 +22,25 @@ #include #include #include +#include static grub_err_t (*grub_loader_boot_func) (void); static grub_err_t (*grub_loader_unload_func) (void); static int grub_loader_noreturn; +struct grub_preboot_t +{ + grub_err_t (*preboot_func) (int); + grub_err_t (*preboot_rest_func) (void); + int prio; + struct grub_preboot_t *next; + struct grub_preboot_t *prev; +}; + static int grub_loader_loaded; +static struct grub_preboot_t *preboots_head = 0, + *preboots_tail = 0; + int grub_loader_is_loaded (void) @@ -35,6 +48,69 @@ grub_loader_is_loaded (void) return grub_loader_loaded; } +/*Add a preboot function*/ +void * +grub_loader_add_preboot (grub_err_t (*preboot_func) (int noreturn), + grub_err_t (*preboot_rest_func) (void), + int prio) +{ + struct grub_preboot_t *cur, *new_preboot; + + if (! preboot_func && ! preboot_rest_func) + return 0; + + new_preboot = (struct grub_preboot_t *) + grub_malloc (sizeof (struct grub_preboot_t)); + if (! new_preboot) + { + grub_error (GRUB_ERR_OUT_OF_MEMORY, "hook not added"); + return 0; + } + + new_preboot->preboot_func = preboot_func; + new_preboot->preboot_rest_func = preboot_rest_func; + new_preboot->prio = prio; + + for (cur = preboots_head; cur && cur->prio > prio; cur = cur->next); + + if (cur) + { + new_preboot->next = cur; + new_preboot->prev = cur->prev; + cur->prev = new_preboot; + } + else + { + new_preboot->next = 0; + new_preboot->prev = preboots_tail; + preboots_tail = new_preboot; + } + if (new_preboot->prev) + new_preboot->prev->next = new_preboot; + else + preboots_head = new_preboot; + + + return new_preboot; +} + +void +grub_loader_remove_preboot (void *hnd) +{ + struct grub_preboot_t *preb = hnd; + + if (preb->next) + preb->next->prev = preb->prev; + else + preboots_tail = preb->prev; + if (preb->prev) + preb->prev->next = preb->next; + else + preboots_head = preb->next; + + grub_free (preb); +} + void grub_loader_set (grub_err_t (*boot) (void), grub_err_t (*unload) (void), @@ -65,13 +141,32 @@ grub_loader_unset(void) grub_err_t grub_loader_boot (void) { + grub_err_t err = GRUB_ERR_NONE; + struct grub_preboot_t *cur; + if (! grub_loader_loaded) return grub_error (GRUB_ERR_NO_KERNEL, "no loaded kernel"); if (grub_loader_noreturn) grub_machine_fini (); + + for (cur = preboots_head; cur; cur = cur->next) + if (err = cur->preboot_func (grub_loader_noreturn)) + { + for (cur = cur->prev; cur; cur = cur->prev) + cur->preboot_rest_func (); + return err; + } - return (grub_loader_boot_func) (); + err = (grub_loader_boot_func) (); + + for (cur = preboots_tail; cur; cur = cur->prev) + if (! err) + err = cur->preboot_rest_func (); + else + cur->preboot_rest_func (); + + return err; } diff --git a/include/grub/loader.h b/include/grub/loader.h index 185d297..f701569 100644 --- a/include/grub/loader.h +++ b/include/grub/loader.h @@ -41,4 +41,12 @@ void grub_loader_unset (void); depending on the setting by grub_loader_set. */ grub_err_t grub_loader_boot (void); +/* Add a preboot function */ +void *grub_loader_add_preboot (grub_err_t (*preboot_func) (int noreturn), + grub_err_t (*preboot_rest_func) (void), + int prio); + +/* Remove given preboot function */ +void grub_loader_remove_preboot (void *hnd); + #endif /* ! GRUB_LOADER_HEADER */ --------------010109090800090002050206--