From: Thiago Farina on
On Mon, Aug 2, 2010 at 2:56 PM, Thiago Farina <tfransosi(a)gmail.com> wrote:
> On Mon, Aug 2, 2010 at 4:13 AM, Yinghai Lu <yinghai(a)kernel.org> wrote:
>> Index: linux-2.6/arch/x86/boot/string.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/boot/string.c
>> +++ linux-2.6/arch/x86/boot/string.c
>> @@ -12,7 +12,21 @@
>>  * Very basic string functions
>>  */
>>
>> -#include "boot.h"
>> +static inline int isdigit(int ch)
>> +{
>> +       return (ch >= '0') && (ch <= '9');
>> +}
>> +
>> +static inline int isxdigit(int ch)
>> +{
>> +       if (isdigit(ch))
>> +               return true;
>> +
>> +       if ((ch >= 'a') && (ch <= 'f'))
>> +               return true;
>> +
>> +       return (ch >= 'A') && (ch <= 'F');
>> +}
>>
>
> These to functions above can be fairly simplified by writting as:
>
> static bool inline is_hex_digit(int c) {
>  return (c >= '0' && c <= '9') ||
>            (c >= 'A' && c <= 'F') ||
>            (c >= 'a' && c <= 'f');
> }
>

Wow, sorry, this should be:

static inline bool is_hex_digit(int c) { ... }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: H. Peter Anvin on
On 08/02/2010 10:56 AM, Thiago Farina wrote:
>
> These to functions above can be fairly simplified by writting as:
>
> static bool inline is_hex_digit(int c) {
> return (c >= '0' && c <= '9') ||
> (c >= 'A' && c <= 'F') ||
> (c >= 'a' && c <= 'f');
> }
>

a) You lose the isdigit() functionality, which is useful on its own.
b) Does this enahance readability in any way?
c) Your proposed renaming is nonstandard.

As such, I don't think this is a good idea.

-hpa
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Thiago Farina on
On Mon, Aug 2, 2010 at 3:27 PM, H. Peter Anvin <hpa(a)zytor.com> wrote:
> On 08/02/2010 10:56 AM, Thiago Farina wrote:
>>
>> These to functions above can be fairly simplified by writting as:
>>
>> static bool inline is_hex_digit(int c) {
>>   return (c >= '0' && c <= '9') ||
>>             (c >= 'A' && c <= 'F') ||
>>             (c >= 'a' && c <= 'f');
>> }
>>
>
> a) You lose the isdigit() functionality, which is useful on its own.
> b) Does this enahance readability in any way?
> c) Your proposed renaming is nonstandard.
>

What about this instead?

static inline bool isxdigit(int ch) {
return (isdigit(ch) || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f');
}

> As such, I don't think this is a good idea.
>
>        -hpa
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Yinghai Lu on
On 08/02/2010 10:43 AM, Cyrill Gorcunov wrote:
> On Mon, Aug 02, 2010 at 02:17:31AM -0700, Yinghai Lu wrote:
> ...
>> Index: linux-2.6/arch/x86/boot/printf.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/boot/printf.c
>> +++ linux-2.6/arch/x86/boot/printf.c
>> @@ -34,7 +34,7 @@ static int skip_atoi(const char **s)
>> #define SMALL 32 /* Must be 32 == 0x20 */
>> #define SPECIAL 64 /* 0x */
>>
>> -#define do_div(n,base) ({ \
>> +#define __do_div(n, base) ({ \
>> int __res; \
>> __res = ((unsigned long) n) % (unsigned) base; \
>> n = ((unsigned long) n) / (unsigned) base; \
>> @@ -83,7 +83,7 @@ static char *number(char *str, long num,
>> tmp[i++] = '0';
>> else
>> while (num != 0)
>> - tmp[i++] = (digits[do_div(num, base)] | locase);
>> + tmp[i++] = (digits[__do_div(num, base)] | locase);
>
> Yinghai, what was wrong with the origin do_div? After inclusion it as "printf.c"
> in another *.c do_div gets clashed?

yes. get clashed if include that printf.c in arch/x86/boot/compressed/misc.c

Yinghai
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Yinghai Lu on
On 08/02/2010 08:09 AM, Cyrill Gorcunov wrote:
> On Mon, Aug 02, 2010 at 12:13:31AM -0700, Yinghai Lu wrote:
>>
>> Seperate early_console_setup from tty.c
>> also make main.c to include printf.c/string.c/cmdline.c
>>
>> will reuse early_serial_console.c/string.c/printf.c/cmdline.c in compressed/misc.c
>>
>> Signed-off-by: Yinghai Lu <yinghai(a)kernel.org>
>>
>> ---
>
> Hi Yinghai, I'll try to find some time for review though it looks somehow
> too 'big' for me :)
>
> Actually by reading your initial approach (which was much smaller in size) I
> thought we end up in something like the patch below, though I'll review this
> seris. So just to share (I've tested it under qemu). The idea is the same as
> your was, so I pushed all constant parts into header and use it when needed
> passing serial line base port via boot_params.

Eric doesn't like early_serial_console_base in zero page. and said that is fragile.

So try to include string.c/printf.c/cmdline.c/early_serial_console.c in arch/x86/boot/compressed/misc.c
and analyze that command line again.

then kexec path will get support too. that is from arch/x86/boot/compressed/head_32.S or head_64.S, startup_32.
and skip arch/x86/boot/main.c

later with following patch for 3, we get all covered in c code.
1. arch/x86/boot/main.c: setup code.
2. arch/x86/boot/compressed/misc.c: decompress_kernel code : the 2 -v3 patches that i sent last night.
3. arch/x86/kernel/head64.c: real kernel.

maybe we can make early_serial_console.c and early_printk.c to share some .h etc later.

Thanks

Yinghai

[PATCH -v2] x86: Setup early console as early as possible

Analyze "console=uart8250,io,0x3f8,115200n8" in i386_start_kernel/x86_64_start_kernel,
and call setup_early_serial8250_console() to init early serial console.

only can handle io port kind of 8250. because mmio need ioremap.

-v2: use boot_params.hdr.version instead of adding another variable, Suggested by hpa
update after using x86 memblock patchset

Signed-off-by: Yinghai Lu <yinghai(a)kernel.org>
---
arch/x86/include/asm/setup.h | 2 ++
arch/x86/kernel/head.c | 27 +++++++++++++++++++++++++++
arch/x86/kernel/head32.c | 2 ++
arch/x86/kernel/head64.c | 13 +++++++++++--
kernel/printk.c | 4 ++++
5 files changed, 46 insertions(+), 2 deletions(-)

Index: linux-2.6/arch/x86/include/asm/setup.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/setup.h
+++ linux-2.6/arch/x86/include/asm/setup.h
@@ -42,6 +42,8 @@ static inline void visws_early_detect(vo
#endif

extern unsigned long saved_video_mode;
+int setup_early_serial8250_console(char *cmdline);
+void setup_early_console(void);

extern void reserve_standard_io_resources(void);
extern void i386_reserve_resources(void);
Index: linux-2.6/arch/x86/kernel/head.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/head.c
+++ linux-2.6/arch/x86/kernel/head.c
@@ -54,3 +54,30 @@ void __init reserve_ebda_region(void)
/* reserve all memory between lowmem and the 1MB mark */
memblock_x86_reserve_range(lowmem, 0x100000, "* BIOS reserved");
}
+
+
+void __init setup_early_console(void)
+{
+#ifdef CONFIG_SERIAL_8250_CONSOLE
+ char constr[64], *p, *q;
+
+ /* Can not handle mmio type 8250 uart yet, too early */
+ p = strstr(boot_command_line, "console=uart8250,io,");
+ if (!p)
+ p = strstr(boot_command_line, "console=uart,io,");
+ if (!p)
+ return;
+
+ p += 8; /* sizeof "console=" */
+ q = strchr(p, ' ');
+ if ((q - p) >= sizeof(constr))
+ return;
+
+ memset(constr, 0, sizeof(constr));
+ memcpy(constr, p, q - p);
+
+ lockdep_init();
+
+ setup_early_serial8250_console(constr);
+#endif
+}
Index: linux-2.6/arch/x86/kernel/head32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/head32.c
+++ linux-2.6/arch/x86/kernel/head32.c
@@ -31,6 +31,8 @@ static void __init i386_default_early_se

void __init i386_start_kernel(void)
{
+ setup_early_console();
+
memblock_init();

#ifdef CONFIG_X86_TRAMPOLINE
Index: linux-2.6/arch/x86/kernel/head64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/head64.c
+++ linux-2.6/arch/x86/kernel/head64.c
@@ -46,6 +46,10 @@ static void __init copy_bootdata(char *r
{
char * command_line;

+ /* make sure if it is copied already */
+ if (boot_params.hdr.version)
+ return;
+
memcpy(&boot_params, real_mode_data, sizeof boot_params);
if (boot_params.hdr.cmd_line_ptr) {
command_line = __va(boot_params.hdr.cmd_line_ptr);
@@ -74,6 +78,10 @@ void __init x86_64_start_kernel(char * r
/* clear bss before set_intr_gate with early_idt_handler */
clear_bss();

+ /* boot_params is in bss */
+ copy_bootdata(__va(real_mode_data));
+ setup_early_console();
+
/* Make NULL pointers segfault */
zap_identity_mappings();

@@ -97,9 +105,10 @@ void __init x86_64_start_kernel(char * r

void __init x86_64_start_reservations(char *real_mode_data)
{
- memblock_init();
-
copy_bootdata(__va(real_mode_data));
+ setup_early_console();
+
+ memblock_init();

memblock_x86_reserve_range(__pa_symbol(&_text), __pa_symbol(&__bss_stop), "TEXT DATA BSS");

Index: linux-2.6/kernel/printk.c
===================================================================
--- linux-2.6.orig/kernel/printk.c
+++ linux-2.6/kernel/printk.c
@@ -1204,6 +1204,10 @@ void register_console(struct console *ne
if (console_drivers && newcon->flags & CON_BOOT) {
/* find the last or real console */
for_each_console(bcon) {
+ /* not again */
+ if (bcon == newcon)
+ return;
+
if (!(bcon->flags & CON_BOOT)) {
printk(KERN_INFO "Too late to register bootconsole %s%d\n",
newcon->name, newcon->index);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/