WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-users

Re: [Xen-devel] Oprofile-0.9.2 problem with xen-unstable

To: "Bhatia, Nikhil" <bhatia@xxxxxxxx>
Subject: Re: [Xen-devel] Oprofile-0.9.2 problem with xen-unstable
From: William Cohen <wcohen@xxxxxxxxxx>
Date: Wed, 20 Sep 2006 13:34:40 -0400
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, xen-users@xxxxxxxxxxxxxxxxxxx
Delivery-date: Wed, 20 Sep 2006 10:35:20 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <537C6C0940C6C143AA46A88946B854170468D2BB@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <537C6C0940C6C143AA46A88946B854170468D2BB@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla Thunderbird 1.0.8-1.1.fc4 (X11/20060501)
Bhatia, Nikhil wrote:
Hello Xen Users,

I am using oprofile-0.9.2 along with Xen-unstable which has inbuilt support for Xenoprof and Oprofile. I have everything installed fine (i.e. Oprofile.ko is at the right place) but still I am having the following problem.

When I try to use oprofile with the Host OS, I get the following error:

opcontrol --xen=/boot/xen-syms-3.0-unstable

/usr/local/bin/opcontrol: line 1490: check_valid_xen: command not found

When I use oprofile on a guest OS, I get the following error:

opcontrol --vmlinux=/boot/vmlinux-syms-2.6.16.13-xen

/usr/local/bin/opcontrol: line 1490: check_valid_xen: command not found

It seems that opcontrol is not able to find a script called “check_valid_xen”. Does anyone has any suggestions.

Thanks,

Nikhil

I looked through opcontrol for oprofile-0.9.2 and didn't see a check_valid_xen in the script. The stock OProfile 0.9.2 has support for active profiling. However, It doesn't have the newer patch that includes support for passive domain profiling.

Is this a stock version of OProfile 0.9.2? I suspect that a patch being used to update the xen support might not be quite right. The newer xenoprof patch for oprofile has a check_valid_xen() in opcontrol.

Earlier in the week I applied both the old and new versions of the xenoprof patch to oprofile-0.9.1 and did a diff of the directories to get an incremental patch. I haven't tested this on xen so I don't know if it works. I have attached the patch in question.


-Will

diff -urN oprofile-0.9.1-xenact/daemon/init.c 
oprofile-0.9.1-xenpass/daemon/init.c
--- oprofile-0.9.1-xenact/daemon/init.c 2006-09-19 10:39:56.000000000 -0400
+++ oprofile-0.9.1-xenpass/daemon/init.c        2006-09-19 10:39:44.000000000 
-0400
@@ -226,6 +226,8 @@
 
        opd_create_vmlinux(vmlinux, kernel_range);
        opd_create_xen(xenimage, xen_range);
+       if (xen_passive_setup)
+               opd_create_passive(xen_passive_setup);
 
        opd_buf_size = opd_read_fs_int("/dev/oprofile/", "buffer_size", 1);
        kernel_pointer_size = opd_read_fs_int("/dev/oprofile/", "pointer_size", 
1);
diff -urN oprofile-0.9.1-xenact/daemon/opd_interface.h 
oprofile-0.9.1-xenpass/daemon/opd_interface.h
--- oprofile-0.9.1-xenact/daemon/opd_interface.h        2006-09-19 
10:39:56.000000000 -0400
+++ oprofile-0.9.1-xenpass/daemon/opd_interface.h       2006-09-19 
10:39:44.000000000 -0400
@@ -27,6 +27,7 @@
 /* Code 9 used to be TRACE_END_CODE which is not used anymore  */
 /* Code 9 is now considered an unknown escape code             */
 #define XEN_ENTER_SWITCH_CODE          10
-#define LAST_CODE                      11
+#define DOMAIN_SWITCH_CODE             11
+#define LAST_CODE                      12
  
 #endif /* OPD_INTERFACE_H */
diff -urN oprofile-0.9.1-xenact/daemon/opd_kernel.c 
oprofile-0.9.1-xenpass/daemon/opd_kernel.c
--- oprofile-0.9.1-xenact/daemon/opd_kernel.c   2006-09-19 10:39:56.000000000 
-0400
+++ oprofile-0.9.1-xenpass/daemon/opd_kernel.c  2006-09-19 10:39:44.000000000 
-0400
@@ -34,6 +34,11 @@
 
 static struct kernel_image xen_image;
 
+static LIST_HEAD(passive_vmlinux);
+static LIST_HEAD(passive_xen);
+static LIST_HEAD(passive_apps);
+static LIST_HEAD(passive_modules);
+
 void opd_create_vmlinux(char const * name, char const * arg)
 {
        /* vmlinux is *not* on the list of modules */
@@ -61,6 +66,8 @@
 
 void opd_create_xen(char const * name, char const * arg)
 {
+       int stat;
+
        /* xen is *not* on the list of modules */
        list_init(&xen_image.list);
 
@@ -72,18 +79,92 @@
 
        xen_image.name = xstrdup(name);
 
-       sscanf(arg, "%llx,%llx", &xen_image.start, &xen_image.end);
+       stat = sscanf(arg, "%llx,%llx", &xen_image.start, &xen_image.end);
 
        verbprintf(vmisc, "xen_start = %llx, xen_end = %llx\n",
                   xen_image.start, xen_image.end);
 
-       if (!xen_image.start && !xen_image.end) {
+       if ( stat != 2 ) {
                fprintf(stderr, "error: mis-parsed xen range: %llx-%llx\n",
                        xen_image.start, xen_image.end);
                exit(EXIT_FAILURE);
        }
 }
 
+void opd_create_passive_domain(int id, char const * image_kernel, 
+                              char const * range, char const * image_xen)
+{
+       char file[64];
+       struct kernel_image * image;
+       int stat;
+
+       image = xmalloc(sizeof(struct kernel_image));
+       image->name = xstrdup(image_kernel);
+       image->start = image->end = 0; 
+       stat = sscanf(range, "%llx,%llx", &image->start, &image->end);
+       image->id = id;
+       list_add(&image->list, &passive_vmlinux);
+       
+       if ( stat != 2 ) {
+               fprintf(stderr, "error: mis-parsed passive domain range for "
+                       "domain %d: %llx-%llx\n", id, image->start, image->end);
+               exit(EXIT_FAILURE);
+       }
+
+       image = xmalloc(sizeof(struct kernel_image));
+       image->name = xstrdup(image_xen);
+       image->start = xen_image.start;
+       image->end = xen_image.end;
+       image->id = id;
+       list_add(&image->list, &passive_xen);
+
+       sprintf(file, "domain%d-apps", id);
+       image = xmalloc(sizeof(struct kernel_image));
+       image->name = xstrdup(file);
+       image->start = 0; 
+       image->end = 0;
+       image->id = id;
+       list_add(&image->list, &passive_apps);
+
+       sprintf(file, "domain%d-modules", id);
+       image = xmalloc(sizeof(struct kernel_image));
+       image->name = xstrdup(file);
+       image->start = 0; 
+       image->end = 0;
+       image->id = id;
+       list_add(&image->list, &passive_modules);
+
+}
+
+void opd_create_passive(char const *setup_file)
+{
+       FILE *fp;
+       int id=0;
+       char image_kernel[128+1];
+       char range[32+1];
+       char image_xen[128+1];
+       int stat;
+
+       image_kernel[0] = range[0] = image_xen[0] = 0;
+
+       fp = fopen(setup_file, "r");
+
+       if (!fp) {
+               fprintf(stderr, "error: Could not open Xen passive domain "
+                       "setup file %s\n", setup_file);
+               exit(EXIT_FAILURE);
+       }
+
+       while (1) {
+               stat = fscanf(fp, "%d %128s %32s %128s", &id, image_kernel, 
range, 
+                       image_xen);
+               if ( stat != 4 )
+                       return;
+               opd_create_passive_domain(id, image_kernel, range, image_xen);
+       }
+
+       fclose(fp);
+}
 
 /**
  * Allocate and initialise a kernel image description
@@ -210,6 +291,65 @@
        struct list_head * pos;
        struct kernel_image * image = &vmlinux_image;
 
+       if (current_domain != COORDINATOR_DOMAIN) {
+               /* We always rely on pc for identifying Xen samples
+                * since on Xen entry/exit cpu_mode may still
+                * indicate we are in kernel or user level while the
+                * pc belongs to xen address space */
+               list_for_each(pos, &passive_xen) {
+                       image = list_entry(pos, struct kernel_image, list);
+                       if (image->id == current_domain
+                           && image->start <= trans->pc 
+                           && image->end > trans->pc) 
+                               return image;
+               }
+
+               /* for kernel and user level samples we rely on 
+               * cpu_mode value (i.e. trans->in_kernel)
+               * Note however that we incremented trans->in_kernel
+               * when entering passive domain mode, Now vaid values 
+               * are in range [1,3]  */
+               switch ( trans->in_kernel ) {
+
+               /* kernel mode */
+               case 2:
+                       list_for_each(pos, &passive_vmlinux) {
+                               image = list_entry(pos, struct kernel_image, 
list);
+                               if ( (image->id == current_domain)
+                                    && ( (image->start == 0 && image->end == 0)
+                                         || (image->start <= trans->pc 
+                                             && image->end > trans->pc) ) )
+                                               return image;
+                       }
+                       /* if not in kernel image range then it should be a 
module */ 
+                       list_for_each(pos, &passive_modules) {
+                               image = list_entry(pos, struct kernel_image, 
list);
+                               if (image->id == current_domain) 
+                                       return image;
+                       }
+                       /* This should not happen if the kernel and user level 
+                           oprofile code are sane and in sync */
+                       return NULL;
+               /* user mode */
+               case 1:
+                       list_for_each(pos, &passive_apps) {
+                               image = list_entry(pos, struct kernel_image, 
list);
+                               if (image->id == current_domain) 
+                                       return image;
+                       }
+                       return NULL;
+               default:
+                       printf("Unexpected error on passive mode: CPU mode is "
+                              "%d for domain %d\n", trans->in_kernel, 
current_domain);
+                       return NULL;
+               }
+               
+               
+       }
+
+       if (xen_image.start <= trans->pc && xen_image.end > trans->pc)
+               return &xen_image;
+ 
        if (no_vmlinux)
                return image;
 
@@ -222,8 +362,5 @@
                        return image;
        }
 
-       if (xen_image.start <= trans->pc && xen_image.end > trans->pc)
-               return &xen_image;
-
        return NULL;
 }
diff -urN oprofile-0.9.1-xenact/daemon/opd_kernel.h 
oprofile-0.9.1-xenpass/daemon/opd_kernel.h
--- oprofile-0.9.1-xenact/daemon/opd_kernel.h   2006-09-19 10:39:56.000000000 
-0400
+++ oprofile-0.9.1-xenpass/daemon/opd_kernel.h  2006-09-19 10:39:44.000000000 
-0400
@@ -23,8 +23,12 @@
 /** create the kernel image */
 void opd_create_vmlinux(char const * name, char const * arg);
 
+/** create Xen image */
 void opd_create_xen(char const * name, char const * arg);
 
+/** create Xen passive domain images */
+void opd_create_passive(char const *setup_file);
+
 /** opd_reread_module_info - parse /proc/modules for kernel modules */
 void opd_reread_module_info(void);
 
@@ -33,6 +37,7 @@
        char * name;
        vma_t start;
        vma_t end;
+       int id;
        struct list_head list;
 };
 
diff -urN oprofile-0.9.1-xenact/daemon/opd_sfile.c 
oprofile-0.9.1-xenpass/daemon/opd_sfile.c
--- oprofile-0.9.1-xenact/daemon/opd_sfile.c    2005-05-25 20:00:02.000000000 
-0400
+++ oprofile-0.9.1-xenpass/daemon/opd_sfile.c   2006-09-19 10:39:44.000000000 
-0400
@@ -226,7 +226,7 @@
        }
 
        /* we might need a kernel image start/end to hash on */
-       if (trans->in_kernel) {
+       else if (trans->in_kernel) {
                ki = find_kernel_image(trans);
                if (!ki) {
                        verbprintf(vsamples, "Lost kernel sample %llx\n", 
trans->pc);
diff -urN oprofile-0.9.1-xenact/daemon/opd_trans.c 
oprofile-0.9.1-xenpass/daemon/opd_trans.c
--- oprofile-0.9.1-xenact/daemon/opd_trans.c    2006-09-19 10:39:56.000000000 
-0400
+++ oprofile-0.9.1-xenpass/daemon/opd_trans.c   2006-09-19 10:39:44.000000000 
-0400
@@ -27,6 +27,8 @@
 #include <stdio.h>
 #include <errno.h>
 
+int32_t current_domain = COORDINATOR_DOMAIN;
+
 extern size_t kernel_pointer_size;
 
 
@@ -213,6 +215,9 @@
 {
        verbprintf(vmisc, "KERNEL_ENTER_SWITCH to kernel\n");
        trans->in_kernel = 1;
+       /* if in passive domain mode cpu mode should be incremented */
+       if (current_domain != COORDINATOR_DOMAIN)
+               trans->in_kernel++;
        clear_trans_current(trans);
        /* subtlety: we must keep trans->cookie cached,
         * even though it's meaningless for the kernel -
@@ -226,6 +231,9 @@
 {
        verbprintf(vmisc, "USER_ENTER_SWITCH to user-space\n");
        trans->in_kernel = 0;
+       /* if in passive domain mode cpu mode should be incremented */
+       if (current_domain != COORDINATOR_DOMAIN)
+               trans->in_kernel++;
        clear_trans_current(trans);
        clear_trans_last(trans);
 }
@@ -254,17 +262,35 @@
 static void code_xen_enter(struct transient *trans)
 {
        verbprintf(vmisc, "XEN_ENTER_SWITCH to xen\n");
-       trans->in_kernel = 1;
+       trans->in_kernel = 2;
+       /* if in passive domain mode cpu mode should be incremented */
+       if (current_domain != COORDINATOR_DOMAIN)
+               trans->in_kernel++;
        trans->current = NULL;
        /* subtlety: we must keep trans->cookie cached, even though it's 
-        * meaningless for Xen - we won't necessarily get a cookie switch 
-        * on Xen exit. See comments in opd_sfile.c. It seems that we can 
-        * get away with in_kernel = 1 as long as we supply the correct 
-        * Xen image, and its address range in startup find_kernel_image 
-        * is modified to look in the Xen image also
+        * meaningless for Xen - same reason as for kernel 
         */
 }
 
+static void code_domain_switch(struct transient *trans)
+{
+       /* While processing passive domain samples we ensure (in_kernel!=0)
+        * We do this in order to ignore cookies for passive domain samples 
+        * But, we have to remember the kernel value for coordinator domain, 
+        * so we do the safe thing: increment when leaving the coordinator
+        * domain and decrement when returning to it 
+        */
+       if (current_domain == COORDINATOR_DOMAIN)
+               trans->in_kernel++;
+
+       trans->current = NULL;
+       current_domain = (int32_t) pop_buffer_value(trans);
+
+       /* If returning to coordinator domain restore the kernel value */
+       if (current_domain == COORDINATOR_DOMAIN)
+               trans->in_kernel--;
+}
+
 typedef void (*handler_t)(struct transient *);
 
 static handler_t handlers[LAST_CODE + 1] = {
@@ -280,6 +306,7 @@
        &code_trace_begin,
        &code_unknown,
        &code_xen_enter,
+       &code_domain_switch,
 };
 
 
diff -urN oprofile-0.9.1-xenact/daemon/opd_trans.h 
oprofile-0.9.1-xenpass/daemon/opd_trans.h
--- oprofile-0.9.1-xenact/daemon/opd_trans.h    2005-05-02 11:06:59.000000000 
-0400
+++ oprofile-0.9.1-xenpass/daemon/opd_trans.h   2006-09-19 10:39:44.000000000 
-0400
@@ -15,6 +15,10 @@
 #include "opd_cookie.h"
 #include "op_types.h"
 
+#define COORDINATOR_DOMAIN -1
+
+extern int32_t current_domain;
+
 struct sfile;
 struct anon_mapping;
 
diff -urN oprofile-0.9.1-xenact/daemon/oprofiled.c 
oprofile-0.9.1-xenpass/daemon/oprofiled.c
--- oprofile-0.9.1-xenact/daemon/oprofiled.c    2006-09-19 10:39:56.000000000 
-0400
+++ oprofile-0.9.1-xenpass/daemon/oprofiled.c   2006-09-19 10:39:44.000000000 
-0400
@@ -66,6 +66,7 @@
 int no_xen;
 char * xenimage;
 char * xen_range;
+char * xen_passive_setup;
 static char * verbose;
 static char * binary_name_filter;
 static char * events;
@@ -84,6 +85,7 @@
        { "xen-range", 0, POPT_ARG_STRING, &xen_range, 0, "Xen VMA range", 
"start-end", },
        { "xen-image", 0, POPT_ARG_STRING, &xenimage, 0, "Xen image", "file", },
        { "image", 0, POPT_ARG_STRING, &binary_name_filter, 0, "image name 
filter", "profile these comma separated image" },
+       { "xen-passive-setup", 0, POPT_ARG_STRING, &xen_passive_setup, 0, "Xen 
passive domain setup file", "filename", },
        { "separate-lib", 0, POPT_ARG_INT, &separate_lib, 0, "separate library 
samples for each distinct application", "[0|1]", },
        { "separate-kernel", 0, POPT_ARG_INT, &separate_kernel, 0, "separate 
kernel samples for each distinct application", "[0|1]", },
        { "separate-thread", 0, POPT_ARG_INT, &separate_thread, 0, 
"thread-profiling mode", "[0|1]" },
diff -urN oprofile-0.9.1-xenact/daemon/oprofiled.h 
oprofile-0.9.1-xenpass/daemon/oprofiled.h
--- oprofile-0.9.1-xenact/daemon/oprofiled.h    2006-09-19 10:39:56.000000000 
-0400
+++ oprofile-0.9.1-xenpass/daemon/oprofiled.h   2006-09-19 10:39:44.000000000 
-0400
@@ -64,5 +64,6 @@
 extern int no_xen;
 extern char * xenimage;
 extern char * xen_range;
+extern char * xen_passive_setup;
 
 #endif /* OPROFILED_H */
diff -urN oprofile-0.9.1-xenact/doc/opcontrol.1.in 
oprofile-0.9.1-xenpass/doc/opcontrol.1.in
--- oprofile-0.9.1-xenact/doc/opcontrol.1.in    2006-09-19 10:39:56.000000000 
-0400
+++ oprofile-0.9.1-xenpass/doc/opcontrol.1.in   2006-09-19 10:39:44.000000000 
-0400
@@ -105,7 +105,8 @@
 .BI "--callgraph=#depth"
 Enable callgraph sample collection with a maximum depth. Use 0 to disable
 callgraph profiling. This option is currently only usable on x86, using a
-2.6+ kernel with callgraph support enabled.
+2.6+ kernel with callgraph support enabled. This option is not yet supported
+on Xen.
 .br
 .TP
 .BI "--image="[name,name...|"all"]
@@ -136,12 +137,41 @@
 .br
 .TP
 .BI "--active-domains="<list>
-List of domain ids participating in a multi-domain profiling session. If 
+List of domain ids participating in a multi-domain profiling session. 
+Each of the specified domains must run an instance of oprofile. The 
+sequence of opcontrol commands in each domain must follow a given 
+order which is specified in the oprofile user manual. If 
 more than one domain is specified in <list> they should be separated using 
 commas. This option can only be used in domain 0 which is the only domain 
 that can coordinate a multi-domain profiling session. Including domain 0 in 
 the list of active domains is optional. (e.g. --active-domains=2,5,6 and 
---active-domains=0,2,5,6 are equivalent)
+--active-domains=0,2,5,6 are equivalent).
+This option can only be specified
+if --start-daemon is also specified and it is only 
+valid for the current run of the oprofile daemon; e.g. the list 
+of active domains is not persistent.
+.br
+.TP
+.BI "--passive-domains="<list> or "--domains="<list>
+List of domain ids to be profiled, separated by commas. 
+As opposed to the --active-domains option, the domains specified with this
+option do not need to run oprofile. This makes 
+profiling multiple domains easier. However, with the passive-domains option, 
+samples in user level processes and kernel modules cannot be 
+mapped to specific symbols and are aggregated
+under a generic class. Both --active-domains and --passive-domains 
+options can be specified in the same command, but the same domain cannot be
+specified in both options. This option can only be specified if either --start
+or --start-daemon is specified on the same command and it is only valid for 
+the current run of the oprofile daemon; e.g. the list of passive domains is 
+not persistent.
+.br
+.TP
+.BI "--passive-images="<list> or "--domains-images="<list>
+List of kernel images associated with the domains specified in the
+--passive-domains option, also separated by commas. The association
+between the images and domains is based on the order they are
+specified in both options.
 .br
 
 .SH ENVIRONMENT
diff -urN oprofile-0.9.1-xenact/utils/opcontrol 
oprofile-0.9.1-xenpass/utils/opcontrol
--- oprofile-0.9.1-xenact/utils/opcontrol       2006-09-19 10:39:56.000000000 
-0400
+++ oprofile-0.9.1-xenpass/utils/opcontrol      2006-09-19 10:39:44.000000000 
-0400
@@ -145,9 +145,16 @@
    --cpu-buffer-size=num         per-cpu buffer size in units (2.6 only)
    --note-table-size             kernel notes buffer size in notes units (2.4 
only)
 
-   --xen                         Xen image (for Xen only)
-   --active-domains=<list>       List of domains in profiling session (for Xen 
only)
-                                 (list contains domain ids separated by commas)
+   --xen=file                    Xen image (for Xen only)
+   --active-domains=id[,ids]     list of domains in multiple domain profiling 
session (Xen)
+                                 (detailed profiling of user level and kernel 
modules code)
+                                 (requires running oprofile on these domains)
+   --passive-domains=id[,ids]    list of domains to be profiled (Xen).
+     or --domains=id[,ids]       (coarse profiling of user level and kernel 
modules code)
+                                 (no need to run oprofile on these domains)
+   --passive-images=file[,files] list of kernel images associated with each 
passive domain
+     or 
+   --domain-images=file[,files]
 " >&2
 }
 
@@ -264,6 +271,9 @@
        SETUP_DIR="/root/.oprofile"
        SETUP_FILE="$SETUP_DIR/daemonrc"
 
+       # location for passing info about passive domains to daemon
+       PASSIVE_SETUP_FILE="$SETUP_DIR/xendomain.setup"
+
        CPUTYPE=`cat $MOUNT/cpu_type`
        OP_COUNTERS=`ls $MOUNT/ | grep "^[0-9]\+\$" | tr "\n" " "`
        NR_CHOSEN=0
@@ -369,7 +379,7 @@
 }
 
 
-check_valid_args()
+check_valid_vmlinux()
 {
        if test -z "$VMLINUX"; then
                echo "No vmlinux file specified. You must specify the correct 
vmlinux file, e.g." >&2
@@ -390,8 +400,12 @@
 
        echo "The specified vmlinux file \"$VMLINUX\" doesn't exist." >&2
        exit 1
+}
+
 
 # similar check for Xen image
+check_valid_xen()
+{
        if test -f "$XENIMAGE"; then
                return
        fi
@@ -447,6 +461,76 @@
        fi
 }
  
+set_passive_domain()
+{
+       DOMAIN_ID=$1
+       FILE_IMAGE=$2
+       XEN_IMAGE=$3
+
+       if test "$FILE_IMAGE" = "none"; then
+               RANGE="0,0"
+               FILE_IMAGE="domain$DOMAIN_ID-kernel"
+       else
+               # Find VMA range for passive domain kernel image 
+               range_info=`objdump -h $FILE_IMAGE 2>/dev/null | grep " .text "`
+               tmp1=`echo $range_info | awk '{print $4}'`      
+               tmp_length=`echo $range_info | awk  '{print $3}'`
+               tmp2=`objdump -h $FILE_IMAGE --adjust-vma=0x$tmp_length 
2>/dev/null | grep " .text " | awk  '{print $4}'`
+
+               if test -z "$tmp1" -o -z "$tmp2"; then
+                       echo "The specified file $FILE_IMAGE does not seem to 
be valid" >&2
+                       echo "Make sure you are using the non-compressed image 
file (e.g. vmlinux not vmlinuz)" >&2
+                       vecho "found start as \"$tmp1\", end as \"$tmp2\"" >&2
+                       exit 1
+               fi
+               RANGE="`echo $tmp1`,`echo $tmp2`"
+       fi
+       echo " $DOMAIN_ID $FILE_IMAGE $RANGE $XEN_IMAGE" >> $PASSIVE_SETUP_FILE
+}
+
+
+set_passive_domain_config()
+{
+
+       create_dir "$SETUP_DIR"
+
+       touch $PASSIVE_SETUP_FILE
+       chmod 644 $PASSIVE_SETUP_FILE
+       >$PASSIVE_SETUP_FILE
+
+       NDOMAINS=`echo "$PASSIVE_DOMAINS" | awk -F',' '{print NF}'`
+
+       if test -n "$PASSIVE_IMAGES"; then
+               NIMAGES=`echo "$PASSIVE_IMAGES" | awk -F',' '{print NF}'`
+               if [ $NDOMAINS != $NIMAGES ]; then
+                       echo "# of passive domains and # of passive images 
doesn't match." >&2
+                       do_help
+                       exit 1
+               fi
+
+               for (( i=1; i<=$NDOMAINS; i++ )); do
+                       ID=`echo "$PASSIVE_DOMAINS" | awk -F"," '{print $'$i'}'`
+                       FILE=`echo "$PASSIVE_IMAGES" | awk -F',' '{print 
$'$i'}'`
+                       if test ! -f "$FILE"; then
+                               echo "Image $FILE for passive domain $ID not 
found." >&2
+                               return 1
+                       fi
+                       LNK_KERNEL=/boot/domain$ID-kernel
+                       ln -sf $FILE $LNK_KERNEL
+                       LNK_XEN=/boot/domain$ID-xen
+                       ln -sf $XENIMAGE $LNK_XEN
+                       set_passive_domain $ID $LNK_KERNEL $LNK_XEN 
+               done
+       else
+                       for (( i=1; i<=$NDOMAINS; i++ )); do
+                               ID=`echo "$PASSIVE_DOMAINS" | awk -F"," '{print 
$'$i'}'`
+                               LNK_XEN=/boot/domain$ID-xen
+                               set_passive_domain $ID none $LNK_XEN
+               done 
+
+       fi
+}
+
  
 # validate --separate= parameters. This function is called with IFS=,
 # so on each argument is splitted
@@ -746,6 +830,16 @@
                                ACTIVE_DOMAINS=$val
                                DO_SETUP=yes
                                ;;
+                       --passive-domains|--domains)
+                               error_if_empty $arg $val
+                               PASSIVE_DOMAINS=$val
+                               DO_SETUP=yes
+                               ;;
+                       --passive-images|--domain-images)
+                               error_if_empty $arg $val
+                               PASSIVE_IMAGES=$val
+                               DO_SETUP=yes
+                               ;;
                        --note-table-size)
                                error_if_empty $arg $val
                                if test $"KERNEL_SUPPORT" = "yes"; then
@@ -818,6 +912,16 @@
                        exit 1
                fi
        fi
+
+       if test -n "$ACTIVE_DOMAINS" -a "$START_DAEMON" != "yes"; then
+               echo "Option \"--active-domains\" can only be used with option 
\"-start-daemon\"." >&2
+               exit 1
+       fi
+
+       if test -n "$PASSIVE_DOMAINS" -a "$START_DAEMON" != "yes" -a "$START" 
!= "yes"; then
+               echo "Option \"--passive-domains\" or "--domains" can only be 
used with option \"--start-daemon\" or \"--start\"." >&2
+               exit 1
+       fi
 }
 
 
@@ -1025,6 +1129,15 @@
                fi
        fi
 
+       if test -n "$PASSIVE_DOMAINS"; then
+               if test "$KERNEL_SUPPORT" = "yes"; then
+                       echo $PASSIVE_DOMAINS >$MOUNT/passive_domains
+                       set_passive_domain_config
+               else
+                       echo "passive-domains not supported - ignored" >&2
+               fi
+       fi
+       
        if test $NOTE_SIZE != 0; then
                set_param notesize $NOTE_SIZE
        fi
@@ -1117,7 +1230,8 @@
  
        do_setup
        do_load_setup
-       check_valid_args
+       check_valid_vmlinux
+       check_valid_xen
        get_image_range "linux"
        get_image_range "xen"
        do_param_setup
@@ -1144,6 +1258,10 @@
                OPD_ARGS="$OPD_ARGS --image=$IMAGE_FILTER"
        fi
 
+       if ! test -z "$PASSIVE_DOMAINS"; then
+               OPD_ARGS="$OPD_ARGS --xen-passive-setup=$PASSIVE_SETUP_FILE"
+       fi
+
        if test -n "$VERBOSE"; then
                OPD_ARGS="$OPD_ARGS --verbose=$VERBOSE"
        fi
@@ -1350,6 +1468,8 @@
        move_and_remove $SAMPLES_DIR/current/{root}
 
        hup_daemon
+
+       rm -f /boot/domain-*-kernel /boot/domain-*-xen
 }
 
 
@@ -1380,7 +1500,8 @@
        fi
  
        if test "$SETUP" = "yes"; then
-               check_valid_args
+               check_valid_vmlinux
+               check_valid_xen
                do_save_setup
        fi
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel