On 07/31/2010 02:02 PM, H. Peter Anvin wrote:
> On 07/31/2010 11:32 AM, Cyrill Gorcunov wrote:
>>>
>>> No, this is the internal part of the boot protocol, so it's not an issue.
>>>
>>
>> Peter, I didn't mean any issue here, I meant that bootloaders don't know 
>> about
>> this field yet and they will have to update own sources to pass port value
>> at proper place of boot params. Or I miss something?
>>
> 
> Boot loaders that use the 16-bit entry point are unaffected.
> 
> Boot loaders which use the 32-bit entry point but properly clears the
> zero page simply will not have the feature.
> 
> Boot loaders which use the 32-bit entry point but doesn't clear the zero
> page are broken.
> 
can you if this one is right for kexec path?

Thanks

Yinghai

[PATCH] kexec-tools: pass serial console base for early console in kernel

when kexec is used with "console_serial", set serial_console_port_base in 
boot_params.

Signed-off-by: Yinghai Lu <[email protected]>

---
 doc/linux-i386-zero-page.txt      |    1 +
 include/x86/x86-linux.h           |    3 ++-
 kexec/arch/i386/kexec-x86.h       |    1 +
 kexec/arch/i386/x86-linux-setup.c |    4 ++++
 kexec/arch/x86_64/kexec-x86_64.c  |    9 +--------
 5 files changed, 9 insertions(+), 9 deletions(-)

Index: kexec-tools/doc/linux-i386-zero-page.txt
===================================================================
--- kexec-tools.orig/doc/linux-i386-zero-page.txt
+++ kexec-tools/doc/linux-i386-zero-page.txt
@@ -22,6 +22,7 @@ Offset        Type            Description
                          0x90000 + contents of CL_OFFSET
                        (only taken, when CL_MAGIC = 0xA33F)
  0x40  20 bytes        struct apm_bios_info, APM_BIOS_INFO
+ 0x54   2 bytes                serial console base
  0x60  16 bytes        Intel SpeedStep (IST) BIOS support information
  0x80  16 bytes        hd0-disk-parameter from intvector 0x41
  0x90  16 bytes        hd1-disk-parameter from intvector 0x46
Index: kexec-tools/include/x86/x86-linux.h
===================================================================
--- kexec-tools.orig/include/x86/x86-linux.h
+++ kexec-tools/include/x86/x86-linux.h
@@ -40,7 +40,6 @@ struct apm_bios_info {
        uint16_t cseg_len;      /* 0x4e */
        uint16_t cseg_16_len;   /* 0x50 */
        uint16_t dseg_len;      /* 0x52 */
-       uint8_t  reserved[44];  /* 0x54 */
 };
 
 /*
@@ -105,6 +104,8 @@ struct x86_linux_param_header {
        uint8_t  reserved4[12];                 /* 0x34 -- 0x3f reserved for 
future expansion */
 
        struct apm_bios_info apm_bios_info;     /* 0x40 */
+       uint16_t  serial_console_port_base;     /* 0x54 */
+       uint8_t  reserved41[42];                /* 0x56 */
        struct drive_info_struct drive_info;    /* 0x80 */
        struct sys_desc_table sys_desc_table;   /* 0xa0 */
        uint32_t alt_mem_k;                     /* 0x1e0 */
Index: kexec-tools/kexec/arch/i386/x86-linux-setup.c
===================================================================
--- kexec-tools.orig/kexec/arch/i386/x86-linux-setup.c
+++ kexec-tools/kexec/arch/i386/x86-linux-setup.c
@@ -100,6 +100,9 @@ void setup_linux_bootloader_parameters(
        cmdline_ptr = ((char *)real_mode) + cmdline_offset;
        memcpy(cmdline_ptr, cmdline, cmdline_len);
        cmdline_ptr[cmdline_len - 1] = '\0';
+
+       if (arch_options.console_serial)
+               real_mode->serial_console_port_base = arch_options.serial_base;
 }
 
 int setup_linux_vesafb(struct x86_linux_param_header *real_mode)
@@ -422,6 +425,7 @@ void setup_linux_system_parameters(struc
 
        /* Default APM info */
        memset(&real_mode->apm_bios_info, 0, sizeof(real_mode->apm_bios_info));
+
        /* Default drive info */
        memset(&real_mode->drive_info, 0, sizeof(real_mode->drive_info));
        /* Default sysdesc table */
Index: kexec-tools/kexec/arch/i386/kexec-x86.h
===================================================================
--- kexec-tools.orig/kexec/arch/i386/kexec-x86.h
+++ kexec-tools/kexec/arch/i386/kexec-x86.h
@@ -51,6 +51,7 @@ struct arch_options_t {
        uint8_t         console_serial;
        enum coretype   core_header_type;
 };
+extern struct arch_options_t arch_options;
 
 int multiboot_x86_probe(const char *buf, off_t len);
 int multiboot_x86_load(int argc, char **argv, const char *buf, off_t len,
Index: kexec-tools/kexec/arch/x86_64/kexec-x86_64.c
===================================================================
--- kexec-tools.orig/kexec/arch/x86_64/kexec-x86_64.c
+++ kexec-tools/kexec/arch/x86_64/kexec-x86_64.c
@@ -55,14 +55,7 @@ void arch_usage(void)
                );
 }
 
-static struct {
-       uint8_t  reset_vga;
-       uint16_t serial_base;
-       uint32_t serial_baud;
-       uint8_t  console_vga;
-       uint8_t  console_serial;
-       int core_header_type;
-} arch_options = {
+struct arch_options_t arch_options = {
        .reset_vga   = 0,
        .serial_base = 0x3f8,
        .serial_baud = 0,

_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to