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

RE: [Xen-ia64-devel] Could you tell me howto run xen on ski?



Hi Isaku --

Do you require an initrd for booting your dom0?  With
a one line change in xensetup.c, I am able to boot Xen
on ski without an initrd.  However, I think the one-line
fix would break your proposed patch to the bootloader.

I think an initrd is only required if you need to
dynamically load modules and I think the ski config
is self-contained.

Thanks,
Dan 

> -----Original Message-----
> From: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx 
> [mailto:xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf 
> Of Isaku Yamahata
> Sent: Monday, December 05, 2005 1:35 AM
> To: Matsumoto
> Cc: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
> Subject: Re: [Xen-ia64-devel] Could you tell me howto run xen on ski?
> 
> Hi.
> 
> On Fri, Dec 02, 2005 at 06:52:47PM +0900, Matsumoto wrote:
> 
> > I am interested in running ski for Xen development.
> 
> I have also tried to boot xen on ski.
> With following patch, I can load xen, dom0 image and initrd image.
> But dom0 panics during its boot procedure for now.
> 
> Its usage is as follows.
> ski bootloader vmm=<path to xen elf image> image=<path to 
> vmlinux elf image> initrd=<path to initrd image> <parameter...>
> ski bootloader <vmlinux elf image> <parameter...>
> 
> Singed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
> 
> --
> diff -ruNp -X linux-2.6.14.2/Documentation/dontdiff 
> linux-2.6.14.2/arch/ia64/hp/sim/boot.orig/bootloader.c 
> linux-2.6.14.2/arch/ia64/hp/sim/boot/bootloader.c
> --- linux-2.6.14.2/arch/ia64/hp/sim/boot.orig/bootloader.c    
> 2005-11-11 14:33:12.000000000 +0900
> +++ linux-2.6.14.2/arch/ia64/hp/sim/boot/bootloader.c 
> 2005-12-05 16:45:51.000000000 +0900
> @@ -24,6 +24,8 @@ struct task_struct; /* forward declarati
>  #include <asm/system.h>
>  
>  #include "ssc.h"
> +#include "xen_boot_param.h"
> +#define running_on_xen       0
>  
>  struct disk_req {
>       unsigned long addr;
> @@ -36,7 +38,7 @@ struct disk_stat {
>  };
>  
>  extern void jmp_to_kernel (unsigned long bp, unsigned long e_entry);
> -extern struct ia64_boot_param *sys_fw_init (const char 
> *args, int arglen);
> +extern struct xen_ia64_boot_param *sys_fw_init (const char 
> *args, int arglen, __u64 initrd_start, __u64 initrd_size, 
> __u64 domain_start, __u64 domain_size);
>  extern void debug_break (void);
>  
>  static void
> @@ -51,6 +53,77 @@ cons_write (const char *buf)
>       }
>  }
>  
> +static void
> +skip_space(char** args, long* arglen) 
> +{
> +     while (**args == ' ' && **args != '\0' && *arglen > 0) {
> +             (*args)++;
> +             (*arglen)--;
> +     }
> +}
> +
> +static void
> +find_space(char** args, long* arglen)
> +{
> +     while (**args != ' ' && **args != '\0' && *arglen > 0) {
> +             (*args)++;
> +             (*arglen)--;
> +     }
> +}
> +
> +void
> +set_nul(char** args, long* arglen)
> +{
> +     if (**args == ' ') {
> +             **args = '\0';
> +             (*args)++;
> +             (*arglen)--;
> +     }
> +}
> +
> +__u64
> +roundup(__u64 n) 
> +{
> +#define ALIGN_SIZE   (4 * 1024 * 1024)
> +     return (n + (ALIGN_SIZE - 1)) & ~(ALIGN_SIZE - 1) ;
> +}
> +
> +__u64
> +load_file(char* path, __u64 mem)
> +{
> +#define READ_SIZE    (4 * 1024 * 1024)
> +     struct disk_req req;
> +     unsigned long off;
> +     
> +     struct disk_stat stat;
> +
> +     int fd = ssc((long)path, 1, 0, 0, SSC_OPEN);
> +     if (fd < 0) {
> +             cons_write(path);
> +             cons_write(": file not found, reboot now\n");
> +             for(;;);
> +     }
> +
> +     off = 0;
> +     do {
> +             req.len = READ_SIZE;
> +             req.addr = mem;
> +             ssc(fd, 1, (long) &req, off, SSC_READ);
> +
> +             stat.fd = fd;
> +             ssc((long) &stat, 0, 0, 0, SSC_WAIT_COMPLETION);
> +
> +             off += READ_SIZE;
> +             mem += READ_SIZE;
> +     } while (stat.count == READ_SIZE);
> +     
> +     off -= READ_SIZE;
> +     off += stat.count;
> +     ssc(fd, 0, 0, 0, SSC_CLOSE);
> +
> +     return off;
> +}
> +
>  #define MAX_ARGS 32
>  
>  void
> @@ -65,9 +138,26 @@ start_bootloader (void)
>       struct elfhdr *elf;
>       struct elf_phdr *elf_phdr;      /* program header */
>       unsigned long e_entry, e_phoff, e_phnum;
> -     register struct ia64_boot_param *bp;
> +     register struct xen_ia64_boot_param *bp;
>       char *kpath, *args;
>       long arglen = 0;
> +     __u64 max_loaded = 0;
> +
> +     char *domain_path = NULL;
> +     __u64 domain_start = 0;
> +     __u64 domain_size = 0;
> +
> +     char *initrd_path = NULL;
> +     __u64 initrd_start = 0;
> +     __u64 initrd_size = 0;
> +
> +     // kpath:               vmlinux or xen
> +     // domain_path:         NULL    or dom0 kernel image
> +     // domain_start:                0       or image addrss
> +     // domain_size          0       or image size
> +     // initrd_path:         NULL    or initrd path
> +     // initrd_start:        0       or initrd addrsss
> +     // initrd_size:         0       or initrd size
>  
>       ssc(0, 0, 0, 0, SSC_CONSOLE_INIT);
>  
> @@ -85,11 +175,45 @@ start_bootloader (void)
>       kpath = "vmlinux";
>       args = buffer;
>       if (arglen > 0) {
> -             kpath = buffer;
> -             while (*args != ' ' && *args != '\0')
> -                     ++args, --arglen;
> -             if (*args == ' ')
> -                     *args++ = '\0', --arglen;
> +             skip_space(&args, &arglen);
> +#define VMM_STR              "vmm="
> +#define VMM_STR_LEN  4
> +#define IMAGE_STR    "image="
> +#define IMAGE_STR_LEN        6
> +#define INITRD_STR   "initrd="
> +#define INITRD_STR_LEN       7
> +             if (arglen > VMM_STR_LEN &&
> +                 strncmp(args, VMM_STR, VMM_STR_LEN) == 0) {
> +                     args += VMM_STR_LEN;
> +                     arglen -= VMM_STR_LEN;
> +                     kpath = args;
> +                     find_space(&args, &arglen);
> +                     set_nul(&args, &arglen);
> +
> +                     skip_space(&args, &arglen);
> +                     if (arglen > IMAGE_STR_LEN &&
> +                         strncmp(args, IMAGE_STR, 
> IMAGE_STR_LEN) == 0) {
> +                             args += IMAGE_STR_LEN;
> +                             arglen -= IMAGE_STR_LEN;
> +                             domain_path = args;
> +                             find_space(&args, &arglen);
> +                             set_nul(&args, &arglen);
> +                     }
> +
> +                     skip_space(&args, &arglen);
> +                     if (arglen > INITRD_STR_LEN &&
> +                         strncmp(args, INITRD_STR, 
> INITRD_STR_LEN) == 0) {
> +                             args += INITRD_STR_LEN;
> +                             arglen -= INITRD_STR_LEN;
> +                             initrd_path = args;
> +                             find_space(&args, &arglen);
> +                             set_nul(&args, &arglen);
> +                     }
> +             } else {
> +                     kpath = buffer;
> +                     find_space(&args, &arglen);
> +                     set_nul(&args, &arglen);
> +             }
>       }
>  
>       if (arglen <= 0) {
> @@ -156,17 +280,47 @@ start_bootloader (void)
>               ssc((long) &stat, 0, 0, 0, SSC_WAIT_COMPLETION);
>               memset((char *)__pa(elf_phdr->p_paddr) + 
> elf_phdr->p_filesz, 0,
>                      elf_phdr->p_memsz - elf_phdr->p_filesz);
> +             if (max_loaded < __pa(elf_phdr->p_paddr) + 
> elf_phdr->p_filesz) {
> +                     max_loaded = __pa(elf_phdr->p_paddr) + 
> elf_phdr->p_filesz;
> +             }
>       }
>       ssc(fd, 0, 0, 0, SSC_CLOSE);
>  
> +     if (domain_path != NULL) {
> +             cons_write("loading ");
> +             cons_write(domain_path);
> +             cons_write("...\n");
> +#define MAX_DOMAIN_IMAGE_SIZE        (64 * 1024 * 1024) 
> //XXX work around
> +             max_loaded = roundup(max_loaded + 
> MAX_DOMAIN_IMAGE_SIZE);
> +             domain_start = max_loaded;
> +             domain_size = load_file(domain_path, domain_start);
> +             max_loaded += domain_size;
> +     }
> +     
> +     if (initrd_path != NULL) {
> +             cons_write("loading ");
> +             cons_write(initrd_path);
> +             cons_write("...\n");
> +
> +             max_loaded = roundup(max_loaded + 
> MAX_DOMAIN_IMAGE_SIZE);
> +             
> +             initrd_start = max_loaded;
> +             initrd_size = load_file(initrd_path, initrd_start);
> +             max_loaded += initrd_size;
> +     }
> +
>       cons_write("starting kernel...\n");
>  
>       /* fake an I/O base address: */
>       ia64_setreg(_IA64_REG_AR_KR0, 0xffffc000000UL);
>  
> -     bp = sys_fw_init(args, arglen);
> +     bp = sys_fw_init(args, arglen,
> +                      initrd_start, initrd_size, 
> domain_start, domain_size);
>  
>       ssc(0, (long) kpath, 0, 0, SSC_LOAD_SYMBOLS);
> +     if (domain_path != NULL) {
> +             ssc(0, (long) domain_path, 0, 0, SSC_LOAD_SYMBOLS);
> +     }
>  
>       debug_break();
>       jmp_to_kernel((unsigned long) bp, e_entry);
> diff -ruNp -X linux-2.6.14.2/Documentation/dontdiff 
> linux-2.6.14.2/arch/ia64/hp/sim/boot.orig/fw-emu.c 
> linux-2.6.14.2/arch/ia64/hp/sim/boot/fw-emu.c
> --- linux-2.6.14.2/arch/ia64/hp/sim/boot.orig/fw-emu.c        
> 2005-12-05 14:14:59.000000000 +0900
> +++ linux-2.6.14.2/arch/ia64/hp/sim/boot/fw-emu.c     
> 2005-12-05 14:47:26.000000000 +0900
> @@ -16,6 +16,7 @@
>  #include <asm/sal.h>
>  
>  #include "ssc.h"
> +#include "xen_boot_param.h"
>  
>  #define MB   (1024*1024UL)
>  
> @@ -27,7 +28,7 @@
>  # define NUM_MEM_DESCS       16
>  #endif
>  
> -static char fw_mem[(  sizeof(struct ia64_boot_param)
> +static char fw_mem[(  sizeof(struct xen_ia64_boot_param)
>                   + sizeof(efi_system_table_t)
>                   + sizeof(efi_runtime_services_t)
>                   + 1*sizeof(efi_config_table_t)
> @@ -237,8 +238,10 @@ sal_emulator (long index, unsigned long 
>       return ((struct sal_ret_values) {status, r9, r10, r11});
>  }
>  
> -struct ia64_boot_param *
> -sys_fw_init (const char *args, int arglen)
> +struct xen_ia64_boot_param *
> +sys_fw_init (const char *args, int arglen,
> +          __u64 initrd_start, __u64 initrd_size,
> +          __u64 domain_start, __u64 domain_size)
>  {
>       efi_system_table_t *efi_systab;
>       efi_runtime_services_t *efi_runtime;
> @@ -247,7 +250,7 @@ sys_fw_init (const char *args, int argle
>       efi_memory_desc_t *efi_memmap, *md;
>       unsigned long *pal_desc, *sal_desc;
>       struct ia64_sal_desc_entry_point *sal_ed;
> -     struct ia64_boot_param *bp;
> +     struct xen_ia64_boot_param *bp;
>       unsigned char checksum = 0;
>       char *cp, *cmd_line;
>       int i = 0;
> @@ -350,7 +353,7 @@ sys_fw_init (const char *args, int argle
>       /* simulate free memory at physical address zero */
>       MAKE_MD(EFI_BOOT_SERVICES_DATA,         EFI_MEMORY_WB,  
>   0*MB,    1*MB);
>       MAKE_MD(EFI_PAL_CODE,                   EFI_MEMORY_WB,  
>   1*MB,    2*MB);
> -     MAKE_MD(EFI_CONVENTIONAL_MEMORY,        EFI_MEMORY_WB,  
>   2*MB,  130*MB);
> +     MAKE_MD(EFI_CONVENTIONAL_MEMORY,        EFI_MEMORY_WB,  
>   2*MB,  4096*MB);
>       MAKE_MD(EFI_CONVENTIONAL_MEMORY,        EFI_MEMORY_WB, 
> 4096*MB, 4128*MB);
>  #else
>       MAKE_MD( 4,                0x9, 0x0000000000000000, 
> 0x0000000000001000);
> @@ -382,6 +385,10 @@ sys_fw_init (const char *args, int argle
>       bp->console_info.orig_x = 0;
>       bp->console_info.orig_y = 24;
>       bp->fpswa = 0;
> +     bp->initrd_start = initrd_start;
> +     bp->initrd_size = initrd_size;
> +     bp->domain_start = domain_start;
> +     bp->domain_size = domain_size;
>  
>       return bp;
>  }
> diff -ruNp -X linux-2.6.14.2/Documentation/dontdiff 
> linux-2.6.14.2/arch/ia64/hp/sim/boot.orig/xen_boot_param.h 
> linux-2.6.14.2/arch/ia64/hp/sim/boot/xen_boot_param.h
> --- 
> linux-2.6.14.2/arch/ia64/hp/sim/boot.orig/xen_boot_param.h    
> 1970-01-01 09:00:00.000000000 +0900
> +++ linux-2.6.14.2/arch/ia64/hp/sim/boot/xen_boot_param.h     
> 2005-12-05 14:45:59.000000000 +0900
> @@ -0,0 +1,26 @@
> +#ifndef XEN_BOOT_PARAM_H
> +#define XEN_BOOT_PARAM_H
> +
> +// this is ia64_boot_param from 
> xen/include/asm-ia64/linux-xen/asm/system.h
> +extern struct xen_ia64_boot_param {
> +     __u64 command_line;             /* physical address of 
> command line arguments */
> +     __u64 efi_systab;               /* physical address of 
> EFI system table */
> +     __u64 efi_memmap;               /* physical address of 
> EFI memory map */
> +     __u64 efi_memmap_size;          /* size of EFI memory map */
> +     __u64 efi_memdesc_size;         /* size of an EFI 
> memory map descriptor */
> +     __u32 efi_memdesc_version;      /* memory descriptor version */
> +     struct {
> +             __u16 num_cols; /* number of columns on console 
> output device */
> +             __u16 num_rows; /* number of rows on console 
> output device */
> +             __u16 orig_x;   /* cursor's x position */
> +             __u16 orig_y;   /* cursor's y position */
> +     } console_info;
> +     __u64 fpswa;            /* physical address of the 
> fpswa interface */
> +     __u64 initrd_start;
> +     __u64 initrd_size;
> +     __u64 domain_start;     /* virtual address where the boot time v
> +mcode begins */
> +     __u64 domain_size;      /* how big is the boot module */
> +} *xen_ia64_boot_param;
> +
> +#endif // XEN_BOOT_PARAM_H
> 
> 
> -- 
> yamahata
> 
> _______________________________________________
> Xen-ia64-devel mailing list
> Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-ia64-devel
> 

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.