diff options
author | rn@wyvis.camb.intel-research.net <rn@wyvis.camb.intel-research.net> | 2003-02-11 16:51:47 +0000 |
---|---|---|
committer | rn@wyvis.camb.intel-research.net <rn@wyvis.camb.intel-research.net> | 2003-02-11 16:51:47 +0000 |
commit | 36c582d70f2be02c95df430af074edc60e188c79 (patch) | |
tree | e3b78a71a324ecc500c00553a47f1d10c0647da9 /xenolinux-2.4.16-sparse/arch | |
parent | 6b0982272b177306647d2bf3d42554651351bc06 (diff) | |
parent | 24116e31a5a2ed3b1dc989c9f9c841f1fc9161d6 (diff) | |
download | xen-36c582d70f2be02c95df430af074edc60e188c79.tar.gz xen-36c582d70f2be02c95df430af074edc60e188c79.tar.bz2 xen-36c582d70f2be02c95df430af074edc60e188c79.zip |
bitkeeper revision 1.25 (3e492a23vrV6G7nvPEIWmSIcQxdFNw)
merge with latest changeset
Diffstat (limited to 'xenolinux-2.4.16-sparse/arch')
11 files changed, 124 insertions, 120 deletions
diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c index e4bb826097..f8a6ea93ea 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c @@ -1,4 +1,3 @@ - /****************************************************************************** * dom0_core.c * @@ -31,9 +30,19 @@ #include <asm/tlb.h> #include "dom0_ops.h" -#include "hypervisor_defs.h" -#define XENO_BASE "xeno" // proc file name defs should be in separate .h +/* Private proc-file data structures. */ +typedef struct proc_data { + unsigned int domain; + unsigned long map_size; +} dom_procdata_t; + +typedef struct proc_mem_data { + unsigned long pfn; + int tot_pages; +} proc_memdata_t; + +#define XENO_BASE "xeno" #define DOM0_CMD_INTF "dom0_cmd" #define DOM0_NEWDOM "new_dom_data" @@ -43,8 +52,6 @@ #define MAP_DISCONT 1 -frame_table_t * frame_table; - static struct proc_dir_entry *xeno_base; static struct proc_dir_entry *dom0_cmd_intf; static struct proc_dir_entry *proc_ft; @@ -197,9 +204,18 @@ static int cmd_write_proc(struct file *file, const char *buffer, goto out; } - /* is the request intended for hypervisor? */ - if(op.cmd != MAP_DOM_MEM){ - + if ( op.cmd == MAP_DOM_MEM ) + { + ret = dom_map_mem(op.u.dommem.domain, op.u.dommem.start_pfn, + op.u.dommem.tot_pages); + } + else if ( op.cmd == DO_PGUPDATES ) + { + ret = HYPERVISOR_pt_update((void *)op.u.pgupdate.pgt_update_arr, + op.u.pgupdate.num_pgt_updates); + } + else + { ret = HYPERVISOR_dom0_op(&op); /* if new domain created, create proc entries */ @@ -225,10 +241,6 @@ static int cmd_write_proc(struct file *file, const char *buffer, } - } else { - - ret = dom_map_mem(op.u.dommem.domain, op.u.dommem.start_pfn, - op.u.dommem.tot_pages); } out: @@ -238,8 +250,6 @@ out: static int __init init_module(void) { - frame_table = (frame_table_t *)start_info.frame_table; - /* xeno proc root setup */ xeno_base = proc_mkdir(XENO_BASE, &proc_root); diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c index 19a0ce7667..9d14070a1e 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c @@ -1,4 +1,3 @@ - #include <linux/slab.h> #include <linux/mm.h> #include <linux/mman.h> @@ -15,21 +14,22 @@ #include <asm/tlb.h> #include <asm/mmu.h> -#include "hypervisor_defs.h" +#include "dom0_ops.h" #define MAP_CONT 0 #define MAP_DISCONT 1 extern struct list_head * find_direct(struct list_head *, unsigned long); -/* bd240: functions below perform direct mapping to the real physical pages needed for - * mapping various hypervisor specific structures needed in dom0 userspace by various - * management applications such as domain builder etc. +/* + * bd240: functions below perform direct mapping to the real physical pages + * needed for mapping various hypervisor specific structures needed in dom0 + * userspace by various management applications such as domain builder etc. */ -#define direct_set_pte(pteptr, pteval) queue_l1_entry_update(__pa(pteptr), (pteval).pte_low) +#define direct_set_pte(pteptr, pteval) queue_l1_entry_update(__pa(pteptr)|PGREQ_UNCHECKED_UPDATE, (pteval).pte_low) -#define direct_pte_clear(pteptr) queue_l1_entry_update(__pa(pteptr), 0) +#define direct_pte_clear(pteptr) queue_l1_entry_update(__pa(pteptr)|PGREQ_UNCHECKED_UPDATE, 0) #define __direct_pte(x) ((pte_t) { (x) } ) #define __direct_mk_pte(page_nr,pgprot) __direct_pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot)) @@ -126,26 +126,36 @@ int direct_remap_page_range(unsigned long from, unsigned long phys_addr, unsigne int direct_remap_disc_page_range(unsigned long from, unsigned long first_pg, int tot_pages, pgprot_t prot) { - frame_table_t * current_ft; - unsigned long current_pfn; + dom0_op_t dom0_op; + unsigned long *pfns = get_free_page(GFP_KERNEL); unsigned long start = from; - int count = 0; - - current_ft = frame_table + first_pg; - current_pfn = first_pg; - while(count < tot_pages){ - if(direct_remap_page_range(start, current_pfn << PAGE_SHIFT, - PAGE_SIZE, prot)) + int pages, i; + + while ( tot_pages != 0 ) + { + dom0_op.cmd = DOM0_GETMEMLIST; + dom0_op.u.getmemlist.start_pfn = first_pg; + pages = 1023; + dom0_op.u.getmemlist.num_pfns = 1024; + if ( tot_pages < 1024 ) + dom0_op.u.getmemlist.num_pfns = pages = tot_pages; + dom0_op.u.getmemlist.buffer = pfns; + (void)HYPERVISOR_dom0_op(&dom0_op); + first_pg = pfns[1023]; + + for ( i = 0; i < pages; i++ ) + { + if(direct_remap_page_range(start, pfns[i] << PAGE_SHIFT, + PAGE_SIZE, prot)) goto out; start += PAGE_SIZE; - current_pfn = current_ft->next; - current_ft = (frame_table_t *)(frame_table + current_pfn); - count++; + tot_pages--; + } } out: - - return tot_pages - count; + free_page(pfns); + return tot_pages; } /* below functions replace standard sys_mmap and sys_munmap which are absolutely useless @@ -175,8 +185,8 @@ unsigned long direct_mmap(unsigned long phys_addr, unsigned long size, } /* add node on the list of directly mapped areas, make sure the - * list remains sorted. - */ + * list remains sorted. + */ dmmap = (direct_mmap_node_t *)kmalloc(sizeof(direct_mmap_node_t), GFP_KERNEL); dmmap->vm_start = addr; dmmap->vm_end = addr + size; diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h index dbb0b3ac72..d98ce1b1eb 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h @@ -8,10 +8,11 @@ #define DOM0_NEWDOMAIN 0 #define DOM0_KILLDOMAIN 1 -#define DOM0_MAPTASK 2 -#define MAP_DOM_MEM 3 +#define DOM0_GETMEMLIST 2 #define DOM0_STARTDOM 4 -#define MAX_CMD 4 +#define MAP_DOM_MEM 6 /* Not passed down to Xen */ +#define DO_PGUPDATES 7 /* Not passed down to Xen */ +#define MAX_CMD 8 #define MAX_CMD_LEN 256 @@ -28,12 +29,14 @@ typedef struct dom0_killdomain_st unsigned int domain; } dom0_killdomain_t; -typedef struct dom0_map_ts +typedef struct dom0_getmemlist_st { - unsigned int domain; - unsigned long ts_phy_addr; -} dom0_tsmap_t; + unsigned long start_pfn; + unsigned long num_pfns; + void *buffer; +} dom0_getmemlist_t; +/* This is entirely processed by XenoLinux */ typedef struct dom_mem { unsigned int domain; @@ -42,6 +45,13 @@ typedef struct dom_mem int tot_pages; } dom_mem_t; +/* This is entirely processed by XenoLinux */ +typedef struct dom_pgupdate +{ + unsigned long pgt_update_arr; + unsigned long num_pgt_updates; +} dom_pgupdate_t; + typedef struct domain_launch { unsigned int domain; @@ -49,8 +59,6 @@ typedef struct domain_launch unsigned long virt_load_addr; unsigned long virt_shinfo_addr; unsigned long virt_startinfo_addr; - unsigned long pgt_update_arr; - unsigned long num_pgt_updates; unsigned int num_vifs; char cmd_line[MAX_CMD_LEN]; } dom_meminfo_t; @@ -62,8 +70,9 @@ typedef struct dom0_op_st { dom0_newdomain_t newdomain; dom0_killdomain_t killdomain; - dom0_tsmap_t mapdomts; + dom0_getmemlist_t getmemlist; dom_mem_t dommem; + dom_pgupdate_t pgupdate; dom_meminfo_t meminfo; } u; diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/hypervisor_defs.h b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/hypervisor_defs.h deleted file mode 100644 index ee047735dd..0000000000 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/hypervisor_defs.h +++ /dev/null @@ -1,33 +0,0 @@ - -/****************************************************************************** - * dom0_ops.h - * - * Data structures defined in hypervisor code but needed in DOM0 as well. - * Contents of this file should be kept in sync with the hypervisor ones - * unless you do not want something terrible :) to happen. - * - * Copyright (c) 2002, Keir Fraser & Boris Dragovic - */ - - -/* original version: xen-2.4.16/include/xeno/mm.h */ -typedef struct pfn_info { - struct list_head list; /* ->mapping has some page lists. */ - unsigned long next; /* used for threading pages belonging */ - unsigned long prev; /* to same domain */ - unsigned long flags; /* atomic flags. */ - unsigned long tot_count; /* Total domain usage count. */ - unsigned long type_count; /* pagetable/dir, or domain-writeable refs. */ -} frame_table_t; - -extern frame_table_t * frame_table; - -typedef struct proc_data { - unsigned int domain; - unsigned long map_size; -} dom_procdata_t; - -typedef struct proc_mem_data { - unsigned long pfn; - int tot_pages; -} proc_memdata_t; diff --git a/xenolinux-2.4.16-sparse/arch/xeno/kernel/head.S b/xenolinux-2.4.16-sparse/arch/xeno/kernel/head.S index f05ebc7b6f..86a82b13dc 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/kernel/head.S +++ b/xenolinux-2.4.16-sparse/arch/xeno/kernel/head.S @@ -10,8 +10,8 @@ /* Offsets in start_info structure */ #define SHARED_INFO 4 -#define MOD_START 16 -#define MOD_LEN 20 +#define MOD_START 12 +#define MOD_LEN 16 startup_32: cld diff --git a/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c b/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c index 3bcb6dbdb4..979deacf5a 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c @@ -46,6 +46,8 @@ shared_info_t *HYPERVISOR_shared_info; +unsigned long *phys_to_machine_mapping; + /* * Machine setup.. */ @@ -143,6 +145,7 @@ void __init setup_arch(char **cmdline_p) { unsigned long start_pfn, max_pfn, max_low_pfn; unsigned long bootmap_size; + unsigned long i; extern void hypervisor_callback(void); extern void failsafe_callback(void); @@ -254,12 +257,24 @@ void __init setup_arch(char **cmdline_p) { unsigned long pgde = *pgd++; if ( !(pgde & 1) ) continue; - pte = (pgde & PAGE_MASK) - start_info.phys_base; + pte = machine_to_phys(pgde & PAGE_MASK); reserve_bootmem(pte, PAGE_SIZE); } } cur_pgd = init_mm.pgd = (pgd_t *)start_info.pt_base; + /* Now initialise the physical->machine mapping table. */ + phys_to_machine_mapping = alloc_bootmem(max_pfn * sizeof(unsigned long)); + for ( i = 0; i < max_pfn; i++ ) + { + unsigned long pgde, *ppte; + unsigned long pfn = i + (PAGE_OFFSET >> PAGE_SHIFT); + pgde = *((unsigned long *)start_info.pt_base + (pfn >> 10)); + ppte = (unsigned long *)machine_to_phys(pgde & PAGE_MASK) + (pfn&1023); + phys_to_machine_mapping[i] = + (*(unsigned long *)__va(ppte)) >> PAGE_SHIFT; + } + #ifdef CONFIG_BLK_DEV_INITRD if (start_info.mod_start) { if ((__pa(start_info.mod_start) + start_info.mod_len) <= diff --git a/xenolinux-2.4.16-sparse/arch/xeno/kernel/traps.c b/xenolinux-2.4.16-sparse/arch/xeno/kernel/traps.c index 2a546b49d5..c274928ae9 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/kernel/traps.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/kernel/traps.c @@ -562,5 +562,6 @@ static trap_info_t trap_table[] = { void __init trap_init(void) { HYPERVISOR_set_trap_table(trap_table); + HYPERVISOR_set_fast_trap(SYSCALL_VECTOR); cpu_init(); } diff --git a/xenolinux-2.4.16-sparse/arch/xeno/mm/fault.c b/xenolinux-2.4.16-sparse/arch/xeno/mm/fault.c index c2cd7262e9..41d966901a 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/mm/fault.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/mm/fault.c @@ -314,14 +314,14 @@ no_context: printk(" printing eip:\n"); printk("%08lx\n", regs->eip); page = ((unsigned long *) cur_pgd)[address >> 22]; - printk(KERN_ALERT "*pde = %08lx(%08lx)\n", page, page - start_info.phys_base); + printk(KERN_ALERT "*pde=%08lx(%08lx)\n", page, machine_to_phys(page)); if (page & 1) { page &= PAGE_MASK; address &= 0x003ff000; - page -= start_info.phys_base; + page = machine_to_phys(page); page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT]; - printk(KERN_ALERT "*pte = %08lx(%08lx)\n", page, - page - start_info.phys_base); + printk(KERN_ALERT "*pte=%08lx(%08lx)\n", page, + machine_to_phys(page)); } die("Oops", regs, error_code); bust_spinlocks(0); diff --git a/xenolinux-2.4.16-sparse/arch/xeno/mm/get_unmapped_area.c b/xenolinux-2.4.16-sparse/arch/xeno/mm/get_unmapped_area.c index 88339f563b..a7b4447589 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/mm/get_unmapped_area.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/mm/get_unmapped_area.c @@ -56,11 +56,6 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi if (TASK_SIZE - len < addr) return -ENOMEM; - if(current->pid > 100){ - printk(KERN_ALERT "bd240 debug: gua: vm addr found %lx\n", addr); - printk(KERN_ALERT "bd240 debug: gua: first condition %d, %lx, %lx\n",vma, addr + len, vma->vm_start); - printk(KERN_ALERT "bd240 debug: gua: second condition %d\n", direct_mapped(addr)); - } if ((!vma || addr + len <= vma->vm_start) && !direct_mapped(addr)) return addr; @@ -77,10 +72,7 @@ struct list_head *find_direct(struct list_head *list, unsigned long addr) for ( curr = direct_list->next; curr != direct_list; curr = curr->next ) { node = list_entry(curr, direct_mmap_node_t, list); - if( node->vm_start >= addr ){ - printk(KERN_ALERT "bd240 debug: find_direct: hit %lx\n", node->vm_start); - break; - } + if ( node->vm_start >= addr ) break; } return curr; diff --git a/xenolinux-2.4.16-sparse/arch/xeno/mm/hypervisor.c b/xenolinux-2.4.16-sparse/arch/xeno/mm/hypervisor.c index 7e33eaa53e..b051684aa2 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/mm/hypervisor.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/mm/hypervisor.c @@ -31,7 +31,7 @@ static void DEBUG_allow_pt_reads(void) pte = update_debug_queue[i].ptep; if ( pte == NULL ) continue; update_debug_queue[i].ptep = NULL; - update.ptr = __pa(pte) + start_info.phys_base; + update.ptr = phys_to_machine(__pa(pte)); update.val = update_debug_queue[i].pteval; HYPERVISOR_pt_update(&update, 1); } @@ -51,7 +51,7 @@ static void DEBUG_disallow_pt_read(unsigned long pa) pgd = pgd_offset_k(va); pmd = pmd_offset(pgd, va); pte = pte_offset(pmd, va); - update.ptr = __pa(pte) + start_info.phys_base; + update.ptr = phys_to_machine(__pa(pte)); pteval = *(unsigned long *)pte; update.val = pteval & ~_PAGE_PRESENT; HYPERVISOR_pt_update(&update, 1); @@ -100,21 +100,21 @@ void queue_l1_entry_update(unsigned long ptr, unsigned long val) #if PT_UPDATE_DEBUG > 0 DEBUG_disallow_pt_read(ptr); #endif - update_queue[idx].ptr = ptr + start_info.phys_base; + update_queue[idx].ptr = phys_to_machine(ptr); update_queue[idx].val = val; increment_index(); } void queue_l2_entry_update(unsigned long ptr, unsigned long val) { - update_queue[idx].ptr = ptr + start_info.phys_base; + update_queue[idx].ptr = phys_to_machine(ptr); update_queue[idx].val = val; increment_index(); } void queue_pt_switch(unsigned long ptr) { - update_queue[idx].ptr = ptr + start_info.phys_base; + update_queue[idx].ptr = phys_to_machine(ptr); update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND; update_queue[idx].val = PGEXT_NEW_BASEPTR; increment_index(); @@ -137,7 +137,7 @@ void queue_invlpg(unsigned long ptr) void queue_pgd_pin(unsigned long ptr) { - update_queue[idx].ptr = ptr + start_info.phys_base; + update_queue[idx].ptr = phys_to_machine(ptr); update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND; update_queue[idx].val = PGEXT_PIN_L2_TABLE; increment_index(); @@ -145,7 +145,7 @@ void queue_pgd_pin(unsigned long ptr) void queue_pgd_unpin(unsigned long ptr) { - update_queue[idx].ptr = ptr + start_info.phys_base; + update_queue[idx].ptr = phys_to_machine(ptr); update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND; update_queue[idx].val = PGEXT_UNPIN_TABLE; increment_index(); @@ -153,7 +153,7 @@ void queue_pgd_unpin(unsigned long ptr) void queue_pte_pin(unsigned long ptr) { - update_queue[idx].ptr = ptr + start_info.phys_base; + update_queue[idx].ptr = phys_to_machine(ptr); update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND; update_queue[idx].val = PGEXT_PIN_L1_TABLE; increment_index(); @@ -161,7 +161,7 @@ void queue_pte_pin(unsigned long ptr) void queue_pte_unpin(unsigned long ptr) { - update_queue[idx].ptr = ptr + start_info.phys_base; + update_queue[idx].ptr = phys_to_machine(ptr); update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND; update_queue[idx].val = PGEXT_UNPIN_TABLE; increment_index(); diff --git a/xenolinux-2.4.16-sparse/arch/xeno/mm/init.c b/xenolinux-2.4.16-sparse/arch/xeno/mm/init.c index de06252e04..b1e75a6bcf 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/mm/init.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/mm/init.c @@ -126,23 +126,23 @@ static inline void set_pte_phys (unsigned long vaddr, void __init paging_init(void) { + unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0}; + unsigned int max_dma, high, low; + + max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; + low = max_low_pfn; + high = highend_pfn; + + if (low < max_dma) { - unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0}; - unsigned int max_dma, high, low; - - max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; - low = max_low_pfn; - high = highend_pfn; - - if (low < max_dma) - zones_size[ZONE_DMA] = low; - else { - zones_size[ZONE_DMA] = max_dma; - zones_size[ZONE_NORMAL] = low - max_dma; - } - free_area_init(zones_size); + zones_size[ZONE_DMA] = low; } - return; + else + { + zones_size[ZONE_DMA] = max_dma; + zones_size[ZONE_NORMAL] = low - max_dma; + } + free_area_init(zones_size); } |