On Thu, Sep 21, 2006 at 01:06:08PM +0800, Zou Nan hai wrote: > SN platform support PIO in a different way to generic IA64 platform. It > does not support most of the legacy I/O ports. > > Give an --noio option to kexec-tools to disable I/O in purgatory code. > > This patch also removed an unused io.h in kexec-tools. > > Signed-off-by: Zou Nan hai I have merged the following into kexec-tools-test. -- Horms H: http://www.vergenet.net/~horms/ W: http://www.valinux.co.jp/en/ From: Zou Nan hai Date: 21 Sep 2006 13:06:08 +0800 Subject: kexec-tools: --noio option to disable I/O in purgatory code. SN platform support PIO in a different way to generic IA64 platform. It does not support most of the legacy I/O ports. Give an --noio option to kexec-tools to disable I/O in purgatory code. This patch also removed an unused io.h in kexec-tools. Signed-off-by: Zou Nan hai Edited to consistently use tabs instead of spaces for intentation, remove one instance of trailing whitespace, and fix indentation of noio line in options[]. Signed-off-by: Simon Horman diff -Nraup kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c kexec-tools-1.101-fix/kexec/arch/ia64/kexec-elf-ia64.c --- kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c 2006-09-20 15:30:40.000000000 +0800 +++ kexec-tools-1.101-fix/kexec/arch/ia64/kexec-elf-ia64.c 2006-09-21 15:12:20.000000000 +0800 @@ -116,16 +116,19 @@ int elf_ia64_load(int argc, char **argv, unsigned long command_line_base, ramdisk_base; unsigned long efi_memmap_base, efi_memmap_size; unsigned long boot_param_base; + unsigned long noio=0; int result; int opt; char *efi_memmap_buf, *boot_param; #define OPT_APPEND (OPT_ARCH_MAX+0) #define OPT_RAMDISK (OPT_ARCH_MAX+1) +#define OPT_NOIO (OPT_ARCH_MAX+2) static const struct option options[] = { KEXEC_ARCH_OPTIONS {"command-line", 1, 0, OPT_APPEND}, {"append", 1, 0, OPT_APPEND}, {"initrd", 1, 0, OPT_RAMDISK}, + {"noio", 1, 0, OPT_NOIO}, {0, 0, 0, 0}, }; @@ -148,6 +151,9 @@ int elf_ia64_load(int argc, char **argv, case OPT_RAMDISK: ramdisk = optarg; break; + case OPT_NOIO: /* disable PIO and MMIO in purgatory code*/ + noio = 1; + break; } } command_line_len = 0; @@ -196,6 +202,10 @@ int elf_ia64_load(int argc, char **argv, boot_param = xmalloc(4096); boot_param_base = add_buffer(info, boot_param, 4096, 4096, 4096, 0, max_addr, -1); + + elf_rel_set_symbol(&info->rhdr, "__noio", + &noio, sizeof(long)); + elf_rel_set_symbol(&info->rhdr, "__boot_param_base", &boot_param_base, sizeof(long)); diff -Nraup kexec-tools-1.101/purgatory/arch/ia64/entry.S kexec-tools-1.101-fix/purgatory/arch/ia64/entry.S --- kexec-tools-1.101/purgatory/arch/ia64/entry.S 2006-09-20 15:30:40.000000000 +0800 +++ kexec-tools-1.101-fix/purgatory/arch/ia64/entry.S 2006-09-21 15:11:36.000000000 +0800 @@ -68,3 +68,4 @@ DECLARE_DATA8(__loaded_segments) DECLARE_DATA8(__loaded_segments_num) DECLARE_DATA8(__gp_value) +DECLARE_DATA8(__noio) diff -Nraup kexec-tools-1.101/purgatory/arch/ia64/include/arch/io.h kexec-tools-1.101-fix/purgatory/arch/ia64/include/arch/io.h --- kexec-tools-1.101/purgatory/arch/ia64/include/arch/io.h 2006-09-20 15:29:29.000000000 +0800 +++ kexec-tools-1.101-fix/purgatory/arch/ia64/include/arch/io.h 1970-01-01 08:00:00.000000000 +0800 @@ -1,25 +0,0 @@ -#ifndef ARCH_IO_H -#define ARCH_IO_H - -#include -/* Helper functions for directly doing I/O */ - -extern inline uint8_t inb(void *port) -{ - volatile unsigned char *addr = (unsigned char *)port; - uint8_t result; - - result = *addr; - asm volatile ("mf.a"::: "memory"); - return result; -} - -extern inline void outb (uint8_t value, void *port) -{ - volatile unsigned char *addr = (unsigned char *)port; - - *addr = value; - asm volatile ("mf.a"::: "memory"); -} - -#endif /* ARCH_IO_H */ diff -Nraup kexec-tools-1.101/purgatory/arch/ia64/io.h kexec-tools-1.101-fix/purgatory/arch/ia64/io.h --- kexec-tools-1.101/purgatory/arch/ia64/io.h 2006-09-20 15:29:29.000000000 +0800 +++ kexec-tools-1.101-fix/purgatory/arch/ia64/io.h 2006-09-21 15:11:19.000000000 +0800 @@ -3,7 +3,7 @@ #define UNCACHED(x) (void *)((x)|(1UL<<63)) #define MF() asm volatile ("mf.a" ::: "memory") #define IO_SPACE_ENCODING(p) ((((p) >> 2) << 12) | (p & 0xfff)) - +extern long __noio; static inline void *io_addr (unsigned long port) { unsigned long offset; @@ -16,28 +16,34 @@ static inline void *io_addr (unsigned lo static inline unsigned int inb (unsigned long port) { volatile unsigned char *addr = io_addr(port); - unsigned char ret; - ret = *addr; - MF(); + unsigned char ret = 0; + if (!__noio) { + ret = *addr; + MF(); + } return ret; } static inline unsigned int inw (unsigned long port) { volatile unsigned short *addr = io_addr(port); - unsigned short ret; + unsigned short ret = 0; - ret = *addr; - MF(); + if (!__noio) { + ret = *addr; + MF(); + } return ret; } -static inline unsigned int ia64_inl (unsigned long port) +static inline unsigned int inl (unsigned long port) { - volatile unsigned int *addr = __ia64_mk_io_addr(port); - unsigned int ret; - ret = *addr; - MF(); + volatile unsigned int *addr = io_addr(port); + unsigned int ret ; + if (!__noio) { + ret = *addr; + MF(); + } return ret; } @@ -45,50 +51,58 @@ static inline void outb (unsigned char v { volatile unsigned char *addr = io_addr(port); - *addr = val; - MF(); + if (!__noio) { + *addr = val; + MF(); + } } static inline void outw (unsigned short val, unsigned long port) { volatile unsigned short *addr = io_addr(port); - *addr = val; - MF(); + if (!__noio) { + *addr = val; + MF(); + } } static inline void outl (unsigned int val, unsigned long port) { volatile unsigned int *addr = io_addr(port); - *addr = val; - MF(); + if (!__noio) { + *addr = val; + MF(); + } } - static inline unsigned char readb(const volatile void *addr) { - return *(volatile unsigned char *) addr; + return __noio ? 0 :*(volatile unsigned char *) addr; } static inline unsigned short readw(const volatile void *addr) { - return *(volatile unsigned short *) addr; + return __noio ? 0 :*(volatile unsigned short *) addr; } static inline unsigned int readl(const volatile void *addr) { - return *(volatile unsigned int *) addr; + return __noio ? 0 :*(volatile unsigned int *) addr; } static inline void writeb(unsigned char b, volatile void *addr) { - *(volatile unsigned char *) addr = b; + if (!__noio) + *(volatile unsigned char *) addr = b; } static inline void writew(unsigned short b, volatile void *addr) { - *(volatile unsigned short *) addr = b; + if (!__noio) + *(volatile unsigned short *) addr = b; } static inline void writel(unsigned int b, volatile void *addr) { - *(volatile unsigned int *) addr = b; + if (!__noio) + *(volatile unsigned int *) addr = b; } #endif