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

[Xen-changelog] Fix timer tick before its due problem (again)



ChangeSet 1.1305.1.7, 2005/03/17 17:48:21-07:00, djm@xxxxxxxxxxxxxxx

        Fix timer tick before its due problem (again)
        Split out hypercall code into separate module
        First step implementation of domain creation via hypercall



 arch/ia64/Makefile         |    2 
 arch/ia64/domain.c         |  488 ++++++++++++++++++++++++++++-----------------
 arch/ia64/hypercall.c      |   98 +++++++++
 arch/ia64/process.c        |   69 ------
 arch/ia64/vcpu.c           |   13 +
 arch/ia64/xensetup.c       |    4 
 include/public/arch-ia64.h |    2 
 7 files changed, 421 insertions(+), 255 deletions(-)


diff -Nru a/xen/arch/ia64/Makefile b/xen/arch/ia64/Makefile
--- a/xen/arch/ia64/Makefile    2005-03-25 19:04:38 -05:00
+++ b/xen/arch/ia64/Makefile    2005-03-25 19:04:38 -05:00
@@ -3,7 +3,7 @@
 # libs-y       += arch/ia64/lib/lib.a
 
 OBJS = xensetup.o setup.o time.o irq.o ia64_ksyms.o process.o smp.o \
-       xenmisc.o pdb-stub.o acpi.o \
+       xenmisc.o pdb-stub.o acpi.o hypercall.o \
        machvec.o dom0_ops.o domain.o \
        idle0_task.o pal.o hpsim.o efi.o efi_stub.o ivt.o mm_contig.o \
        mm_bootmem.o sal.o cmdline.o mm_init.o tlb.o page_alloc.o slab.o \
diff -Nru a/xen/arch/ia64/domain.c b/xen/arch/ia64/domain.c
--- a/xen/arch/ia64/domain.c    2005-03-25 19:04:38 -05:00
+++ b/xen/arch/ia64/domain.c    2005-03-25 19:04:38 -05:00
@@ -44,9 +44,11 @@
 // initialized by arch/ia64/setup.c:find_initrd()
 unsigned long initrd_start = 0, initrd_end = 0;
 
+#define IS_XEN_ADDRESS(d,a) ((a >= d->xen_vastart) && (a <= d->xen_vaend))
+
 extern int loadelfimage(char *);
 extern int readelfimage_base_and_size(char *, unsigned long,
-                  unsigned long *, unsigned long *, unsigned long *);
+                     unsigned long *, unsigned long *, unsigned long *);
 
 unsigned long map_domain_page0(struct domain *);
 extern unsigned long dom_fw_setup(struct domain *, char *, int);
@@ -54,63 +56,63 @@
 /* this belongs in include/asm, but there doesn't seem to be a suitable place 
*/
 void free_perdomain_pt(struct domain *d)
 {
-    dummy();
-    //free_page((unsigned long)d->mm.perdomain_pt);
+       dummy();
+       //free_page((unsigned long)d->mm.perdomain_pt);
 }
 
 int hlt_counter;
 
 void disable_hlt(void)
 {
-    hlt_counter++;
+       hlt_counter++;
 }
 
 void enable_hlt(void)
 {
-    hlt_counter--;
+       hlt_counter--;
 }
 
 static void default_idle(void)
 {
-    if ( hlt_counter == 0 )
-    {
+       if ( hlt_counter == 0 )
+       {
        local_irq_disable();
-        if ( !softirq_pending(smp_processor_id()) )
-            safe_halt();
-        //else
+           if ( !softirq_pending(smp_processor_id()) )
+               safe_halt();
+           //else
                local_irq_enable();
-    }
+       }
 }
 
 void continue_cpu_idle_loop(void)
 {
-    int cpu = smp_processor_id();
-    for ( ; ; )
-    {
+       int cpu = smp_processor_id();
+       for ( ; ; )
+       {
 #ifdef IA64
 //        __IRQ_STAT(cpu, idle_timestamp) = jiffies
 #else
-        irq_stat[cpu].idle_timestamp = jiffies;
+           irq_stat[cpu].idle_timestamp = jiffies;
 #endif
-        while ( !softirq_pending(cpu) )
-            default_idle();
-        do_softirq();
-    }
+           while ( !softirq_pending(cpu) )
+               default_idle();
+           do_softirq();
+       }
 }
 
 void startup_cpu_idle_loop(void)
 {
-    /* Just some sanity to ensure that the scheduler is set up okay. */
-    ASSERT(current->domain == IDLE_DOMAIN_ID);
-    domain_unpause_by_systemcontroller(current->domain);
-    __enter_scheduler();
-
-    /*
-     * Declares CPU setup done to the boot processor.
-     * Therefore memory barrier to ensure state is visible.
-     */
-    smp_mb();
-    init_idle();
+       /* Just some sanity to ensure that the scheduler is set up okay. */
+       ASSERT(current->domain == IDLE_DOMAIN_ID);
+       domain_unpause_by_systemcontroller(current->domain);
+       __enter_scheduler();
+
+       /*
+        * Declares CPU setup done to the boot processor.
+        * Therefore memory barrier to ensure state is visible.
+        */
+       smp_mb();
+       init_idle();
 #if 0
 //do we have to ensure the idle task has a shared page so that, for example,
 //region registers can be loaded from it.  Apparently not...
@@ -129,7 +131,7 @@
        }
 #endif
 
-    continue_cpu_idle_loop();
+       continue_cpu_idle_loop();
 }
 
 struct domain *arch_alloc_domain_struct(void)
@@ -214,9 +216,9 @@
 // heavily leveraged from linux/arch/ia64/kernel/process.c:copy_thread()
 // and linux/arch/ia64/kernel/process.c:kernel_thread()
 void new_thread(struct exec_domain *ed,
-                unsigned long start_pc,
-                unsigned long start_stack,
-                unsigned long start_info)
+                   unsigned long start_pc,
+                   unsigned long start_stack,
+                   unsigned long start_info)
 {
        struct domain *d = ed->domain;
        struct switch_stack *sw;
@@ -393,24 +395,38 @@
        return (IS_ELF(*ehdr));
 }
 
+static void copy_memory(void *dst, void *src, int size)
+{
+       if (IS_XEN_ADDRESS(dom0,src)) {
+               memcpy(dst,src,size);
+       }
+       else {
+               if (__copy_from_user(dst,src,size))
+                       printf("incomplete user copy\n");
+       }
+}
+
 void loaddomainelfimage(struct domain *d, unsigned long image_start)
 {
-    char *elfbase = image_start;
-    Elf_Ehdr *ehdr = (Elf_Ehdr *)image_start;
-    Elf_Phdr *phdr;
-    int h, filesz, memsz, paddr;
-    unsigned long elfaddr, dom_mpaddr, dom_imva;
-    struct page *p;
+       char *elfbase = image_start;
+       //Elf_Ehdr *ehdr = (Elf_Ehdr *)image_start;
+       Elf_Ehdr ehdr;
+       Elf_Phdr phdr;
+       int h, filesz, memsz, paddr;
+       unsigned long elfaddr, dom_mpaddr, dom_imva;
+       struct page *p;
   
-    for ( h = 0; h < ehdr->e_phnum; h++ ) {
-        phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
-        //if ( !is_loadable_phdr(phdr) )
-        if ((phdr->p_type != PT_LOAD)) {
-            continue;
-       }
-       filesz = phdr->p_filesz; memsz = phdr->p_memsz;
-       elfaddr = elfbase + phdr->p_offset;
-       dom_mpaddr = phdr->p_paddr;
+       copy_memory(&ehdr,image_start,sizeof(Elf_Ehdr));
+       for ( h = 0; h < ehdr.e_phnum; h++ ) {
+               copy_memory(&phdr,elfbase + ehdr.e_phoff + (h*ehdr.e_phentsize),
+               sizeof(Elf_Phdr));
+           //if ( !is_loadable_phdr(phdr) )
+           if ((phdr.p_type != PT_LOAD)) {
+               continue;
+       }
+       filesz = phdr.p_filesz; memsz = phdr.p_memsz;
+       elfaddr = elfbase + phdr.p_offset;
+       dom_mpaddr = phdr.p_paddr;
 //printf("p_offset: %x, size=%x\n",elfaddr,filesz);
 #ifdef CONFIG_DOMAIN0_CONTIGUOUS
        if (d == dom0) {
@@ -419,10 +435,10 @@
                        while(1);
                }
                dom_imva = __va(dom_mpaddr + dom0_start);
-               memcpy(dom_imva,elfaddr,filesz);
+               copy_memory(dom_imva,elfaddr,filesz);
                if (memsz > filesz) memset(dom_imva+filesz,0,memsz-filesz);
 //FIXME: This test for code seems to find a lot more than objdump -x does
-               if (phdr->p_flags & PF_X) privify_memory(dom_imva,filesz);
+               if (phdr.p_flags & PF_X) privify_memory(dom_imva,filesz);
        }
        else
 #endif
@@ -432,13 +448,13 @@
                dom_imva = __va(page_to_phys(p));
                if (filesz > 0) {
                        if (filesz >= PAGE_SIZE)
-                               memcpy(dom_imva,elfaddr,PAGE_SIZE);
+                               copy_memory(dom_imva,elfaddr,PAGE_SIZE);
                        else { // copy partial page, zero the rest of page
-                               memcpy(dom_imva,elfaddr,filesz);
+                               copy_memory(dom_imva,elfaddr,filesz);
                                memset(dom_imva+filesz,0,PAGE_SIZE-filesz);
                        }
 //FIXME: This test for code seems to find a lot more than objdump -x does
-                       if (phdr->p_flags & PF_X)
+                       if (phdr.p_flags & PF_X)
                                privify_memory(dom_imva,PAGE_SIZE);
                }
                else if (memsz > 0) // always zero out entire page
@@ -446,66 +462,102 @@
                memsz -= PAGE_SIZE; filesz -= PAGE_SIZE;
                elfaddr += PAGE_SIZE; dom_mpaddr += PAGE_SIZE;
        }
-    }
+       }
+}
+
+int
+parsedomainelfimage(char *elfbase, unsigned long elfsize, unsigned long *entry)
+{
+       Elf_Ehdr ehdr;
+
+       copy_memory(&ehdr,elfbase,sizeof(Elf_Ehdr));
+
+       if ( !elf_sanity_check(&ehdr) ) {
+           printk("ELF sanity check failed.\n");
+           return -EINVAL;
+       }
+
+       if ( (ehdr.e_phoff + (ehdr.e_phnum * ehdr.e_phentsize)) > elfsize )
+       {
+           printk("ELF program headers extend beyond end of image.\n");


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/xen-changelog


 


Rackspace

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