aboutsummaryrefslogtreecommitdiffstats
path: root/xenolinux-2.4.16-sparse/arch
diff options
context:
space:
mode:
authorrn@wyvis.camb.intel-research.net <rn@wyvis.camb.intel-research.net>2003-02-11 16:51:47 +0000
committerrn@wyvis.camb.intel-research.net <rn@wyvis.camb.intel-research.net>2003-02-11 16:51:47 +0000
commit36c582d70f2be02c95df430af074edc60e188c79 (patch)
treee3b78a71a324ecc500c00553a47f1d10c0647da9 /xenolinux-2.4.16-sparse/arch
parent6b0982272b177306647d2bf3d42554651351bc06 (diff)
parent24116e31a5a2ed3b1dc989c9f9c841f1fc9161d6 (diff)
downloadxen-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')
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c38
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c56
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h29
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/hypervisor_defs.h33
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/kernel/head.S4
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/kernel/setup.c17
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/kernel/traps.c1
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/mm/fault.c8
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/mm/get_unmapped_area.c10
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/mm/hypervisor.c18
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/mm/init.c30
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);
}