[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] The patch cleans up (ugly) setup.c that I wanted to fix for a long time
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 737433c5bb2e7742931ec28fbfa57d3cc1e90d28 # Parent 60a8a5ca4291c75f64090311812ffb9fde7daea7 The patch cleans up (ugly) setup.c that I wanted to fix for a long time (but did not have time for that). It should be compiled for the native x86_64 Linux as well (but not tested yet, so I don't guarantee): - no #if 0 or comment out - use CONFIG_XEN for xen specific code - preparation for merge to the upstream - tested both dom0 (UP and SMP) and domU Signed-off-by: Jun Nakajima <jun.nakajima@xxxxxxxxx> diff -r 60a8a5ca4291 -r 737433c5bb2e linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c Mon Aug 15 07:51:58 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c Mon Aug 15 07:52:19 2005 @@ -46,7 +46,7 @@ e820.nr_map++; } -#if 0 +#ifndef CONFIG_XEN extern char _end[]; /* @@ -235,7 +235,6 @@ } } - void __init e820_print_map(char *who) { int i; @@ -516,9 +515,31 @@ printk(KERN_INFO "BIOS-provided physical RAM map:\n"); e820_print_map(who); } + +#else /* CONFIX_XEN */ +extern unsigned long xen_override_max_pfn; +extern union xen_start_info_union xen_start_info_union; +/* + * Guest physical starts from 0. + */ +unsigned long __init e820_end_of_ram(void) +{ + unsigned long max_end_pfn = xen_start_info.nr_pages; + + if ( xen_override_max_pfn < max_end_pfn) + xen_override_max_pfn = max_end_pfn; + + return xen_override_max_pfn; +} + + + +void __init e820_reserve_resources(void) +{ + return; /* Xen won't have reserved entries */ +} + #endif - -extern unsigned long xen_override_max_pfn; void __init parse_memopt(char *p, char **from) { diff -r 60a8a5ca4291 -r 737433c5bb2e linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Mon Aug 15 07:51:58 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Mon Aug 15 07:52:19 2005 @@ -40,7 +40,6 @@ #include <linux/acpi.h> #include <linux/kallsyms.h> #include <linux/edd.h> -#include <linux/percpu.h> #include <asm/mtrr.h> #include <asm/uaccess.h> #include <asm/system.h> @@ -58,27 +57,36 @@ #include <asm/setup.h> #include <asm/mach_apic.h> #include <asm/numa.h> +#ifdef CONFIG_XEN +#include <linux/percpu.h> #include <asm-xen/xen-public/physdev.h> #include "setup_arch_pre.h" #include <asm-xen/hypervisor.h> - #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) #define PFN_PHYS(x) ((x) << PAGE_SHIFT) - +#define end_pfn_map end_pfn #include <asm/mach-xen/setup_arch_post.h> extern unsigned long start_pfn; - -#if 0 -struct edid_info { - unsigned char dummy[128]; -}; -#endif - extern struct edid_info edid_info; + +shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; +EXPORT_SYMBOL(HYPERVISOR_shared_info); /* Allows setting of maximum possible memory size */ unsigned long xen_override_max_pfn; + +u32 *phys_to_machine_mapping, *pfn_to_mfn_frame_list; + +EXPORT_SYMBOL(phys_to_machine_mapping); + +DEFINE_PER_CPU(multicall_entry_t, multicall_list[8]); +DEFINE_PER_CPU(int, nr_multicall_ents); + +/* Raw start-of-day parameters from the hypervisor. */ +union xen_start_info_union xen_start_info_union; +#endif + /* * Machine setup.. */ @@ -166,7 +174,7 @@ #define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM) -#ifdef CONFIG_XEN_PRIVILEGED_GUEST +#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN) static struct resource system_rom_resource = { .name = "System ROM", .start = 0xf0000, @@ -200,7 +208,7 @@ #define ADAPTER_ROM_RESOURCES \ (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0]) -#ifdef CONFIG_XEN_PRIVILEGED_GUEST +#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN) static struct resource video_rom_resource = { .name = "Video ROM", .start = 0xc0000, @@ -216,7 +224,7 @@ .flags = IORESOURCE_RAM, }; -#ifdef CONFIG_XEN_PRIVILEGED_GUEST +#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN) #define romsignature(x) (*(unsigned short *)(x) == 0xaa55) static int __init romchecksum(unsigned char *rom, unsigned long length) @@ -294,33 +302,24 @@ } #endif -/* - * Point at the empty zero page to start with. We map the real shared_info - * page as soon as fixmap is up and running. - */ -shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; -EXPORT_SYMBOL(HYPERVISOR_shared_info); - -u32 *phys_to_machine_mapping, *pfn_to_mfn_frame_list; - -EXPORT_SYMBOL(phys_to_machine_mapping); - -DEFINE_PER_CPU(multicall_entry_t, multicall_list[8]); -DEFINE_PER_CPU(int, nr_multicall_ents); - -/* Raw start-of-day parameters from the hypervisor. */ -union xen_start_info_union xen_start_info_union; static __init void parse_cmdline_early (char ** cmdline_p) { char c = ' ', *to = command_line, *from = COMMAND_LINE; - int len = 0, max_cmdline; - + int len = 0; + + /* Save unparsed command line copy for /proc/cmdline */ +#ifdef CONFIG_XEN + int max_cmdline; + if ((max_cmdline = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE) max_cmdline = COMMAND_LINE_SIZE; memcpy(saved_command_line, xen_start_info.cmd_line, max_cmdline); - /* Save unparsed command line copy for /proc/cmdline */ saved_command_line[max_cmdline-1] = '\0'; +#else + memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE); + saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; +#endif for (;;) { if (c != ' ') @@ -378,8 +377,7 @@ acpi_skip_timer_override = 1; #endif #endif - -#if 0 +#ifndef CONFIG_XEN if (!memcmp(from, "nolapic", 7) || !memcmp(from, "disableapic", 11)) disable_apic = 1; @@ -391,8 +389,7 @@ skip_ioapic_setup = 0; ioapic_force = 1; } -#endif - +#endif if (!memcmp(from, "mem=", 4)) parse_memopt(from+4, &from); @@ -426,14 +423,10 @@ } #ifndef CONFIG_DISCONTIGMEM +#ifdef CONFIG_XEN static void __init contig_initmem_init(void) { unsigned long bootmap_size, bootmap; - - /* - * partially used pages are not usable - thus - * we are rounding upwards: - */ bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT; bootmap = start_pfn; @@ -441,19 +434,22 @@ reserve_bootmem(bootmap, bootmap_size); free_bootmem(start_pfn << PAGE_SHIFT, (end_pfn - start_pfn) << PAGE_SHIFT); - printk("Registering memory for bootmem: from %lx, size = %lx\n", - start_pfn << PAGE_SHIFT, (end_pfn - start_pfn) << PAGE_SHIFT); - /* - * This should cover kernel_end - */ -#if 0 - reserve_bootmem(HIGH_MEMORY, (PFN_PHYS(start_pfn) + - bootmap_size + PAGE_SIZE-1) - (HIGH_MEMORY)); -#endif reserve_bootmem(0, (PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE-1)); - +} +#else +static void __init contig_initmem_init(void) +{ + unsigned long bootmap_size, bootmap; + bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT; + bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size); + if (bootmap == -1L) + panic("Cannot find bootmem map of size %ld\n",bootmap_size); + bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn); + e820_bootmem_free(&contig_page_data, 0, end_pfn << PAGE_SHIFT); + reserve_bootmem(bootmap, bootmap_size); } +#endif /* !CONFIG_XEN */ #endif /* Use inline assembly to define this because the nops are defined @@ -545,35 +541,8 @@ } #endif -#if 0 -#define EBDA_ADDR_POINTER 0x40E -static void __init reserve_ebda_region(void) -{ - unsigned int addr; - /** - * there is a real-mode segmented pointer pointing to the - * 4K EBDA area at 0x40E - */ - addr = *(unsigned short *)phys_to_virt(EBDA_ADDR_POINTER); - addr <<= 4; - if (addr) - reserve_bootmem_generic(addr, PAGE_SIZE); -} -#endif - -/* - * Guest physical starts from 0. - */ - -unsigned long __init xen_end_of_ram(void) -{ - unsigned long max_end_pfn = xen_start_info.nr_pages; - - if ( xen_override_max_pfn < max_end_pfn) - xen_override_max_pfn = max_end_pfn; - - return xen_override_max_pfn; -} +#ifdef CONFIG_XEN +#define reserve_ebda_region() void(0) static void __init print_memory_map(char *who) { @@ -601,7 +570,6 @@ } } -#ifdef CONFIG_XEN void __init smp_alloc_memory(void) { int cpu; @@ -612,37 +580,35 @@ /* XXX free unused pages later */ } } + + +#else +#define EBDA_ADDR_POINTER 0x40E +static void __init reserve_ebda_region(void) +{ + unsigned int addr; + /** + * there is a real-mode segmented pointer pointing to the + * 4K EBDA area at 0x40E + */ + addr = *(unsigned short *)phys_to_virt(EBDA_ADDR_POINTER); + addr <<= 4; + if (addr) + reserve_bootmem_generic(addr, PAGE_SIZE); +} #endif void __init setup_arch(char **cmdline_p) { - int i, j; - physdev_op_t op; - -#if 0 - ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); -#else + unsigned long kernel_end; + +#ifdef CONFIG_XEN ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); -#endif drive_info = DRIVE_INFO; - + kernel_end = 0; /* dummy */ #ifdef CONFIG_XEN_PHYSDEV_ACCESS screen_info = SCREEN_INFO; -#endif - edid_info = EDID_INFO; - saved_video_mode = SAVED_VIDEO_MODE; - bootloader_type = LOADER_TYPE; - -#ifdef CONFIG_BLK_DEV_RAM - rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; - rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); - rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); -#endif - - HYPERVISOR_vm_assist(VMASST_CMD_enable, - VMASST_TYPE_writable_pagetables); - -#ifdef CONFIG_XEN_PHYSDEV_ACCESS + /* This is drawn from a dump from vgacon:startup in standard Linux. */ screen_info.orig_video_mode = 3; screen_info.orig_video_isVGA = 1; @@ -650,27 +616,57 @@ screen_info.orig_video_cols = 80; screen_info.orig_video_ega_bx = 3; screen_info.orig_video_points = 16; -#endif +#endif + edid_info = EDID_INFO; + saved_video_mode = SAVED_VIDEO_MODE; + bootloader_type = LOADER_TYPE; + +#ifdef CONFIG_BLK_DEV_RAM + rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; + rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); + rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); + + +#endif + + HYPERVISOR_vm_assist(VMASST_CMD_enable, + VMASST_TYPE_writable_pagetables); + ARCH_SETUP print_memory_map(machine_specific_memory_setup()); - - /* copy_edd(); */ +#else + ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); + drive_info = DRIVE_INFO; + screen_info = SCREEN_INFO; + edid_info = EDID_INFO; + saved_video_mode = SAVED_VIDEO_MODE; + bootloader_type = LOADER_TYPE; + +#ifdef CONFIG_BLK_DEV_RAM + rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; + rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); + rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); +#endif + setup_memory_region(); + copy_edd(); +#endif /* !CONFIG_XEN */ if (!MOUNT_ROOT_RDONLY) root_mountflags &= ~MS_RDONLY; init_mm.start_code = (unsigned long) &_text; init_mm.end_code = (unsigned long) &_etext; init_mm.end_data = (unsigned long) &_edata; -/* init_mm.brk = (unsigned long) &_end; */ +#ifdef CONFIG_XEN init_mm.brk = start_pfn << PAGE_SHIFT; - - -#if 0 /* XEN: This is nonsense: kernel may not even be contiguous in RAM. */ +#else + init_mm.brk = (unsigned long) &_end; + code_resource.start = virt_to_phys(&_text); code_resource.end = virt_to_phys(&_etext)-1; data_resource.start = virt_to_phys(&_etext); data_resource.end = virt_to_phys(&_edata)-1; #endif + parse_cmdline_early(cmdline_p); early_identify_cpu(&boot_cpu_data); @@ -679,15 +675,11 @@ * partially used pages are not usable - thus * we are rounding upwards: */ -#if 0 end_pfn = e820_end_of_ram(); -#else - end_pfn = xen_end_of_ram(); -#endif check_efer(); - init_memory_mapping(0, (end_pfn << PAGE_SHIFT)); + init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT)); #ifdef CONFIG_ACPI_NUMA /* @@ -702,24 +694,25 @@ contig_initmem_init(); #endif - /* Reserve direct mapping and shared info etc. */ -// reserve_bootmem_generic(table_start << PAGE_SHIFT, (table_end + 1 - table_start) << PAGE_SHIFT); - -// reserve_bootmem_generic(0, (table_end + 1) << PAGE_SHIFT); +#ifndef CONFIG_XEN + /* Reserve direct mapping */ + reserve_bootmem_generic(table_start << PAGE_SHIFT, + (table_end - table_start) << PAGE_SHIFT); /* reserve kernel */ -// kernel_end = round_up(__pa_symbol(&_end),PAGE_SIZE); - -#if 0 + kernel_end = round_up(__pa_symbol(&_end),PAGE_SIZE); + reserve_bootmem_generic(HIGH_MEMORY, kernel_end - HIGH_MEMORY); + /* * reserve physical page 0 - it's a special BIOS page on many boxes, * enabling clean reboots, SMP operation, laptop functions. */ reserve_bootmem_generic(0, PAGE_SIZE); -#endif /* reserve ebda region */ -/* reserve_ebda_region(); */ + reserve_ebda_region(); +#endif + #ifdef CONFIG_SMP /* @@ -739,6 +732,7 @@ */ acpi_reserve_bootmem(); #endif +#ifdef CONFIG_XEN #ifdef CONFIG_BLK_DEV_INITRD if (xen_start_info.mod_start) { if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) { @@ -756,10 +750,27 @@ } #endif #ifdef CONFIG_SMP -#ifdef CONFIG_XEN smp_alloc_memory(); #endif -#endif +#else /* CONFIG_XEN */ +#ifdef CONFIG_BLK_DEV_INITRD + if (LOADER_TYPE && INITRD_START) { + if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) { + reserve_bootmem_generic(INITRD_START, INITRD_SIZE); + initrd_start = + INITRD_START ? INITRD_START + PAGE_OFFSET : 0; + initrd_end = initrd_start+INITRD_SIZE; + } + else { + printk(KERN_ERR "initrd extends beyond end of memory " + "(0x%08lx > 0x%08lx)\ndisabling initrd\n", + (unsigned long)(INITRD_START + INITRD_SIZE), + (unsigned long)(end_pfn << PAGE_SHIFT)); + initrd_start = 0; + } + } +#endif +#endif /* !CONFIG_XEN */ paging_init(); #ifdef CONFIG_X86_LOCAL_APIC /* @@ -767,30 +778,36 @@ */ find_smp_config(); #endif - /* Make sure we have a large enough P->M table. */ - if (end_pfn > xen_start_info.nr_pages) { - phys_to_machine_mapping = alloc_bootmem( - max_pfn * sizeof(unsigned long)); - memset(phys_to_machine_mapping, ~0, - max_pfn * sizeof(unsigned long)); - memcpy(phys_to_machine_mapping, - (unsigned long *)xen_start_info.mfn_list, - xen_start_info.nr_pages * sizeof(unsigned long)); - free_bootmem( - __pa(xen_start_info.mfn_list), - PFN_PHYS(PFN_UP(xen_start_info.nr_pages * - sizeof(unsigned long)))); - } - - pfn_to_mfn_frame_list = alloc_bootmem(PAGE_SIZE); - - for ( i=0, j=0; i < end_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) - { - pfn_to_mfn_frame_list[j] = - virt_to_machine(&phys_to_machine_mapping[i]) >> PAGE_SHIFT; - } - -#if 0 +#ifdef CONFIG_XEN + { + int i, j; + /* Make sure we have a large enough P->M table. */ + if (end_pfn > xen_start_info.nr_pages) { + phys_to_machine_mapping = alloc_bootmem( + max_pfn * sizeof(unsigned long)); + memset(phys_to_machine_mapping, ~0, + max_pfn * sizeof(unsigned long)); + memcpy(phys_to_machine_mapping, + (unsigned long *)xen_start_info.mfn_list, + xen_start_info.nr_pages * sizeof(unsigned long)); + free_bootmem( + __pa(xen_start_info.mfn_list), + PFN_PHYS(PFN_UP(xen_start_info.nr_pages * + sizeof(unsigned long)))); + } + + pfn_to_mfn_frame_list = alloc_bootmem(PAGE_SIZE); + + for ( i=0, j=0; i < end_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) + { + pfn_to_mfn_frame_list[j] = + virt_to_machine(&phys_to_machine_mapping[i]) >> PAGE_SHIFT; + } + + } +#endif + +#ifndef CONFIG_XEN check_ioapic(); #endif @@ -806,6 +823,7 @@ */ acpi_boot_init(); #endif + #ifdef CONFIG_X86_LOCAL_APIC /* * get boot-time SMP configuration: @@ -817,18 +835,14 @@ #endif #endif - /* XXX Disable irqdebug until we have a way to avoid interrupt - * conflicts. */ -/* noirqdebug_setup(""); */ - -#ifdef CONFIG_XEN_PRIVILEGED_GUEST +#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN) /* * Request address space for all standard RAM and ROM resources * and also for regions reported as reserved by the e820. */ probe_roms(); -#endif -/* e820_reserve_resources(); */ + e820_reserve_resources(); +#endif request_resource(&iomem_resource, &video_ram_resource); @@ -845,14 +859,40 @@ iommu_hole_init(); #endif - op.cmd = PHYSDEVOP_SET_IOPL; - op.u.set_iopl.iopl = 1; - HYPERVISOR_physdev_op(&op); - - if (xen_start_info.flags & SIF_INITDOMAIN) { - if (!(xen_start_info.flags & SIF_PRIVILEGED)) - panic("Xen granted us console access " - "but not privileged status"); +#ifdef CONFIG_XEN + { + physdev_op_t op; + + op.cmd = PHYSDEVOP_SET_IOPL; + op.u.set_iopl.iopl = 1; + HYPERVISOR_physdev_op(&op); + + if (xen_start_info.flags & SIF_INITDOMAIN) { + if (!(xen_start_info.flags & SIF_PRIVILEGED)) + panic("Xen granted us console access " + "but not privileged status"); + +#ifdef CONFIG_VT +#if defined(CONFIG_VGA_CONSOLE) + conswitchp = &vga_con; +#elif defined(CONFIG_DUMMY_CONSOLE) + conswitchp = &dummy_con; +#endif +#endif + } else { +#ifdef CONFIG_XEN_PRIVILEGED_GUEST + extern const struct consw xennull_con; + extern int console_use_vt; +#if defined(CONFIG_VGA_CONSOLE) + /* disable VGA driver */ + ORIG_VIDEO_ISVGA = VIDEO_TYPE_VLFB; +#endif + conswitchp = &xennull_con; + console_use_vt = 0; +#endif + } + } +#else /* CONFIG_XEN */ #ifdef CONFIG_VT #if defined(CONFIG_VGA_CONSOLE) @@ -861,18 +901,8 @@ conswitchp = &dummy_con; #endif #endif - } else { -#ifdef CONFIG_XEN_PRIVILEGED_GUEST - extern const struct consw xennull_con; - extern int console_use_vt; -#if defined(CONFIG_VGA_CONSOLE) - /* disable VGA driver */ - ORIG_VIDEO_ISVGA = VIDEO_TYPE_VLFB; -#endif - conswitchp = &xennull_con; - console_use_vt = 0; -#endif - } + +#endif /* !CONFIG_XEN */ } static int __init get_model_name(struct cpuinfo_x86 *c) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |