please check the patch.
YH
On Sunday 13 May 2007 07:33:14 Yinghai Lu wrote:
> please check the patch.
Can you please give a little more description on why you think the patch
is needed? Also we need a Signed-off-by line.
Thanks,
-Andi
"Yinghai Lu" <[email protected]> writes:
> please check the patch.
>
> YH
>
> [PATCH]x86_64: build and use GDT on copied compressed kernel
>
> Build and use GDT on copied compressed kernel postion, instead of using GDT
> in data segment of loaded compressed kernel. Otherwise decompressing
> compressed kernel image later in 64bit longmode, will overwrite GDT.
Overwriting the GDT should be fine because we don't reload the segments,
after we overwrite it. GDT entries are only read when we load segments.
Interrupts are disabled so that should not cause a problem.
Why do you think the current behaviour is a problem?
Eric
On 5/12/07, Eric W. Biederman <[email protected]> wrote:
> Overwriting the GDT should be fine because we don't reload the segments,
> after we overwrite it. GDT entries are only read when we load segments.
> Interrupts are disabled so that should not cause a problem.
>
> Why do you think the current behaviour is a problem?
just think if GDT should not be overwriten when we are still under
that GDT setting.
didn't have chance to test that in HDT or other debug device, when
setting breaking point after that GDT is overwriten.
YH
On 5/12/07, Andi Kleen <[email protected]> wrote:
> On Sunday 13 May 2007 07:33:14 Yinghai Lu wrote:
>
> Can you please give a little more description on why you think the patch
> is needed? Also we need a Signed-off-by line.
in the arch/x86_64/boot/compressed/head.S.
it switch to 64 bit mode and then copy compressed image to higher
address. and jump the copied image, then decompressed the compressed
image to final uncompressed kernel and it may overlapped with original
loaded compressed kernel image.
before jump to 64 bit mode, it will create new page table in some
place higher in copied compressed kernel image. but still use the GDT
in place of original loaded compressed image. So the GDT will be
overwriten in the middle of decompressing.
So we could change to build the GDT like page table together with
copied compressed kernel.
Signed-off-by: Yinghai Lu <[email protected]>
http://lkml.org/lkml/2007/5/13/8
"Yinghai Lu" <[email protected]> writes:
> On 5/12/07, Eric W. Biederman <[email protected]> wrote:
>> Overwriting the GDT should be fine because we don't reload the segments,
>> after we overwrite it. GDT entries are only read when we load segments.
>> Interrupts are disabled so that should not cause a problem.
>>
>> Why do you think the current behaviour is a problem?
>
> just think if GDT should not be overwriten when we are still under
> that GDT setting.
> didn't have chance to test that in HDT or other debug device, when
> setting breaking point after that GDT is overwriten.
It would be interesting to see if you could produce a failure using
that gdt, I don't think you will be able to, even with a debugger.
For data segments we never use that GDT, it is only for the code
segment we use the GDT and that only to get us into 64bit mode.
Eric
On 5/12/07, Eric W. Biederman <[email protected]> wrote:
>
> For data segments we never use that GDT, it is only for the code
> segment we use the GDT and that only to get us into 64bit mode.
>
after the patch
linux:/home/yhlu/xx/xx/kernel/linux-2.6/arch/x86_64/boot/compressed #
readelf -e vmlinux
...
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000000000 00100000
000000000032617c 0000000000000000 AX 0 0 16
[ 2] .rodata PROGBITS 0000000000326180 00426180
0000000000000400 0000000000000000 A 0 0 32
[ 3] .eh_frame PROGBITS 0000000000326580 00426580
0000000000000210 0000000000000000 A 0 0 8
[ 4] .data PROGBITS 0000000000326790 00426790
0000000000000008 0000000000000000 WA 0 0 8
[ 5] .bss NOBITS 00000000003267a0 00426798
000000000000b860 0000000000000000 WA 0 0 32
[ 6] .comment PROGBITS 0000000000000000 00426798
0000000000000035 0000000000000000 0 0 1
[ 7] .shstrtab STRTAB 0000000000000000 004267cd
0000000000000047 0000000000000000 0 0 1
[ 8] .symtab SYMTAB 0000000000000000 00426a98
00000000000007c8 0000000000000018 9 60 8
[ 9] .strtab STRTAB 0000000000000000 00427260
0000000000000350 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
after the patch, it seems .data section size still have 8 bytes.
before that will 0x28.
don't know what are the 8 bytes.
YH
"Yinghai Lu" <[email protected]> writes:
> On 5/12/07, Eric W. Biederman <[email protected]> wrote:
>>
>> For data segments we never use that GDT, it is only for the code
>> segment we use the GDT and that only to get us into 64bit mode.
>>
>
> after the patch
> linux:/home/yhlu/xx/xx/kernel/linux-2.6/arch/x86_64/boot/compressed #
> readelf -e vmlinux
> ...
> Section Headers:
> [Nr] Name Type Address Offset
> Size EntSize Flags Link Info Align
> [ 0] NULL 0000000000000000 00000000
> 0000000000000000 0000000000000000 0 0 0
> [ 1] .text PROGBITS 0000000000000000 00100000
> 000000000032617c 0000000000000000 AX 0 0 16
> [ 2] .rodata PROGBITS 0000000000326180 00426180
> 0000000000000400 0000000000000000 A 0 0 32
> [ 3] .eh_frame PROGBITS 0000000000326580 00426580
> 0000000000000210 0000000000000000 A 0 0 8
> [ 4] .data PROGBITS 0000000000326790 00426790
> 0000000000000008 0000000000000000 WA 0 0 8
> [ 5] .bss NOBITS 00000000003267a0 00426798
> 000000000000b860 0000000000000000 WA 0 0 32
> [ 6] .comment PROGBITS 0000000000000000 00426798
> 0000000000000035 0000000000000000 0 0 1
> [ 7] .shstrtab STRTAB 0000000000000000 004267cd
> 0000000000000047 0000000000000000 0 0 1
> [ 8] .symtab SYMTAB 0000000000000000 00426a98
> 00000000000007c8 0000000000000018 9 60 8
> [ 9] .strtab STRTAB 0000000000000000 00427260
> 0000000000000350 0000000000000000 0 0 1
> Key to Flags:
> W (write), A (alloc), X (execute), M (merge), S (strings)
> I (info), L (link order), G (group), x (unknown)
> O (extra OS processing required) o (OS specific), p (processor specific)
>
> after the patch, it seems .data section size still have 8 bytes.
> before that will 0x28.
> don't know what are the 8 bytes.
Probably variables in misc.c
Eric
On 5/13/07, Eric W. Biederman <[email protected]> wrote:
> Probably variables in misc.c
it is vidmem in misc.c
YH
Eric,
I got one question about kexec and bzImage on 64bit kernel.
The bzImage for 64bit kernel must be loaded under 4G?
but vmlinux for 64bit kernel could be loaded above 4G.
So is there any plan to use 64bit entry point (startup_64) in
arch/x86_64/boot/compressed/vmlinux in bzImage? so you may
load bzImage above 4G too.
YH
"Yinghai Lu" <[email protected]> writes:
> Eric,
>
> I got one question about kexec and bzImage on 64bit kernel.
>
> The bzImage for 64bit kernel must be loaded under 4G?
> but vmlinux for 64bit kernel could be loaded above 4G.
>
> So is there any plan to use 64bit entry point (startup_64) in
> arch/x86_64/boot/compressed/vmlinux in bzImage? so you may
> load bzImage above 4G too.
We have big boot protocol revision coming up to more clearly document
what is needed to work with the native entry points. It is a 2.6.23
targeted thing and that is one of the things that we are likely to
look at.
Eric
On 5/13/07, Eric W. Biederman <[email protected]> wrote:
> We have big boot protocol revision coming up to more clearly document
> what is needed to work with the native entry points. It is a 2.6.23
> targeted thing and that is one of the things that we are likely to
> look at.
Good, where is the thread for that?
YH
"Yinghai Lu" <[email protected]> writes:
> On 5/13/07, Eric W. Biederman <[email protected]> wrote:
>> We have big boot protocol revision coming up to more clearly document
>> what is needed to work with the native entry points. It is a 2.6.23
>> targeted thing and that is one of the things that we are likely to
>> look at.
>
> Good, where is the thread for that?
Look on the virtualization list may lkml was cc'd about getting
Xen and lguest. "boot bzImages under paravirt" I think was
the subject on one of the pieces.
A lot of this work is held up in part by the need to get 2.6.22
out, and in part because we have so much in flight work for the
early phases of boot that we need to let things settle
before it we can do more.
Eric
[PATCH] serial: set RTS and DTR if flow is 'r'
if the serial console flow is set to 'r', We need to set RTS and DTR.
Some UARTs on other side need these bit set, otherwise will send char to or
receive char from the host that kernel is runing esp for kernel boot stage.
BTW:
earlyprintk and early_uart are hard coded to set DTR/RTS.
Signed-off-by: Yinghai Lu <[email protected]>
Cc: Russell King <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 48e259a..439a00a 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2154,6 +2154,16 @@ serial8250_set_termios(struct uart_port *port,
struct ktermios *termios,
}
serial_outp(up, UART_FCR, fcr); /* set fcr */
}
+
+ /* if serial console flow is 'r', we need to set RTS and DTR to MCR.
+ * some uarts on other side don't support no flow control. So we state
+ * console=ttyS0,9600n8r in kernel command line to make those uart can
+ * work.
+ */
+ if (termios->c_cflag & CRTSCTS) {
+ up->port.mctrl |= TIOCM_RTS | TIOCM_DTR;
+ }
+
serial8250_set_mctrl(&up->port, up->port.mctrl);
spin_unlock_irqrestore(&up->port.lock, flags);
}
On Mon, 14 May 2007 10:26:26 -0700 Yinghai Lu wrote:
> [PATCH] serial: set RTS and DTR if flow is 'r'
>
> if the serial console flow is set to 'r', We need to set RTS and DTR.
> Some UARTs on other side need these bit set, otherwise will send char to or
> receive char from the host that kernel is runing esp for kernel boot stage.
>
> BTW:
> earlyprintk and early_uart are hard coded to set DTR/RTS.
>
> Signed-off-by: Yinghai Lu <[email protected]>
> Cc: Russell King <[email protected]>
> Cc: Andi Kleen <[email protected]>
> Cc: Bjorn Helgaas <[email protected]>
>
> diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
> index 48e259a..439a00a 100644
> --- a/drivers/serial/8250.c
> +++ b/drivers/serial/8250.c
> @@ -2154,6 +2154,16 @@ serial8250_set_termios(struct uart_port *port,
> struct ktermios *termios,
> }
> serial_outp(up, UART_FCR, fcr); /* set fcr */
Something is eating tabs above and presumably in the new patch lines...
> }
> +
> + /* if serial console flow is 'r', we need to set RTS and DTR to MCR.
> + * some uarts on other side don't support no flow control. So we state
> + * console=ttyS0,9600n8r in kernel command line to make those uart can
> + * work.
> + */
/*
* Linux long comment style is
* like this.
*/
> + if (termios->c_cflag & CRTSCTS) {
> + up->port.mctrl |= TIOCM_RTS | TIOCM_DTR;
> + }
Don't use braces on one-statement blocks.
> +
> serial8250_set_mctrl(&up->port, up->port.mctrl);
> spin_unlock_irqrestore(&up->port.lock, flags);
> }
---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***
[PATCH] serial: set RTS and DTR if flow is 'r'
if the serial console flow is set to 'r', We need to set RTS and DTR.
Some UARTs on other side need these bit set, otherwise will not send
char to or
receive char from the host that kernel is runing esp for kernel boot stage.
BTW:
earlyprintk and early_uart are hard coded to set DTR/RTS.
Signed-off-by: Yinghai Lu <[email protected]>
Cc: Russell King <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 48e259a..4e6f8be 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2154,6 +2154,15 @@ serial8250_set_termios(struct uart_port *port,
struct ktermios *termios,
}
serial_outp(up, UART_FCR, fcr); /* set fcr */
}
+
+ /* if serial console flow is 'r', we need to set RTS and DTR to MCR.
+ * some uarts on other side don't support no flow control. So we state
+ * console=ttyS0,9600n8r in kernel command line to make those uart can
+ * work.
+ */
+ if (termios->c_cflag & CRTSCTS)
+ up->port.mctrl |= TIOCM_RTS | TIOCM_DTR;
+
serial8250_set_mctrl(&up->port, up->port.mctrl);
spin_unlock_irqrestore(&up->port.lock, flags);
}
On Mon, May 14, 2007 at 10:57:36AM -0700, Yinghai Lu wrote:
> [PATCH] serial: set RTS and DTR if flow is 'r'
>
> if the serial console flow is set to 'r', We need to set RTS and DTR.
> Some UARTs on other side need these bit set, otherwise will not send
> char to or
> receive char from the host that kernel is runing esp for kernel boot stage.
Patch is still broken. Patch is completely wrong as well - we do _not_
want to set the RTS and DTR bits here, and is in fact undoing a fix I
put in over the 2.4 drivers.
If CRTSCTS is enabled via userspace, and the port is not being used
as a console, we do not want to raise RTS _until_ we are ready to
receive characters. Your patch breaks this.
Moreover, I question the reasoning. RTS is normally raised to allow
the remote end to send characters. Since the kernel console is
output _only_, until userspace opens it, there's little point in
raising RTS. RTS will be raised when userspace opens it.
There may be some sense, however, in allowing DTR to be permanently
raised for serial consoles. However, I would err on caution since
DTR is used to reliably instruct modems to drop the line, so making
such a change would be undesirable for those folk.
--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of:
Russell King wrote:
> There may be some sense, however, in allowing DTR to be permanently
> raised for serial consoles. However, I would err on caution since
> DTR is used to reliably instruct modems to drop the line, so making
> such a change would be undesirable for those folk.
>
please check following is OK.
YH
[PATCH] serial: set DTR in uart for kernel serial console
Some UARTs on other side need host uart DTR is set, otherwise will not
receive char from the host that kernel is runing during kernel boot stage.
BTW:
earlyprintk and early_uart are hard coded to set DTR/RTS.
Signed-off-by: Yinghai Lu <[email protected]>
Cc: Russell King <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
*diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c*
index 48e259a..29c051c 100644
*--- a/drivers/serial/8250.c*
*+++ b/drivers/serial/8250.c*
@@ -2154,6 +2154,12 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
}
serial_outp(up, UART_FCR, fcr); /* set fcr */
}
+
+ /* some uarts on other side don't support no flow control. So we set
+ * DTR in host uart to make them happy
+ */
+ up->port.mctrl |= TIOCM_DTR;
+
serial8250_set_mctrl(&up->port, up->port.mctrl);
spin_unlock_irqrestore(&up->port.lock, flags);
}
On Mon, May 14, 2007 at 12:04:44PM -0700, Yinghai Lu wrote:
> Russell King wrote:
> >There may be some sense, however, in allowing DTR to be permanently
> >raised for serial consoles. However, I would err on caution since
> >DTR is used to reliably instruct modems to drop the line, so making
> >such a change would be undesirable for those folk.
> >
> please check following is OK.
Still wrong, and unfortunately you haven't understood what I was saying
at all because this is worse. ;(
Do not put the code in serial8250_set_termios. It is the wrong place.
>
> YH
>
> [PATCH] serial: set DTR in uart for kernel serial console
>
> Some UARTs on other side need host uart DTR is set, otherwise will not
> receive char from the host that kernel is runing during kernel boot stage.
>
> BTW:
> earlyprintk and early_uart are hard coded to set DTR/RTS.
>
> Signed-off-by: Yinghai Lu <[email protected]>
> Cc: Russell King <[email protected]>
> Cc: Andi Kleen <[email protected]>
> Cc: Bjorn Helgaas <[email protected]>
>
> *diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c*
> index 48e259a..29c051c 100644
> *--- a/drivers/serial/8250.c*
> *+++ b/drivers/serial/8250.c*
> @@ -2154,6 +2154,12 @@ serial8250_set_termios(struct uart_port *port,
> struct ktermios *termios,
> }
> serial_outp(up, UART_FCR, fcr); /* set fcr */
> }
> +
> + /* some uarts on other side don't support no flow control. So we set
> + * DTR in host uart to make them happy
> + */
> + up->port.mctrl |= TIOCM_DTR;
> +
> serial8250_set_mctrl(&up->port, up->port.mctrl);
> spin_unlock_irqrestore(&up->port.lock, flags);
> }
>
--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of:
Russell King wrote:
> Still wrong, and unfortunately you haven't understood what I was saying
> at all because this is worse. ;(
>
> Do not put the code in serial8250_set_termios. It is the wrong place.
>
I don't want to put that there. the problem is serial8250_set_mctrl
called by will clear DTR bit.
uart_set_options==>serial8250_set_termios ==> serial8250_set_mctrl will
clear DTR bit
YH
static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
{
struct uart_8250_port *up = (struct uart_8250_port *)port;
unsigned char mcr = 0;
if (mctrl & TIOCM_RTS)
mcr |= UART_MCR_RTS;
if (mctrl & TIOCM_DTR)
mcr |= UART_MCR_DTR;
if (mctrl & TIOCM_OUT1)
mcr |= UART_MCR_OUT1;
if (mctrl & TIOCM_OUT2)
mcr |= UART_MCR_OUT2;
if (mctrl & TIOCM_LOOP)
mcr |= UART_MCR_LOOP;
mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
serial_out(up, UART_MCR, mcr);
}
On Mon, May 14, 2007 at 12:46:27PM -0700, Yinghai Lu wrote:
> Russell King wrote:
> >Still wrong, and unfortunately you haven't understood what I was saying
> >at all because this is worse. ;(
> >
> >Do not put the code in serial8250_set_termios. It is the wrong place.
> >
>
> I don't want to put that there. the problem is serial8250_set_mctrl
> called by will clear DTR bit.
We're at a stalemate then.
--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of:
Russell King wrote:
> On Mon, May 14, 2007 at 12:46:27PM -0700, Yinghai Lu wrote:
>
>> I don't want to put that there. the problem is serial8250_set_mctrl
>> called by will clear DTR bit.
>>
>
> We're at a stalemate then.
>
>
How about put that line into
serial8250_console_setup
or
serial8250_isa_init_ports
YH
Hope format is OK. Sending with KMail Message/Insert File
YH
[PATCH] serial: set DTR in uart for kernel serial console
Some UARTs on other side need host uart DTR is set, otherwise will not
receive char from the host that kernel is runing during kernel boot stage.
BTW:
earlyprintk and early_uart are hard coded to set DTR/RTS.
Signed-off-by: Yinghai Lu <[email protected]>
Cc: Russell King <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 48e259a..a925547 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2397,6 +2397,11 @@ static void __init serial8250_isa_init_ports(void)
up->mcr_force = ALPHA_KLUDGE_MCR;
up->port.ops = &serial8250_pops;
+
+ /* some uarts on other side don't support no flow control. So we set
+ * DTR in host uart to make them happy --- YHLU
+ */
+ up->port.mctrl |= TIOCM_DTR;
}
for (i = 0, up = serial8250_ports;
PATCH] serial: convert early_uart to earlycon for 8250
Beacuse SERIAL_PORT_DFNS is removed from include/asm-i386/serial.h and
include/asm-x86_64/serial.h. the serial8250_ports need to be probed late
in serial initializing stage. the console_init=>serial8250_console_init=>
register_console=>serial8250_console_setup will return -ENDEV, and console
ttyS0 can not be enabled at that time.
need to wait till uart_add_one_port in drivers/serial/serial_core.c to call
register_console to get console ttyS0. that is too late.
Make early_uart to use early_param, so uart console can be used earlier.
Make it to be bootconsole with CON_BOOT flag, so can use console handover
feature. and it will switch to corresponding normal serial console
automatically.
new command line will be:
console=uart8250,io,0x3f8,9600n8
console=uart8250,mmio,0xff5e0000,115200n8
or
earlycon=uart8250,io,0x3f8,9600n8
earlycon=uart8250,mmio,0xff5e0000,115200n8
it will print in very early stage:
Early serial console at I/O port 0x3f8 (options '9600n8')
console [uart0] enabled
later for console it will print:
console handover: boot [uart0] -> real [ttyS0]
Signed-off-by: <[email protected]>
Documentation/kernel-parameters.txt | 12 +++-
arch/i386/kernel/head.S | 8 ++
arch/ia64/kernel/setup.c | 4 -
arch/x86_64/kernel/head.S | 15 ++++-
drivers/serial/8250.c | 26 +--------
drivers/serial/8250_early.c | 103 ++++++++++++++----------------------
drivers/serial/Kconfig | 8 ++
drivers/serial/serial_core.c | 5 +
include/asm-i386/fixmap.h | 2
include/asm-i386/io.h | 13 ++++
include/asm-ia64/io.h | 4 +
include/asm-x86_64/fixmap.h | 4 +
include/asm-x86_64/io.h | 13 ++++
include/linux/console.h | 1
include/linux/serial.h | 6 --
include/linux/serial_8250.h | 3 +
include/linux/serial_core.h | 5 +
init/main.c | 5 +
kernel/printk.c | 17 +++++
19 files changed, 156 insertions(+), 98 deletions(-)
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 09220a1..634d809 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -444,8 +444,16 @@ and is between 256 and 4096 characters. It is defined in the file
Documentation/networking/netconsole.txt for an
alternative.
- uart,io,<addr>[,options]
- uart,mmio,<addr>[,options]
+ uart8250,io,<addr>[,options]
+ uart8250,mmio,<addr>[,options]
+ Start an early, polled-mode console on the 8250/16550
+ UART at the specified I/O port or MMIO address,
+ switching to the matching ttyS device later. The
+ options are the same as for ttyS, above.
+
+ earlycon= [KNL] Output early console device and options.
+ uart8250,io,<addr>[,options]
+ uart8250,mmio,<addr>[,options]
Start an early, polled-mode console on the 8250/16550
UART at the specified I/O port or MMIO address,
switching to the matching ttyS device later. The
diff --git a/arch/i386/kernel/head.S b/arch/i386/kernel/head.S
index f74dfc4..8271466 100644
--- a/arch/i386/kernel/head.S
+++ b/arch/i386/kernel/head.S
@@ -168,6 +168,12 @@ page_pde_offset = (__PAGE_OFFSET >> 20);
.section .init.text,"ax",@progbits
#endif
+ /* Do an early initialization of the fixmap area */
+ movl $(swapper_pg_dir - __PAGE_OFFSET), %edx
+ movl $(swapper_pg_pmd - __PAGE_OFFSET), %eax
+ addl $0x007, %eax /* 0x007 = PRESENT+RW+USER */
+ movl %eax, 4092(%edx)
+
#ifdef CONFIG_SMP
ENTRY(startup_32_smp)
cld
@@ -507,6 +513,8 @@ ENTRY(_stext)
.section ".bss.page_aligned","w"
ENTRY(swapper_pg_dir)
.fill 1024,4,0
+ENTRY(swapper_pg_pmd)
+ .fill 1024,4,0
ENTRY(empty_zero_page)
.fill 4096,1,0
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
index eaa6a24..dd7f95b 100644
--- a/arch/ia64/kernel/setup.c
+++ b/arch/ia64/kernel/setup.c
@@ -390,10 +390,6 @@ early_console_setup (char *cmdline)
if (!efi_setup_pcdp_console(cmdline))
earlycons++;
#endif
-#ifdef CONFIG_SERIAL_8250_CONSOLE
- if (!early_serial_console_init(cmdline))
- earlycons++;
-#endif
return (earlycons) ? 0 : -1;
}
diff --git a/arch/x86_64/kernel/head.S b/arch/x86_64/kernel/head.S
index 1fab487..941c84b 100644
--- a/arch/x86_64/kernel/head.S
+++ b/arch/x86_64/kernel/head.S
@@ -73,7 +73,11 @@ startup_64:
addq %rbp, init_level4_pgt + (511*8)(%rip)
addq %rbp, level3_ident_pgt + 0(%rip)
+
addq %rbp, level3_kernel_pgt + (510*8)(%rip)
+ addq %rbp, level3_kernel_pgt + (511*8)(%rip)
+
+ addq %rbp, level2_fixmap_pgt + (506*8)(%rip)
/* Add an Identity mapping if I am above 1G */
leaq _text(%rip), %rdi
@@ -314,7 +318,16 @@ NEXT_PAGE(level3_kernel_pgt)
.fill 510,8,0
/* (2^48-(2*1024*1024*1024)-((2^39)*511))/(2^30) = 510 */
.quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE
- .fill 1,8,0
+ .quad level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE
+
+NEXT_PAGE(level2_fixmap_pgt)
+ .fill 506,8,0
+ .quad level1_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE
+ /* 8MB reserved for vsyscalls + a 2MB hole = 4 + 1 entries */
+ .fill 5,8,0
+
+NEXT_PAGE(level1_fixmap_pgt)
+ .fill 512,8,0
NEXT_PAGE(level2_ident_pgt)
/* Since I easily can, map the first 1G.
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index c84dab0..e341fb9 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2367,6 +2367,9 @@ static struct uart_ops serial8250_pops = {
.request_port = serial8250_request_port,
.config_port = serial8250_config_port,
.verify_port = serial8250_verify_port,
+#ifdef CONFIG_SERIAL_8250_CONSOLE
+ .find_port_for_earlycon = serial8250_find_port_for_earlycon,
+#endif
};
static struct uart_8250_port serial8250_ports[UART_NR];
@@ -2402,6 +2405,7 @@ static void __init serial8250_isa_init_ports(void)
for (i = 0, up = serial8250_ports;
i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
i++, up++) {
+ printk(KERN_INFO "serial8250_isa_init_ports 2 idx=%d\n",i);
up->port.iobase = old_serial_port[i].port;
up->port.irq = irq_canonicalize(old_serial_port[i].irq);
up->port.uartclk = old_serial_port[i].baud_base * 16;
@@ -2533,7 +2537,7 @@ static int __init serial8250_console_init(void)
}
console_initcall(serial8250_console_init);
-static int __init find_port(struct uart_port *p)
+int __init find_port_serial8250(struct uart_port *p)
{
int line;
struct uart_port *port;
@@ -2546,26 +2550,6 @@ static int __init find_port(struct uart_port *p)
return -ENODEV;
}
-int __init serial8250_start_console(struct uart_port *port, char *options)
-{
- int line;
-
- line = find_port(port);
- if (line < 0)
- return -ENODEV;
-
- add_preferred_console("ttyS", line, options);
- printk("Adding console on ttyS%d at %s 0x%lx (options '%s')\n",
- line, port->iotype == UPIO_MEM ? "MMIO" : "I/O port",
- port->iotype == UPIO_MEM ? (unsigned long) port->mapbase :
- (unsigned long) port->iobase, options);
- if (!(serial8250_console.flags & CON_ENABLED)) {
- serial8250_console.flags &= ~CON_PRINTBUFFER;
- register_console(&serial8250_console);
- }
- return line;
-}
-
#define SERIAL8250_CONSOLE &serial8250_console
#else
#define SERIAL8250_CONSOLE NULL
diff --git a/drivers/serial/8250_early.c b/drivers/serial/8250_early.c
index 7e51119..7063a81 100644
--- a/drivers/serial/8250_early.c
+++ b/drivers/serial/8250_early.c
@@ -17,13 +17,11 @@
* we locate the device directly by its MMIO or I/O port address.
*
* The user can specify the device directly, e.g.,
- * console=uart,io,0x3f8,9600n8
- * console=uart,mmio,0xff5e0000,115200n8
- * or platform code can call early_uart_console_init() to set
- * the early UART device.
- *
- * After the normal serial driver starts, we try to locate the
- * matching ttyS device and start a console there.
+ * earlycon=uart8250,io,0x3f8,9600n8
+ * earlycon=uart8250,mmio,0xff5e0000,115200n8
+ * or
+ * console=uart8250,io,0x3f8,9600n8
+ * console=uart8250,mmio,0xff5e0000,115200n8
*/
#include <linux/tty.h>
@@ -32,17 +30,17 @@
#include <linux/serial_core.h>
#include <linux/serial_reg.h>
#include <linux/serial.h>
+#include <linux/serial_8250.h>
#include <asm/io.h>
#include <asm/serial.h>
-struct early_uart_device {
+struct early_serial8250_device {
struct uart_port port;
char options[16]; /* e.g., 115200n8 */
unsigned int baud;
};
-static struct early_uart_device early_device __initdata;
-static int early_uart_registered __initdata;
+static struct early_serial8250_device early_device __initdata;
static unsigned int __init serial_in(struct uart_port *port, int offset)
{
@@ -80,7 +78,7 @@ static void __init putc(struct uart_port *port, int c)
serial_out(port, UART_TX, c);
}
-static void __init early_uart_write(struct console *console, const char *s, unsigned int count)
+static void __init early_serial8250_write(struct console *console, const char *s, unsigned int count)
{
struct uart_port *port = &early_device.port;
unsigned int ier;
@@ -111,7 +109,7 @@ static unsigned int __init probe_baud(struct uart_port *port)
return (port->uartclk / 16) / quot;
}
-static void __init init_port(struct early_uart_device *device)
+static void __init init_port(struct early_serial8250_device *device)
{
struct uart_port *port = &device->port;
unsigned int divisor;
@@ -130,10 +128,9 @@ static void __init init_port(struct early_uart_device *device)
serial_out(port, UART_LCR, c & ~UART_LCR_DLAB);
}
-static int __init parse_options(struct early_uart_device *device, char *options)
+static int __init parse_options(struct early_serial8250_device *device, char *options)
{
struct uart_port *port = &device->port;
- int mapsize = 64;
int mmio, length;
if (!options)
@@ -143,12 +140,7 @@ static int __init parse_options(struct early_uart_device *device, char *options)
if (!strncmp(options, "mmio,", 5)) {
port->iotype = UPIO_MEM;
port->mapbase = simple_strtoul(options + 5, &options, 0);
- port->membase = ioremap(port->mapbase, mapsize);
- if (!port->membase) {
- printk(KERN_ERR "%s: Couldn't ioremap 0x%lx\n",
- __FUNCTION__, port->mapbase);
- return -ENOMEM;
- }
+ port->membase = fix_ioremap(FIX_EARLYCON_MEM_BASE, port->mapbase);
mmio = 1;
} else if (!strncmp(options, "io,", 3)) {
port->iotype = UPIO_PORT;
@@ -175,9 +167,16 @@ static int __init parse_options(struct early_uart_device *device, char *options)
return 0;
}
-static int __init early_uart_setup(struct console *console, char *options)
+static struct console early_serial8250_console __initdata = {
+ .name = "uart",
+ .write = early_serial8250_write,
+ .flags = CON_PRINTBUFFER,
+ .index = -1,
+};
+
+static int __init early_serial8250_setup(char *options)
{
- struct early_uart_device *device = &early_device;
+ struct early_serial8250_device *device = &early_device;
int err;
if (device->port.membase || device->port.iobase)
@@ -190,61 +189,43 @@ static int __init early_uart_setup(struct console *console, char *options)
return 0;
}
-static struct console early_uart_console __initdata = {
- .name = "uart",
- .write = early_uart_write,
- .setup = early_uart_setup,
- .flags = CON_PRINTBUFFER,
- .index = -1,
-};
-
-static int __init early_uart_console_init(void)
-{
- if (!early_uart_registered) {
- register_console(&early_uart_console);
- early_uart_registered = 1;
- }
- return 0;
-}
-console_initcall(early_uart_console_init);
-
-int __init early_serial_console_init(char *cmdline)
+static int __init setup_early_serial8250_console(char *cmdline)
{
char *options;
int err;
- options = strstr(cmdline, "console=uart,");
+ options = strstr(cmdline, "uart8250,");
if (!options)
- return -ENODEV;
+ return 0;
options = strchr(cmdline, ',') + 1;
- if ((err = early_uart_setup(NULL, options)) < 0)
+ if ((err = early_serial8250_setup(options)) < 0)
return err;
- return early_uart_console_init();
+
+ early_serial8250_console.flags |= CON_BOOT;
+ register_console(&early_serial8250_console);
+
+ /* add one dummy entry in console_cmdline*/
+ add_preferred_console("ttyS", 255, early_device.options);
+
+ return 0;
}
-static int __init early_uart_console_switch(void)
+int serial8250_find_port_for_earlycon(void)
{
- struct early_uart_device *device = &early_device;
+ struct early_serial8250_device *device = &early_device;
struct uart_port *port = &device->port;
- int mmio, line;
+ int line;
- if (!(early_uart_console.flags & CON_ENABLED))
- return 0;
+ line = find_port_serial8250(port);
- /* Try to start the normal driver on a matching line. */
- mmio = (port->iotype == UPIO_MEM);
- line = serial8250_start_console(port, device->options);
if (line < 0)
- printk("No ttyS device at %s 0x%lx for console\n",
- mmio ? "MMIO" : "I/O port",
- mmio ? port->mapbase :
- (unsigned long) port->iobase);
+ return -ENODEV;
- unregister_console(&early_uart_console);
- if (mmio)
- iounmap(port->membase);
+ /* update the dummy entry to what we want console type */
+ update_console_cmdline_console_index("ttyS", 255, line);
return 0;
}
-late_initcall(early_uart_console_switch);
+
+early_param("earlycon", setup_early_serial8250_console);
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 315ea99..4206ace 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -62,6 +62,14 @@ config SERIAL_8250_CONSOLE
kernel will automatically use the first serial line, /dev/ttyS0, as
system console.
+ you can set that using a kernel command line option such as
+ "earlycon=uart8250,io,0x3f8,9600n8"
+ "earlycon=uart8250,mmio,0xff5e0000,115200n8" or
+ "console=uart8250,io,0x3f8,9600n8"
+ "console=uart8250,mmio,0xff5e0000,115200n8".
+ and it will switch to normal serial console when correponding port is
+ ready.
+
If unsure, say N.
config SERIAL_8250_GSC
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 326020f..4f60767 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -2303,8 +2303,11 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *port)
* It may be that the port was not available.
*/
if (port->type != PORT_UNKNOWN &&
- port->cons && !(port->cons->flags & CON_ENABLED))
+ port->cons && !(port->cons->flags & CON_ENABLED)) {
+ if(port->ops && port->ops->find_port_for_earlycon)
+ port->ops->find_port_for_earlycon();
register_console(port->cons);
+ }
/*
* Ensure UPF_DEAD is not set.
diff --git a/include/asm-i386/fixmap.h b/include/asm-i386/fixmap.h
index 80ea052..249e753 100644
--- a/include/asm-i386/fixmap.h
+++ b/include/asm-i386/fixmap.h
@@ -54,6 +54,8 @@ extern unsigned long __FIXADDR_TOP;
enum fixed_addresses {
FIX_HOLE,
FIX_VDSO,
+ FIX_DBGP_BASE,
+ FIX_EARLYCON_MEM_BASE,
#ifdef CONFIG_X86_LOCAL_APIC
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
#endif
diff --git a/include/asm-i386/io.h b/include/asm-i386/io.h
index e797586..6c8748d 100644
--- a/include/asm-i386/io.h
+++ b/include/asm-i386/io.h
@@ -130,6 +130,19 @@ extern void iounmap(volatile void __iomem *addr);
extern void *bt_ioremap(unsigned long offset, unsigned long size);
extern void bt_iounmap(void *addr, unsigned long size);
+#include <asm/pgtable.h>
+#include <asm/fixmap.h>
+
+static inline void __iomem * fix_ioremap (unsigned idx, unsigned long phys)
+{
+ void __iomem * vaddr;
+ set_fixmap_nocache(idx, phys & PAGE_MASK);
+ vaddr = (void __iomem *)__fix_to_virt(idx);
+ vaddr += phys & ~PAGE_MASK;
+
+ return vaddr;
+}
+
/* Use early IO mappings for DMI because it's initialized early */
#define dmi_ioremap bt_ioremap
#define dmi_iounmap bt_iounmap
diff --git a/include/asm-ia64/io.h b/include/asm-ia64/io.h
index eb17a86..e29eaf8 100644
--- a/include/asm-ia64/io.h
+++ b/include/asm-ia64/io.h
@@ -423,6 +423,10 @@ extern void __iomem * ioremap(unsigned long offset, unsigned long size);
extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);
extern void iounmap (volatile void __iomem *addr);
+/* for console=uart8250,mmio,0xffe5000,9600n8 */
+#define FIX_EARLYCON_MEM_BASE 1
+#define fix_ioremap(idx, phys) ioremap(phys, 64)
+
/* Use normal IO mappings for DMI */
#define dmi_ioremap ioremap
#define dmi_iounmap(x,l) iounmap(x)
diff --git a/include/asm-x86_64/fixmap.h b/include/asm-x86_64/fixmap.h
index e90e167..2acb9b7 100644
--- a/include/asm-x86_64/fixmap.h
+++ b/include/asm-x86_64/fixmap.h
@@ -35,6 +35,8 @@ enum fixed_addresses {
VSYSCALL_LAST_PAGE,
VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE + ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1,
VSYSCALL_HPET,
+ FIX_DBGP_BASE,
+ FIX_EARLYCON_MEM_BASE,
FIX_HPET_BASE,
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
FIX_IO_APIC_BASE_0,
@@ -84,7 +86,7 @@ static __always_inline unsigned long fix_to_virt(const unsigned int idx)
if (idx >= __end_of_fixed_addresses)
__this_fixmap_does_not_exist();
- return __fix_to_virt(idx);
+ return __fix_to_virt(idx);
}
#endif
diff --git a/include/asm-x86_64/io.h b/include/asm-x86_64/io.h
index de2cd9a..e2d66de 100644
--- a/include/asm-x86_64/io.h
+++ b/include/asm-x86_64/io.h
@@ -145,6 +145,19 @@ extern void early_iounmap(void *addr, unsigned long size);
extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);
extern void iounmap(volatile void __iomem *addr);
+#include <asm/pgtable.h>
+#include <asm/fixmap.h>
+
+static inline void __iomem * fix_ioremap (unsigned idx, unsigned long phys)
+{
+ void __iomem * vaddr;
+ set_fixmap_nocache(idx, phys & PAGE_MASK);
+ vaddr = (void __iomem *)__fix_to_virt(idx);
+ vaddr += phys & ~PAGE_MASK;
+
+ return vaddr;
+}
+
/*
* ISA I/O bus memory addresses are 1:1 with the physical address.
*/
diff --git a/include/linux/console.h b/include/linux/console.h
index 62ef6e1..4cb7749 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -107,6 +107,7 @@ struct console {
};
extern int add_preferred_console(char *name, int idx, char *options);
+extern int update_console_cmdline_console_index(char *name, int idx_old, int idx_new);
extern void register_console(struct console *);
extern int unregister_console(struct console *);
extern struct console *console_drivers;
diff --git a/include/linux/serial.h b/include/linux/serial.h
index 33fc8cb..deb7143 100644
--- a/include/linux/serial.h
+++ b/include/linux/serial.h
@@ -177,11 +177,5 @@ struct serial_icounter_struct {
#ifdef __KERNEL__
#include <linux/compiler.h>
-/* Allow architectures to override entries in serial8250_ports[] at run time: */
-struct uart_port; /* forward declaration */
-extern int early_serial_setup(struct uart_port *port);
-extern int early_serial_console_init(char *options);
-extern int serial8250_start_console(struct uart_port *port, char *options);
-
#endif /* __KERNEL__ */
#endif /* _LINUX_SERIAL_H */
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h
index 71310d8..0d79fc5 100644
--- a/include/linux/serial_8250.h
+++ b/include/linux/serial_8250.h
@@ -60,4 +60,7 @@ void serial8250_unregister_port(int line);
void serial8250_suspend_port(int line);
void serial8250_resume_port(int line);
+extern int find_port_serial8250(struct uart_port *p);
+extern int serial8250_find_port_for_earlycon(void);
+
#endif
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index a3ac4c8..ac2b13c 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -199,6 +199,11 @@ struct uart_ops {
void (*config_port)(struct uart_port *, int);
int (*verify_port)(struct uart_port *, struct serial_struct *);
int (*ioctl)(struct uart_port *, unsigned int, unsigned long);
+
+ /*
+ * for earlycon to console switch
+ */
+ int (*find_port_for_earlycon)(void);
};
#define UART_CONFIG_TYPE (1 << 0)
diff --git a/init/main.c b/init/main.c
index eb8bdba..58dbe75 100644
--- a/init/main.c
+++ b/init/main.c
@@ -452,7 +452,10 @@ static int __init do_early_param(char *param, char *val)
struct obs_kernel_param *p;
for (p = __setup_start; p < __setup_end; p++) {
- if (p->early && strcmp(param, p->str) == 0) {
+ if ((p->early && strcmp(param, p->str) == 0) ||
+ (strcmp(param, "console") == 0 &&
+ strcmp(p->str, "earlycon") == 0)
+ ) {
if (p->setup_func(val) != 0)
printk(KERN_WARNING
"Malformed early option '%s'\n", param);
diff --git a/kernel/printk.c b/kernel/printk.c
index 0bbdeac..8f3d91e 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -726,6 +726,20 @@ int __init add_preferred_console(char *name, int idx, char *options)
return 0;
}
+int __init update_console_cmdline_console_index(char *name, int idx_old, int idx_new)
+{
+ int i;
+
+ for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
+ if (strcmp(console_cmdline[i].name, name) == 0 &&
+ console_cmdline[i].index == idx_old) {
+ console_cmdline[i].index = idx_new;
+ return 0;
+ }
+
+ return 0;
+}
+
#ifndef CONFIG_DISABLE_CONSOLE_SUSPEND
/**
* suspend_console - suspend the console subsystem
@@ -991,6 +1005,9 @@ void register_console(struct console *console)
console->name, console->index);
unregister_console(bootconsole);
console->flags &= ~CON_PRINTBUFFER;
+ } else {
+ printk(KERN_INFO "console [%s%d] enabled\n",
+ console->name, console->index);
}
/*
I can't comment on the arch specific bits. As a general note, I think
this is over complex. For instance, the additional hook in serial_core
to call the find_port_for_earlycon method isn't needed because you can
call serial8250_find_port_for_earlycon() from within
serial8250_console_setup(). You can also modify co->index from
within there without needing update_console_cmdline_console_index().
Bjorn needs to review the 8250_early changes.
Apart from that, two other comments:
On Tue, May 22, 2007 at 12:31:59PM -0700, Yinghai Lu wrote:
> diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
> index c84dab0..e341fb9 100644
> --- a/drivers/serial/8250.c
> +++ b/drivers/serial/8250.c
> @@ -2402,6 +2405,7 @@ static void __init serial8250_isa_init_ports(void)
> for (i = 0, up = serial8250_ports;
> i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
> i++, up++) {
> + printk(KERN_INFO "serial8250_isa_init_ports 2 idx=%d\n",i);
Is this a debugging printk?
> up->port.iobase = old_serial_port[i].port;
> up->port.irq = irq_canonicalize(old_serial_port[i].irq);
> up->port.uartclk = old_serial_port[i].baud_base * 16;
> @@ -2533,7 +2537,7 @@ static int __init serial8250_console_init(void)
> }
> console_initcall(serial8250_console_init);
>
> -static int __init find_port(struct uart_port *p)
> +int __init find_port_serial8250(struct uart_port *p)
If this is going to become globally visible, please name it
serial8250_find_port to match the style of the rest of the file.
> {
> int line;
> struct uart_port *port;
> diff --git a/include/linux/serial.h b/include/linux/serial.h
> index 33fc8cb..deb7143 100644
> --- a/include/linux/serial.h
> +++ b/include/linux/serial.h
> @@ -177,11 +177,5 @@ struct serial_icounter_struct {
> #ifdef __KERNEL__
> #include <linux/compiler.h>
>
> -/* Allow architectures to override entries in serial8250_ports[] at run time: */
> -struct uart_port; /* forward declaration */
> -extern int early_serial_setup(struct uart_port *port);
> -extern int early_serial_console_init(char *options);
> -extern int serial8250_start_console(struct uart_port *port, char *options);
> -
> #endif /* __KERNEL__ */
> #endif /* _LINUX_SERIAL_H */
Good - this needed to be killed.
--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of:
On 5/28/07, Russell King <[email protected]> wrote:
> I can't comment on the arch specific bits. As a general note, I think
> this is over complex. For instance, the additional hook in serial_core
> to call the find_port_for_earlycon method isn't needed because you can
> call serial8250_find_port_for_earlycon() from within
> serial8250_console_setup(). You can also modify co->index from
> within there without needing update_console_cmdline_console_index().
Good point, I will try to remove that hook.
>
> Bjorn needs to review the 8250_early changes.
>
> Apart from that, two other comments:
>
> On Tue, May 22, 2007 at 12:31:59PM -0700, Yinghai Lu wrote:
> > diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
> > index c84dab0..e341fb9 100644
> > --- a/drivers/serial/8250.c
> > +++ b/drivers/serial/8250.c
> > @@ -2402,6 +2405,7 @@ static void __init serial8250_isa_init_ports(void)
> > for (i = 0, up = serial8250_ports;
> > i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
> > i++, up++) {
> > + printk(KERN_INFO "serial8250_isa_init_ports 2 idx=%d\n",i);
>
> Is this a debugging printk?
Oh.
>
> > up->port.iobase = old_serial_port[i].port;
> > up->port.irq = irq_canonicalize(old_serial_port[i].irq);
> > up->port.uartclk = old_serial_port[i].baud_base * 16;
> > @@ -2533,7 +2537,7 @@ static int __init serial8250_console_init(void)
> > }
> > console_initcall(serial8250_console_init);
> >
> > -static int __init find_port(struct uart_port *p)
> > +int __init find_port_serial8250(struct uart_port *p)
>
> If this is going to become globally visible, please name it
> serial8250_find_port to match the style of the rest of the file.
I see.
YH