All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Hansen <haveblue@us.ibm.com>
To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Subject: [RFC][PATCH] early command-line parsing
Date: Wed, 20 Nov 2002 10:40:11 -0800	[thread overview]
Message-ID: <3DDBD70B.7090501@us.ibm.com> (raw)

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

We need a way to parse command-line options before setup_arch() for 
early printk.  On x86, the only thing that is needed to get an early 
serial console is:
console_setup("ttyS0,115200");
serial8250_console_init();

So, in addition to this patch, all you need to get early printk on x86 
is serial8250_console_init() in i386's setup_arch() and a 
console=ttyS0,speed on the kernel command line.

Are there any architectures that can't even do a memcpy before 
setup_arch()?
-- 
Dave Hansen
haveblue@us.ibm.com

[-- Attachment #2: early_setup-2.5.48-2.patch --]
[-- Type: text/plain, Size: 3117 bytes --]

diff -ru linux-2.5.48-clean/include/linux/init.h linux-2.5.48-early_setup/include/linux/init.h
--- linux-2.5.48-clean/include/linux/init.h	Tue Nov 19 13:53:09 2002
+++ linux-2.5.48-early_setup/include/linux/init.h	Tue Nov 19 12:02:45 2002
@@ -90,17 +90,21 @@
  * Used for kernel command line parameter setup
  */
 struct kernel_param {
+	int order;
 	const char *str;
 	int (*setup_func)(char *);
 };
 
 extern struct kernel_param __setup_start, __setup_end;
 
-#define __setup(str, fn)						\
+#define __early_setup(str, fn)	__raw_setup(0, str, fn)
+#define __setup(str, fn)	__raw_setup(1, str, fn)
+
+#define __raw_setup(order, str, fn)					\
 	static char __setup_str_##fn[] __initdata = str;		\
 	static struct kernel_param __setup_##fn				\
 		 __attribute__((unused,__section__ (".init.setup")))	\
-		= { __setup_str_##fn, fn }
+		= { order, __setup_str_##fn, fn }
 
 #endif /* __ASSEMBLY__ */
 
diff -ru linux-2.5.48-clean/init/main.c linux-2.5.48-early_setup/init/main.c
--- linux-2.5.48-clean/init/main.c	Tue Nov 19 13:53:09 2002
+++ linux-2.5.48-early_setup/init/main.c	Wed Nov 20 10:29:03 2002
@@ -36,6 +36,7 @@
 
 #include <asm/io.h>
 #include <asm/bugs.h>
+#include <asm/setup.h>
 
 #if defined(CONFIG_ARCH_S390)
 #include <asm/s390mach.h>
@@ -136,15 +137,17 @@
 
 __setup("profile=", profile_setup);
 
-static int __init checksetup(char *line)
+static int __init checksetup(int run_number, char *line) 
 {
 	struct kernel_param *p;
 
 	p = &__setup_start;
 	do {
 		int n = strlen(p->str);
-		if (!strncmp(line,p->str,n)) {
-			if (p->setup_func(line+n))
+		if(strncmp(linux, p->str, n)) {
+			if (p->order == run_number)
+				return (p->setup_func(line+n) != 0);
+			else if (p->order < run_number)
 				return 1;
 		}
 		p++;
@@ -230,7 +233,7 @@
  * This routine also checks for options meant for the kernel.
  * These options are not given to init - they are for internal kernel use only.
  */
-static void __init parse_options(char *line)
+static void __init parse_options(int setup_order, char *line)
 {
 	char *next,*quote;
 	int args, envs;
@@ -266,7 +269,7 @@
 			args = 0;
 			continue;
 		}
-		if (checksetup(line))
+		if (checksetup(setup_order, line))
 			continue;
 		
 		/*
@@ -386,6 +389,10 @@
  * Interrupts are still disabled. Do necessary setups, then
  * enable them
  */
+	memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
+	command_line = saved_command_line;
+
+	parse_options(0, command_line);
 	lock_kernel();
 	printk(linux_banner);
 	setup_arch(&command_line);
@@ -393,7 +400,7 @@
 	build_all_zonelists();
 	page_alloc_init();
 	printk("Kernel command line: %s\n", saved_command_line);
-	parse_options(command_line);
+	parse_options(1, command_line);
 	trap_init();
 	extable_init();
 	rcu_init();
diff -ru linux-2.5.48-clean/kernel/printk.c linux-2.5.48-early_setup/kernel/printk.c
--- linux-2.5.48-clean/kernel/printk.c	Sun Nov 10 19:28:32 2002
+++ linux-2.5.48-early_setup/kernel/printk.c	Wed Nov 20 10:30:05 2002
@@ -149,7 +149,7 @@
 	return 1;
 }
 
-__setup("console=", console_setup);
+__early_setup("console=", console_setup);
 
 /*
  * Commands to do_syslog:

             reply	other threads:[~2002-11-20 18:35 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-11-20 18:40 Dave Hansen [this message]
2002-11-20 21:00 ` [RFC][PATCH] early command-line parsing David Woodhouse
2002-11-20 21:56   ` Dave Hansen

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=3DDBD70B.7090501@us.ibm.com \
    --to=haveblue@us.ibm.com \
    --cc=dwmw2@infradead.org \
    --cc=linux-kernel@vger.kernel.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.