All of lore.kernel.org
 help / color / mirror / Atom feed
From: phcoder <phcoder@gmail.com>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: Re: Sendkey patch
Date: Tue, 02 Sep 2008 20:39:03 +0200	[thread overview]
Message-ID: <48BD8847.9030502@gmail.com> (raw)
In-Reply-To: <1220373059.23879.25.camel@localhost>

[-- Attachment #1: Type: text/plain, Size: 1397 bytes --]

Javier Martín wrote:
> But you negate any performance gain when you _do_ traverse the list to
> add an entry to it instead of just make it the new head as I do.
> Besides, even for that, double indirection should be avoided in the
> structure previous pointer because it makes things oh-so-incredibly
> confusing.
I was thinking about code size then about performance or easy of
understanding. On my system this code results in 91 addition bytes in
core image (63 if I remove grub_error). Do you have any idea how it
would be possible to do an error message without description or put some
generic description?
> 
> Besides, I think the "user" (i.e. module) visible type returned by _add
> and taken by _remove should be a "blank hidden type", i.e. you don't
> need to declare "struct grub_preboot_t" in loader.h because the public
> interface only uses _pointers_ to it, whose size is known. This is all
> the C compiler requires and you avoid polluting the namespace with
> internal implementation details. I recommend the following typedefs:
> 
> typedef struct grub_preboot_t* grub_preboot_hnd;
> typedef grub_err_t *(grub_preboot_func)(int noreturn);
> 
> So that the prototypes would look
> 
> grub_preboot_hnd add(grub_preboot_func f);
> void remove(grub_preboot_hnd handle);
I noticed that actually no code needs the size of grub_preoot_hnd. So I
changed it to void *
Vladimir Serbinenko

[-- Attachment #2: preboot.patch --]
[-- Type: text/x-diff, Size: 2730 bytes --]

Index: kern/loader.c
===================================================================
--- kern/loader.c	(revision 1845)
+++ kern/loader.c	(working copy)
@@ -22,12 +22,54 @@
 #include <grub/err.h>
 #include <grub/kernel.h>
 
+#define PREBOOT_HND(x) (((struct grub_preboot_t *)x))
+
+struct grub_preboot_t
+{
+  grub_err_t (*preboot_func) (int);  
+  struct grub_preboot_t *next;
+  struct grub_preboot_t **prev_pointer;
+};
+
 static grub_err_t (*grub_loader_boot_func) (void);
 static grub_err_t (*grub_loader_unload_func) (void);
 static int grub_loader_noreturn;
 
 static int grub_loader_loaded;
 
+static struct grub_preboot_t *grub_loader_preboots=0;
+
+void *
+grub_loader_add_preboot (grub_err_t (*preboot_func) (int))
+{
+  struct grub_preboot_t *cur;
+  if (!preboot_func)
+    return 0;
+  cur=(struct grub_preboot_t *)grub_malloc (sizeof (struct grub_preboot_t));
+  if (!cur)
+    {
+      grub_error (GRUB_ERR_OUT_OF_MEMORY, "hook not added");
+      return 0;
+    }
+  cur->next=grub_loader_preboots;
+  cur->prev_pointer=0;
+  cur->next->prev_pointer=&(cur->next);
+  cur->preboot_func=preboot_func;
+  grub_loader_preboots=cur;
+  return cur;
+}
+
+void
+grub_loader_remove_preboot (void *p)
+{
+  if (!p)
+    return;
+  *(PREBOOT_HND(p)->prev_pointer)=PREBOOT_HND(p)->next;
+  if (PREBOOT_HND(p)->next)
+    PREBOOT_HND(p)->next->prev_pointer=PREBOOT_HND(p)->prev_pointer;
+    grub_free (p);
+}
+
 int
 grub_loader_is_loaded (void)
 {
@@ -64,12 +106,18 @@
 grub_err_t
 grub_loader_boot (void)
 {
+  struct grub_preboot_t *iter=grub_loader_preboots;
   if (! grub_loader_loaded)
     return grub_error (GRUB_ERR_NO_KERNEL, "no loaded kernel");
 
   if (grub_loader_noreturn)
     grub_machine_fini ();
-  
+  while (iter)
+    {
+      if (iter->preboot_func)
+	iter->preboot_func (grub_loader_noreturn);
+      iter=iter->next;
+    }
   return (grub_loader_boot_func) ();
 }
 
Index: include/grub/loader.h
===================================================================
--- include/grub/loader.h	(revision 1845)
+++ include/grub/loader.h	(working copy)
@@ -25,6 +25,7 @@
 #include <grub/err.h>
 #include <grub/types.h>
 
+
 /* Check if a loader is loaded.  */
 int EXPORT_FUNC(grub_loader_is_loaded) (void);
 
@@ -37,6 +38,12 @@
 /* Unset current loader, if any.  */
 void EXPORT_FUNC(grub_loader_unset) (void);
 
+/*Add a preboot function*/
+void *EXPORT_FUNC(grub_loader_add_preboot) (grub_err_t (*preboot_func) (int noreturn));
+
+/*Remove given preboot function*/
+void EXPORT_FUNC(grub_loader_remove_preboot) (void *hnd);
+
 /* Call the boot hook in current loader. This may or may not return,
    depending on the setting by grub_loader_set.  */
 grub_err_t EXPORT_FUNC(grub_loader_boot) (void);

  reply	other threads:[~2008-09-02 18:39 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-02 14:23 Sendkey patch phcoder
2008-09-02 14:54 ` Javier Martín
2008-09-02 15:58   ` phcoder
2008-09-02 16:12     ` phcoder
2008-09-02 16:19     ` Vesa Jääskeläinen
2008-09-02 19:01       ` phcoder
2008-09-02 19:29         ` Vesa Jääskeläinen
2008-09-02 16:30     ` Javier Martín
2008-09-02 18:39       ` phcoder [this message]
2008-09-02 20:10         ` Javier Martín
2008-09-02 22:22           ` phcoder
2008-09-02 23:38             ` Javier Martín
2008-09-03  0:08               ` phcoder
2008-09-03  0:54                 ` Javier Martín
2008-09-03  9:10                   ` phcoder
2008-09-03 11:19                     ` Javier Martín
2008-09-03 10:37                   ` bitbucket
2008-09-03  7:07               ` Felix Zielcke
2008-09-03 17:07               ` Vesa Jääskeläinen
2008-09-03 17:23                 ` Javier Martín
2008-09-03 17:25                   ` Felix Zielcke
2008-09-03 17:48                 ` phcoder
2008-09-03 17:53                   ` Vesa Jääskeläinen
2008-09-03 18:11                     ` phcoder
2008-09-04 22:16                     ` Javier Martín
2008-09-05 16:13                       ` [PATCH] Move kern/loader.c to boot.mod and add preboot_support (was Re: Sendkey patch) phcoder
2008-09-05 16:47                         ` Javier Martín
2008-09-08 19:48                         ` Vesa Jääskeläinen
2008-09-08 20:11                           ` Javier Martín
2008-09-08 20:25                             ` Vesa Jääskeläinen
2008-09-08 20:59                               ` Javier Martín
2008-12-15 13:54                                 ` phcoder
2008-12-15 16:41                                   ` Vesa Jääskeläinen
2008-12-16 14:34                                     ` phcoder
2009-02-07 19:26                                 ` Robert Millan
2009-02-07 19:30                             ` Robert Millan
2009-02-07 23:02                               ` phcoder

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48BD8847.9030502@gmail.com \
    --to=phcoder@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.