On Wed, 2008-03-12 at 21:53 -0500, Hollis Blanchard wrote:
> You've misspelled "licence" several times in this patch.

Got them. More of one error propagating through cut & paste.
> 
> On Tue, 2008-03-11 at 23:50 -0500, Jerone Young wrote:
> > # HG changeset patch
> > # User Jerone Young <[EMAIL PROTECTED]>
> > # Date 1205296680 18000
> > # Branch merge
> > # Node ID 50fddb23a4c19ec6f359a4dd39e98712eb6bcaeb
> > # Parent  9c15709640cd55bf6f782d6856423363312493bb
> > Add dynamic device tree manipulation & change uboot loader for PPC
> > bamboo board model
> > 
> > This patch adds code to dynamically manipulate the device tree when
> > loaded into memory. This allows us to finally have the ability to
> > manipulate the kernel command line & initrd from the qemu command
> > line. This will also let us setup different settings for the board.
> > 
> > This patch also now uses new uboot loader uboot_loader_l() to load
> > kernel image.
> 
> So the load_uboot() part should be a separate patch, right?
> 
> > Signed-off-by: Jerone Young <[EMAIL PROTECTED]>
> > 
> > diff --git a/qemu/Makefile.target b/qemu/Makefile.target
> > --- a/qemu/Makefile.target
> > +++ b/qemu/Makefile.target
> > @@ -615,7 +615,7 @@ OBJS+= unin_pci.o ppc_chrp.o
> >  OBJS+= unin_pci.o ppc_chrp.o
> >  # PowerPC 4xx boards
> >  OBJS+= pflash_cfi02.o ppc4xx_devs.o ppc405_uc.o ppc405_boards.o
> > -OBJS+= ppc440.o ppc440_bamboo.o
> > +OBJS+= ppc440.o ppc440_bamboo.o ppc_device_tree_support.o
> >  endif
> >  ifeq ($(TARGET_BASE_ARCH), mips)
> >  OBJS+= mips_r4k.o mips_malta.o mips_pica61.o mips_mipssim.o
> > diff --git a/qemu/hw/ppc440_bamboo.c b/qemu/hw/ppc440_bamboo.c
> > --- a/qemu/hw/ppc440_bamboo.c
> > +++ b/qemu/hw/ppc440_bamboo.c
> > @@ -8,11 +8,12 @@
> >   *
> >   */
> > 
> > +#include "config.h"
> >  #include "ppc440.h"
> > +#include "qemu-kvm.h"
> > +#include "ppc_device_tree_support.h"
> > 
> > -#define KERNEL_LOAD_ADDR 0x400000 /* uboot loader puts kernel at 4MB */
> > -
> > -#include "qemu-kvm.h"
> > +#define BINARY_DEVICE_TREE_FILE "bamboo.dtb"
> > 
> >  /* PPC 440 refrence demo board
> >   *
> > @@ -26,14 +27,22 @@ void bamboo_init(ram_addr_t ram_size, in
> >                     const char *initrd_filename,
> >                     const char *cpu_model)
> >  {
> > +   char buf[1024]; 
> >     target_phys_addr_t ram_bases[2], ram_sizes[2];
> >     qemu_irq *pic;
> >     CPUState *env;
> > -   target_ulong ep;
> > +   target_ulong ep=0;
> > +   target_ulong la=0;
> >     int is_linux=1; /* Will assume allways is Linux for now */
> > -   long kernel_size=0;
> > +   target_long kernel_size=0;
> >     target_ulong initrd_base=0;
> > -   target_ulong initrd_size=0;
> > +   target_long initrd_size=0;
> > +   target_ulong dt_base=0;
> > +   void *fdt;
> > +   int ret;
> > +
> > +   uint32_t cpu_freq;
> > +   uint32_t timebase_freq;
> > 
> >     printf("%s: START\n", __func__);
> > 
> > @@ -78,18 +87,23 @@ void bamboo_init(ram_addr_t ram_size, in
> > 
> >     /* load kernel with uboot loader */
> >     printf("%s: load kernel\n", __func__);
> > -   kernel_size = load_uboot(kernel_filename, &ep, &is_linux);
> > +   load_uboot_l(kernel_filename, &ep, &la, &kernel_size, &is_linux);
> >     if (kernel_size < 0) {
> >             fprintf(stderr, "qemu: could not load kernel '%s'\n",
> >                     kernel_filename);
> >             exit(1);
> >     }
> > +   printf("kernel is at guest address: 0x%lx\n", (unsigned long)la);
> > 
> >     /* load initrd */
> >     if (initrd_filename) {
> > -           initrd_base = kernel_size + KERNEL_LOAD_ADDR;
> > +           initrd_base = kernel_size + la;
> > +           printf("%s: load initrd\n", __func__);
> >             initrd_size = load_image(initrd_filename,
> >                             phys_ram_base + initrd_base);
> > +
> > +           printf("initrd is at guest address: 0x%lx\n", 
> > +                                   (unsigned long) initrd_base);
> > 
> >             if (initrd_size < 0) {
> >                     fprintf(stderr,
> > @@ -99,17 +113,58 @@ void bamboo_init(ram_addr_t ram_size, in
> >             }
> >     }
> > 
> > +#ifdef CONFIG_LIBFDT
> > +   /* get variable for device tree */
> > +   cpu_freq = get_proc_dt_prop_cpu_clock_freq();
> > +   timebase_freq = get_proc_dt_prop_cpu_timebase_freq();
> > +
> > +   /* load binary device tree into qemu (not guest memory) */
> > +   printf("%s: load device tree file\n", __func__);
> > +   
> > +   snprintf(buf, sizeof(buf), "%s/%s", bios_dir, 
> > +           BINARY_DEVICE_TREE_FILE);
> > +
> > +   /* set base for device tree that will be in guest memory */     
> > +   if (initrd_base)
> > +           dt_base = initrd_base + initrd_size;
> > +   else
> > +           dt_base = kernel_size + la;
> > +
> > +   fdt = load_device_tree(buf, (phys_ram_base + dt_base));
> > +   if (fdt == NULL) {
> > +           printf("Loading device tree failed!\n");
> > +           exit(1);
> > +   }
> > +
> > +   printf("device tree address is at guest address: 0x%lx\n", 
> > +           (unsigned long) dt_base);
> > +
> > +   /* manipulate device tree in memory */
> > +   set_dt_cpu_0_clock_freq_prop(fdt, cpu_freq);
> > +   set_dt_cpu_0_timebase_prop(fdt, timebase_freq);
> > +
> > +   set_dt_initrd_start_prop(fdt, initrd_base);
> > +   set_dt_initrd_end_prop(fdt, (initrd_base + initrd_size));
> > +
> > +   set_dt_bootargs_prop(fdt, kernel_cmdline);
> > +#endif
> > +
> >     if (kvm_enabled()) {
> > -       /* XXX insert TLB entries */
> > -       env->gpr[1] = (16<<20) - 8;
> > -       env->gpr[4] = initrd_base;
> > -       env->gpr[5] = initrd_size;
> > 
> > -       env->nip = ep;
> > +           /* XXX insert TLB entries */
> > +           env->gpr[1] = (16<<20) - 8;
> 
> Please fix your whitespace.

This actually is the white space fix. Moves from 

> 
> > -       env->cpu_index = 0;
> > -       printf("%s: loading kvm registers\n", __func__);
> > -       kvm_load_registers(env);
> > +#ifdef CONFIG_LIBFDT
> > +           /* location of device tree in register */
> > +           env->gpr[3] = dt_base;
> > +#else
> > +           env->gpr[4] = initrd_base;
> > +           env->gpr[5] = initrd_size;
> > +#endif
> 
> Linux ignores R4 and R5 regardless of whether qemu has libfdt support or
> not. Those should be removed.
Oh I forgot. 

> 
> > +           env->nip = ep;
> > +
> > +           printf("%s: loading kvm registers\n", __func__);
> > +           kvm_load_registers(env);
> >     }
> > 
> >     printf("%s: DONE\n", __func__);
> > diff --git a/qemu/hw/ppc_device_tree_support.c 
> > b/qemu/hw/ppc_device_tree_support.c
> > new file mode 100644
> > --- /dev/null
> > +++ b/qemu/hw/ppc_device_tree_support.c
> 
> This is a really long file name.
Just renamed them something much shorter.

> 
> > @@ -0,0 +1,223 @@
> > +/*
> > + * Functions to help device tree manipulation using libfdt.
> > + * It also provides functions to read entries from device tree proc
> > + * interface.
> > + *
> > + * Copyright 2008 IBM Corporation.
> > + * Authors: Jerone Young <[EMAIL PROTECTED]>
> > + *
> > + * This work is licensed under the GNU GPL licence version 2 or later.
> > + *
> > + */
> > +
> > +#include <stdio.h>
> > +#include <sys/types.h>
> > +#include <sys/stat.h>
> > +#include <fcntl.h>
> > +#include <unistd.h>
> > +#include <stdlib.h>
> > +
> > +#include "config.h"
> > +#include "ppc440.h"
> > +
> > +#ifdef CONFIG_LIBFDT
> > +   #include "libfdt.h"
> > +#endif
> 
> Don't indent this.
> 
> > +#define DT_PROC_INTERFACE_PATH "/proc/device-tree"
> > +
> > +/* FUNCTIONS FOR READING FROM DEVICE TREE OF HOST IN /PROC */
> > +
> > +/* This function reads device-tree property files that are of
> > + * a single cell size
> > + */
> > +static uint32_t read_proc_device_tree_prop_cell(char *path_in_device_tree)
> > +{
> > +   char buf[1024];
> > +   uint32_t num;
> > +   FILE *stream;
> > +
> > +   snprintf(buf, sizeof(buf), "%s/%s",  DT_PROC_INTERFACE_PATH,
> > +           path_in_device_tree);
> > +
> > +   stream = fopen(buf, "rb");
> > +   
> > +   if (stream == NULL)
> > +   {
> > +           printf("%s: Unable to open '%s'\n", __func__, buf);
> > +           exit(1);
> > +   }
> > +
> > +   fread(&num, sizeof(num), 1, stream);
> > +   fclose(stream);
> > +
> > +   return num;
> > +} 
> 
> I hate that "buf" variable. You can use snprintf() with length 0 to find
> out how much memory to malloc.
done

> 
> ...
> > +void set_dt_cpu_0_timebase_prop(void *fdt, uint32_t timebase)
> > +{  
> > +   int offset;
> > +   offset = get_offset_of_node(fdt, "/cpus/[EMAIL PROTECTED]");
> > +   set_dt_prop_cell(fdt, offset, "timebase-frequency",
> > +                   timebase);
> > +
> > +}
> > +
> > +void set_dt_initrd_start_prop(void *fdt, uint32_t start_addr)
> > +{
> > +   int offset;
> > +   offset = get_offset_of_node(fdt, "/chosen");
> > +   set_dt_prop_cell(fdt, offset, "linux,initrd-start",
> > +                   start_addr);
> > +}
> > +
> > +void set_dt_initrd_end_prop(void *fdt, uint32_t end_addr)
> > +{
> > +   int offset;
> > +   offset = get_offset_of_node(fdt, "/chosen");
> > +   set_dt_prop_cell(fdt, offset, "linux,initrd-end",
> > +                   end_addr);
> > +}
> > +
> > +void set_dt_bootargs_prop(void *fdt, char *cmdline)
> > +{
> > +   int offset;
> > +   offset = get_offset_of_node(fdt, "/chosen");
> > +   set_dt_prop_string(fdt,offset, "bootargs", cmdline);
> > +}
> > +
> > +#endif
> 
> These are also really long function names. If you're basically going to
> encode the full device tree path into the function name, I don't think
> they're very convenient and they're not worth having. You could just
> pass the path in from the caller.
I've reworked the codd to remove all this.

> 


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to