Re: [PATCH v2 1/3] x86, boot: add mmio serial during compressed boot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jul 12, 2013 at 11:47 PM, Yinghai Lu <yinghai@xxxxxxxxxx> wrote:
> On Fri, Jul 12, 2013 at 1:38 PM, Kees Cook <keescook@xxxxxxxxxxxx> wrote:
>> Allows "console=uart[8250],mmio[32],0xADDR[,BAUDn8[,BASE_BAUD]]" to
>> be recognized during compressed boot early console setup, and during
>> boot console setup. Replaces defines with common serial defines. Adds
>> suport for mmio-based serial devices to compressed-boot early console,
>> and plumbs support for defining the base baud rate for UART clock
>> calculations (since mmio serial cards may not have the standard rate,
>> resulting in incorrect baud rates for mmio devices).
>>
>> Signed-off-by: Kees Cook <keescook@xxxxxxxxxxxx>
>> ---
>> v2:
>>  - fixed typo in SERIAL_RSA_...
>> ---
>>  Documentation/kernel-parameters.txt             |   12 ++-
>>  arch/x86/boot/boot.h                            |   20 +++-
>>  arch/x86/boot/compressed/early_serial_console.c |    5 +-
>>  arch/x86/boot/compressed/misc.c                 |   10 +-
>>  arch/x86/boot/compressed/misc.h                 |    4 +-
>>  arch/x86/boot/early_serial_console.c            |  122 +++++++++++++----------
>>  arch/x86/boot/early_serial_console.h            |   43 ++++++++
>>  arch/x86/boot/tty.c                             |   12 +--
>>  drivers/tty/serial/8250/8250_early.c            |   11 +-
>>  include/uapi/linux/serial_reg.h                 |    5 +-
>>  10 files changed, 168 insertions(+), 76 deletions(-)
>>  create mode 100644 arch/x86/boot/early_serial_console.h
>>
>> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
>> index 15356ac..52ad7d8 100644
>> --- a/Documentation/kernel-parameters.txt
>> +++ b/Documentation/kernel-parameters.txt
>> @@ -575,11 +575,21 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
>>                         alternative.
>>
>>                 uart[8250],io,<addr>[,options]
>> -               uart[8250],mmio,<addr>[,options]
>> +               uart[8250],mmio,<addr>[,options[,base_baud]]
>>                         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.
>> +
>> +                       For x86 early boot mmio uart consoles, the base baud
>> +                       rate (for calculating the UART clock) can be defined
>> +                       as well. This is done after the options above, comma
>> +                       separated. For example "...,115200n8,4000000" would
>> +                       use 4000000 as the base baud rate. Once the real uart
>> +                       driver initializes, this value will be ignored, since
>> +                       it will use the known device-specific value instead.
>> +                       The default is 115200.
>> +
>>                 hvc<n>  Use the hypervisor console device <n>. This is for
>>                         both Xen and PowerPC hypervisors.
>>
>> diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h
>> index 5b75319..ae61c19 100644
>> --- a/arch/x86/boot/boot.h
>> +++ b/arch/x86/boot/boot.h
>> @@ -80,6 +80,23 @@ static inline void io_delay(void)
>>         asm volatile("outb %%al,%0" : : "dN" (DELAY_PORT));
>>  }
>>
>> +/* Minimal mmio functions from include/asm/io.h. */
>> +#define build_mmio_read(name, size, type, reg, barrier) \
>> +static inline type name(const volatile void __iomem *addr) \
>> +{ type ret; asm volatile("mov" size " %1,%0":reg (ret) \
>> +:"m" (*(volatile type __force *)addr) barrier); return ret; }
>> +
>> +#define build_mmio_write(name, size, type, reg, barrier) \
>> +static inline void name(type val, volatile void __iomem *addr) \
>> +{ asm volatile("mov" size " %0,%1": :reg (val), \
>> +"m" (*(volatile type __force *)addr) barrier); }
>> +
>> +build_mmio_read(readb, "b", unsigned char, "=q", :"memory")
>> +build_mmio_read(readl, "l", unsigned int, "=r", :"memory")
>> +
>> +build_mmio_write(writeb, "b", unsigned char, "q", :"memory")
>> +build_mmio_write(writel, "l", unsigned int, "r", :"memory")
>> +
>>  /* These functions are used to reference data in other segments. */
>>
>>  static inline u16 ds(void)
>> @@ -319,7 +336,8 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr);
>>  int validate_cpu(void);
>>
>>  /* early_serial_console.c */
>> -extern int early_serial_base;
>> +extern unsigned long early_serial_base;
>> +extern int early_serial_type;
>>  void console_init(void);
>
> so the mmio range is under 4G.
>
> for 32 bit, that is ok.
> for 64 bit via 32bit bootloader, arch/x86/boot/compressed/head_64.S
> will set page table for first 4G still ok.
> for 64 bit via 64bit loader, like kexec via bzImage64, First Kernel/Kexec only
> set ident mapping for usable range, so mmio just under 64 is not mapped.
>
> Looks like we need to update boot.txt to add requirement for 64bit bootloader
> that 0-4G need to be all ident mapping?

Could the first step be documenting the limitation? I've found this
patch extremely useful for my case already, and I imagine there might
be other people that need the early mmio stuff to. Generally the
compressed boot serial console stuff is going to be used in the more
common non-kexec situations at least for a while.

Does this patch create any _problems_? Right now, neither low nor >4G
kernel can use an mmio serial port. :) This this, we'd at least gain
it for the low case.

-Kees

--
Kees Cook
Chrome OS Security
--
To unsubscribe from this list: send the line "unsubscribe linux-doc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux