diff options
Diffstat (limited to 'arch')
42 files changed, 398 insertions, 257 deletions
diff --git a/arch/arm/include/asm/byteorder.h b/arch/arm/include/asm/byteorder.h index d04a7a2bc2e9..4fbfb22f65a0 100644 --- a/arch/arm/include/asm/byteorder.h +++ b/arch/arm/include/asm/byteorder.h | |||
| @@ -18,15 +18,7 @@ | |||
| 18 | #include <linux/compiler.h> | 18 | #include <linux/compiler.h> |
| 19 | #include <asm/types.h> | 19 | #include <asm/types.h> |
| 20 | 20 | ||
| 21 | #ifdef __ARMEB__ | 21 | static inline __attribute_const__ __u32 ___arch__swab32(__u32 x) |
| 22 | # define __BIG_ENDIAN | ||
| 23 | #else | ||
| 24 | # define __LITTLE_ENDIAN | ||
| 25 | #endif | ||
| 26 | |||
| 27 | #define __SWAB_64_THRU_32__ | ||
| 28 | |||
| 29 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) | ||
| 30 | { | 22 | { |
| 31 | __u32 t; | 23 | __u32 t; |
| 32 | 24 | ||
| @@ -48,8 +40,19 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 x) | |||
| 48 | 40 | ||
| 49 | return x; | 41 | return x; |
| 50 | } | 42 | } |
| 51 | #define __arch_swab32 __arch_swab32 | ||
| 52 | 43 | ||
| 53 | #include <linux/byteorder.h> | 44 | #define __arch__swab32(x) ___arch__swab32(x) |
| 45 | |||
| 46 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) | ||
| 47 | # define __BYTEORDER_HAS_U64__ | ||
| 48 | # define __SWAB_64_THRU_32__ | ||
| 49 | #endif | ||
| 50 | |||
| 51 | #ifdef __ARMEB__ | ||
| 52 | #include <linux/byteorder/big_endian.h> | ||
| 53 | #else | ||
| 54 | #include <linux/byteorder/little_endian.h> | ||
| 55 | #endif | ||
| 54 | 56 | ||
| 55 | #endif | 57 | #endif |
| 58 | |||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 4da736e25333..49896a2a1d72 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -1886,6 +1886,15 @@ config STACKTRACE_SUPPORT | |||
| 1886 | 1886 | ||
| 1887 | source "init/Kconfig" | 1887 | source "init/Kconfig" |
| 1888 | 1888 | ||
| 1889 | config PROBE_INITRD_HEADER | ||
| 1890 | bool "Probe initrd header created by addinitrd" | ||
| 1891 | depends on BLK_DEV_INITRD | ||
| 1892 | help | ||
| 1893 | Probe initrd header at the last page of kernel image. | ||
| 1894 | Say Y here if you are using arch/mips/boot/addinitrd.c to | ||
| 1895 | add initrd or initramfs image to the kernel image. | ||
| 1896 | Otherwise, say N. | ||
| 1897 | |||
| 1889 | menu "Bus options (PCI, PCMCIA, EISA, ISA, TC)" | 1898 | menu "Bus options (PCI, PCMCIA, EISA, ISA, TC)" |
| 1890 | 1899 | ||
| 1891 | config HW_HAS_EISA | 1900 | config HW_HAS_EISA |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 2aae76bce293..16f8edfe5cdc 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
| @@ -160,30 +160,33 @@ early_param("rd_size", rd_size_early); | |||
| 160 | static unsigned long __init init_initrd(void) | 160 | static unsigned long __init init_initrd(void) |
| 161 | { | 161 | { |
| 162 | unsigned long end; | 162 | unsigned long end; |
| 163 | u32 *initrd_header; | ||
| 164 | 163 | ||
| 165 | /* | 164 | /* |
| 166 | * Board specific code or command line parser should have | 165 | * Board specific code or command line parser should have |
| 167 | * already set up initrd_start and initrd_end. In these cases | 166 | * already set up initrd_start and initrd_end. In these cases |
| 168 | * perfom sanity checks and use them if all looks good. | 167 | * perfom sanity checks and use them if all looks good. |
| 169 | */ | 168 | */ |
| 170 | if (initrd_start && initrd_end > initrd_start) | 169 | if (!initrd_start || initrd_end <= initrd_start) { |
| 171 | goto sanitize; | 170 | #ifdef CONFIG_PROBE_INITRD_HEADER |
| 171 | u32 *initrd_header; | ||
| 172 | 172 | ||
| 173 | /* | 173 | /* |
| 174 | * See if initrd has been added to the kernel image by | 174 | * See if initrd has been added to the kernel image by |
| 175 | * arch/mips/boot/addinitrd.c. In that case a header is | 175 | * arch/mips/boot/addinitrd.c. In that case a header is |
| 176 | * prepended to initrd and is made up by 8 bytes. The fisrt | 176 | * prepended to initrd and is made up by 8 bytes. The first |
| 177 | * word is a magic number and the second one is the size of | 177 | * word is a magic number and the second one is the size of |
| 178 | * initrd. Initrd start must be page aligned in any cases. | 178 | * initrd. Initrd start must be page aligned in any cases. |
| 179 | */ | 179 | */ |
| 180 | initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8; | 180 | initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8; |
| 181 | if (initrd_header[0] != 0x494E5244) | 181 | if (initrd_header[0] != 0x494E5244) |
| 182 | goto disable; | ||
| 183 | initrd_start = (unsigned long)(initrd_header + 2); | ||
| 184 | initrd_end = initrd_start + initrd_header[1]; | ||
| 185 | #else | ||
| 182 | goto disable; | 186 | goto disable; |
| 183 | initrd_start = (unsigned long)(initrd_header + 2); | 187 | #endif |
| 184 | initrd_end = initrd_start + initrd_header[1]; | 188 | } |
| 185 | 189 | ||
| 186 | sanitize: | ||
| 187 | if (initrd_start & ~PAGE_MASK) { | 190 | if (initrd_start & ~PAGE_MASK) { |
| 188 | pr_err("initrd start must be page aligned\n"); | 191 | pr_err("initrd start must be page aligned\n"); |
| 189 | goto disable; | 192 | goto disable; |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 426cced1e9dc..6bee29097a56 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -373,8 +373,8 @@ void __noreturn die(const char * str, const struct pt_regs * regs) | |||
| 373 | do_exit(SIGSEGV); | 373 | do_exit(SIGSEGV); |
| 374 | } | 374 | } |
| 375 | 375 | ||
| 376 | extern const struct exception_table_entry __start___dbe_table[]; | 376 | extern struct exception_table_entry __start___dbe_table[]; |
| 377 | extern const struct exception_table_entry __stop___dbe_table[]; | 377 | extern struct exception_table_entry __stop___dbe_table[]; |
| 378 | 378 | ||
| 379 | __asm__( | 379 | __asm__( |
| 380 | " .section __dbe_table, \"a\"\n" | 380 | " .section __dbe_table, \"a\"\n" |
| @@ -1200,7 +1200,7 @@ void *set_except_vector(int n, void *addr) | |||
| 1200 | if (n == 0 && cpu_has_divec) { | 1200 | if (n == 0 && cpu_has_divec) { |
| 1201 | *(u32 *)(ebase + 0x200) = 0x08000000 | | 1201 | *(u32 *)(ebase + 0x200) = 0x08000000 | |
| 1202 | (0x03ffffff & (handler >> 2)); | 1202 | (0x03ffffff & (handler >> 2)); |
| 1203 | flush_icache_range(ebase + 0x200, ebase + 0x204); | 1203 | local_flush_icache_range(ebase + 0x200, ebase + 0x204); |
| 1204 | } | 1204 | } |
| 1205 | return (void *)old_handler; | 1205 | return (void *)old_handler; |
| 1206 | } | 1206 | } |
| @@ -1283,7 +1283,8 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
| 1283 | *w = (*w & 0xffff0000) | (((u32)handler >> 16) & 0xffff); | 1283 | *w = (*w & 0xffff0000) | (((u32)handler >> 16) & 0xffff); |
| 1284 | w = (u32 *)(b + ori_offset); | 1284 | w = (u32 *)(b + ori_offset); |
| 1285 | *w = (*w & 0xffff0000) | ((u32)handler & 0xffff); | 1285 | *w = (*w & 0xffff0000) | ((u32)handler & 0xffff); |
| 1286 | flush_icache_range((unsigned long)b, (unsigned long)(b+handler_len)); | 1286 | local_flush_icache_range((unsigned long)b, |
| 1287 | (unsigned long)(b+handler_len)); | ||
| 1287 | } | 1288 | } |
| 1288 | else { | 1289 | else { |
| 1289 | /* | 1290 | /* |
| @@ -1295,7 +1296,8 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
| 1295 | w = (u32 *)b; | 1296 | w = (u32 *)b; |
| 1296 | *w++ = 0x08000000 | (((u32)handler >> 2) & 0x03fffff); /* j handler */ | 1297 | *w++ = 0x08000000 | (((u32)handler >> 2) & 0x03fffff); /* j handler */ |
| 1297 | *w = 0; | 1298 | *w = 0; |
| 1298 | flush_icache_range((unsigned long)b, (unsigned long)(b+8)); | 1299 | local_flush_icache_range((unsigned long)b, |
| 1300 | (unsigned long)(b+8)); | ||
| 1299 | } | 1301 | } |
| 1300 | 1302 | ||
| 1301 | return (void *)old_handler; | 1303 | return (void *)old_handler; |
| @@ -1515,7 +1517,7 @@ void __cpuinit per_cpu_trap_init(void) | |||
| 1515 | void __init set_handler(unsigned long offset, void *addr, unsigned long size) | 1517 | void __init set_handler(unsigned long offset, void *addr, unsigned long size) |
| 1516 | { | 1518 | { |
| 1517 | memcpy((void *)(ebase + offset), addr, size); | 1519 | memcpy((void *)(ebase + offset), addr, size); |
| 1518 | flush_icache_range(ebase + offset, ebase + offset + size); | 1520 | local_flush_icache_range(ebase + offset, ebase + offset + size); |
| 1519 | } | 1521 | } |
| 1520 | 1522 | ||
| 1521 | static char panic_null_cerr[] __cpuinitdata = | 1523 | static char panic_null_cerr[] __cpuinitdata = |
| @@ -1680,6 +1682,8 @@ void __init trap_init(void) | |||
| 1680 | signal32_init(); | 1682 | signal32_init(); |
| 1681 | #endif | 1683 | #endif |
| 1682 | 1684 | ||
| 1683 | flush_icache_range(ebase, ebase + 0x400); | 1685 | local_flush_icache_range(ebase, ebase + 0x400); |
| 1684 | flush_tlb_handlers(); | 1686 | flush_tlb_handlers(); |
| 1687 | |||
| 1688 | sort_extable(__start___dbe_table, __stop___dbe_table); | ||
| 1685 | } | 1689 | } |
diff --git a/arch/mips/mm/c-r3k.c b/arch/mips/mm/c-r3k.c index 27a5b466c85c..5500c20c79ae 100644 --- a/arch/mips/mm/c-r3k.c +++ b/arch/mips/mm/c-r3k.c | |||
| @@ -320,6 +320,7 @@ void __cpuinit r3k_cache_init(void) | |||
| 320 | flush_cache_range = r3k_flush_cache_range; | 320 | flush_cache_range = r3k_flush_cache_range; |
| 321 | flush_cache_page = r3k_flush_cache_page; | 321 | flush_cache_page = r3k_flush_cache_page; |
| 322 | flush_icache_range = r3k_flush_icache_range; | 322 | flush_icache_range = r3k_flush_icache_range; |
| 323 | local_flush_icache_range = r3k_flush_icache_range; | ||
| 323 | 324 | ||
| 324 | flush_cache_sigtramp = r3k_flush_cache_sigtramp; | 325 | flush_cache_sigtramp = r3k_flush_cache_sigtramp; |
| 325 | local_flush_data_cache_page = local_r3k_flush_data_cache_page; | 326 | local_flush_data_cache_page = local_r3k_flush_data_cache_page; |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 71df3390c07b..6e99665ae860 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
| @@ -543,12 +543,8 @@ struct flush_icache_range_args { | |||
| 543 | unsigned long end; | 543 | unsigned long end; |
| 544 | }; | 544 | }; |
| 545 | 545 | ||
| 546 | static inline void local_r4k_flush_icache_range(void *args) | 546 | static inline void local_r4k_flush_icache_range(unsigned long start, unsigned long end) |
| 547 | { | 547 | { |
| 548 | struct flush_icache_range_args *fir_args = args; | ||
| 549 | unsigned long start = fir_args->start; | ||
| 550 | unsigned long end = fir_args->end; | ||
| 551 | |||
| 552 | if (!cpu_has_ic_fills_f_dc) { | 548 | if (!cpu_has_ic_fills_f_dc) { |
| 553 | if (end - start >= dcache_size) { | 549 | if (end - start >= dcache_size) { |
| 554 | r4k_blast_dcache(); | 550 | r4k_blast_dcache(); |
| @@ -564,6 +560,15 @@ static inline void local_r4k_flush_icache_range(void *args) | |||
| 564 | protected_blast_icache_range(start, end); | 560 | protected_blast_icache_range(start, end); |
| 565 | } | 561 | } |
| 566 | 562 | ||
| 563 | static inline void local_r4k_flush_icache_range_ipi(void *args) | ||
| 564 | { | ||
| 565 | struct flush_icache_range_args *fir_args = args; | ||
| 566 | unsigned long start = fir_args->start; | ||
| 567 | unsigned long end = fir_args->end; | ||
| 568 | |||
| 569 | local_r4k_flush_icache_range(start, end); | ||
| 570 | } | ||
| 571 | |||
| 567 | static void r4k_flush_icache_range(unsigned long start, unsigned long end) | 572 | static void r4k_flush_icache_range(unsigned long start, unsigned long end) |
| 568 | { | 573 | { |
| 569 | struct flush_icache_range_args args; | 574 | struct flush_icache_range_args args; |
| @@ -571,7 +576,7 @@ static void r4k_flush_icache_range(unsigned long start, unsigned long end) | |||
| 571 | args.start = start; | 576 | args.start = start; |
| 572 | args.end = end; | 577 | args.end = end; |
| 573 | 578 | ||
| 574 | r4k_on_each_cpu(local_r4k_flush_icache_range, &args, 1); | 579 | r4k_on_each_cpu(local_r4k_flush_icache_range_ipi, &args, 1); |
| 575 | instruction_hazard(); | 580 | instruction_hazard(); |
| 576 | } | 581 | } |
| 577 | 582 | ||
| @@ -1375,6 +1380,7 @@ void __cpuinit r4k_cache_init(void) | |||
| 1375 | local_flush_data_cache_page = local_r4k_flush_data_cache_page; | 1380 | local_flush_data_cache_page = local_r4k_flush_data_cache_page; |
| 1376 | flush_data_cache_page = r4k_flush_data_cache_page; | 1381 | flush_data_cache_page = r4k_flush_data_cache_page; |
| 1377 | flush_icache_range = r4k_flush_icache_range; | 1382 | flush_icache_range = r4k_flush_icache_range; |
| 1383 | local_flush_icache_range = local_r4k_flush_icache_range; | ||
| 1378 | 1384 | ||
| 1379 | #if defined(CONFIG_DMA_NONCOHERENT) | 1385 | #if defined(CONFIG_DMA_NONCOHERENT) |
| 1380 | if (coherentio) { | 1386 | if (coherentio) { |
diff --git a/arch/mips/mm/c-tx39.c b/arch/mips/mm/c-tx39.c index a9f7f1f5e9b4..f7c8f9ce39c1 100644 --- a/arch/mips/mm/c-tx39.c +++ b/arch/mips/mm/c-tx39.c | |||
| @@ -362,6 +362,7 @@ void __cpuinit tx39_cache_init(void) | |||
| 362 | flush_cache_range = (void *) tx39h_flush_icache_all; | 362 | flush_cache_range = (void *) tx39h_flush_icache_all; |
| 363 | flush_cache_page = (void *) tx39h_flush_icache_all; | 363 | flush_cache_page = (void *) tx39h_flush_icache_all; |
| 364 | flush_icache_range = (void *) tx39h_flush_icache_all; | 364 | flush_icache_range = (void *) tx39h_flush_icache_all; |
| 365 | local_flush_icache_range = (void *) tx39h_flush_icache_all; | ||
| 365 | 366 | ||
| 366 | flush_cache_sigtramp = (void *) tx39h_flush_icache_all; | 367 | flush_cache_sigtramp = (void *) tx39h_flush_icache_all; |
| 367 | local_flush_data_cache_page = (void *) tx39h_flush_icache_all; | 368 | local_flush_data_cache_page = (void *) tx39h_flush_icache_all; |
| @@ -390,6 +391,7 @@ void __cpuinit tx39_cache_init(void) | |||
| 390 | flush_cache_range = tx39_flush_cache_range; | 391 | flush_cache_range = tx39_flush_cache_range; |
| 391 | flush_cache_page = tx39_flush_cache_page; | 392 | flush_cache_page = tx39_flush_cache_page; |
| 392 | flush_icache_range = tx39_flush_icache_range; | 393 | flush_icache_range = tx39_flush_icache_range; |
| 394 | local_flush_icache_range = tx39_flush_icache_range; | ||
| 393 | 395 | ||
| 394 | flush_cache_sigtramp = tx39_flush_cache_sigtramp; | 396 | flush_cache_sigtramp = tx39_flush_cache_sigtramp; |
| 395 | local_flush_data_cache_page = local_tx39_flush_data_cache_page; | 397 | local_flush_data_cache_page = local_tx39_flush_data_cache_page; |
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index 034e8506f6ea..1eb7c71e3d6a 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c | |||
| @@ -29,6 +29,7 @@ void (*flush_cache_range)(struct vm_area_struct *vma, unsigned long start, | |||
| 29 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, | 29 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, |
| 30 | unsigned long pfn); | 30 | unsigned long pfn); |
| 31 | void (*flush_icache_range)(unsigned long start, unsigned long end); | 31 | void (*flush_icache_range)(unsigned long start, unsigned long end); |
| 32 | void (*local_flush_icache_range)(unsigned long start, unsigned long end); | ||
| 32 | 33 | ||
| 33 | void (*__flush_cache_vmap)(void); | 34 | void (*__flush_cache_vmap)(void); |
| 34 | void (*__flush_cache_vunmap)(void); | 35 | void (*__flush_cache_vunmap)(void); |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 76da73a5ab3c..979cf9197282 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
| @@ -1273,10 +1273,10 @@ void __cpuinit build_tlb_refill_handler(void) | |||
| 1273 | 1273 | ||
| 1274 | void __cpuinit flush_tlb_handlers(void) | 1274 | void __cpuinit flush_tlb_handlers(void) |
| 1275 | { | 1275 | { |
| 1276 | flush_icache_range((unsigned long)handle_tlbl, | 1276 | local_flush_icache_range((unsigned long)handle_tlbl, |
| 1277 | (unsigned long)handle_tlbl + sizeof(handle_tlbl)); | 1277 | (unsigned long)handle_tlbl + sizeof(handle_tlbl)); |
| 1278 | flush_icache_range((unsigned long)handle_tlbs, | 1278 | local_flush_icache_range((unsigned long)handle_tlbs, |
| 1279 | (unsigned long)handle_tlbs + sizeof(handle_tlbs)); | 1279 | (unsigned long)handle_tlbs + sizeof(handle_tlbs)); |
| 1280 | flush_icache_range((unsigned long)handle_tlbm, | 1280 | local_flush_icache_range((unsigned long)handle_tlbm, |
| 1281 | (unsigned long)handle_tlbm + sizeof(handle_tlbm)); | 1281 | (unsigned long)handle_tlbm + sizeof(handle_tlbm)); |
| 1282 | } | 1282 | } |
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c index 0afe94c48fb6..fe6bee09cece 100644 --- a/arch/mips/txx9/generic/setup.c +++ b/arch/mips/txx9/generic/setup.c | |||
| @@ -53,6 +53,7 @@ txx9_reg_res_init(unsigned int pcode, unsigned long base, unsigned long size) | |||
| 53 | txx9_ce_res[i].name = txx9_ce_res_name[i]; | 53 | txx9_ce_res[i].name = txx9_ce_res_name[i]; |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | txx9_pcode = pcode; | ||
| 56 | sprintf(txx9_pcode_str, "TX%x", pcode); | 57 | sprintf(txx9_pcode_str, "TX%x", pcode); |
| 57 | if (base) { | 58 | if (base) { |
| 58 | txx9_reg_res.start = base & 0xfffffffffULL; | 59 | txx9_reg_res.start = base & 0xfffffffffULL; |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 9155c9312c1e..c6be19e9ceae 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
| @@ -116,6 +116,11 @@ ifeq ($(CONFIG_6xx),y) | |||
| 116 | KBUILD_CFLAGS += -mcpu=powerpc | 116 | KBUILD_CFLAGS += -mcpu=powerpc |
| 117 | endif | 117 | endif |
| 118 | 118 | ||
| 119 | # Work around a gcc code-gen bug with -fno-omit-frame-pointer. | ||
| 120 | ifeq ($(CONFIG_FTRACE),y) | ||
| 121 | KBUILD_CFLAGS += -mno-sched-epilog | ||
| 122 | endif | ||
| 123 | |||
| 119 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 | 124 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 |
| 120 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec | 125 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec |
| 121 | cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec | 126 | cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec |
diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h index db0b8f3b8807..4597c491e9b5 100644 --- a/arch/powerpc/include/asm/pgtable-ppc64.h +++ b/arch/powerpc/include/asm/pgtable-ppc64.h | |||
| @@ -153,12 +153,10 @@ | |||
| 153 | #define __S110 PAGE_SHARED_X | 153 | #define __S110 PAGE_SHARED_X |
| 154 | #define __S111 PAGE_SHARED_X | 154 | #define __S111 PAGE_SHARED_X |
| 155 | 155 | ||
| 156 | #ifdef CONFIG_HUGETLB_PAGE | 156 | #ifdef CONFIG_PPC_MM_SLICES |
| 157 | |||
| 158 | #define HAVE_ARCH_UNMAPPED_AREA | 157 | #define HAVE_ARCH_UNMAPPED_AREA |
| 159 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN | 158 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN |
| 160 | 159 | #endif /* CONFIG_PPC_MM_SLICES */ | |
| 161 | #endif | ||
| 162 | 160 | ||
| 163 | #ifndef __ASSEMBLY__ | 161 | #ifndef __ASSEMBLY__ |
| 164 | 162 | ||
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 64f5948ebc9d..946daea780f1 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
| @@ -14,12 +14,13 @@ endif | |||
| 14 | 14 | ||
| 15 | ifdef CONFIG_FTRACE | 15 | ifdef CONFIG_FTRACE |
| 16 | # Do not trace early boot code | 16 | # Do not trace early boot code |
| 17 | CFLAGS_REMOVE_cputable.o = -pg | 17 | CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog |
| 18 | CFLAGS_REMOVE_prom_init.o = -pg | 18 | CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog |
| 19 | CFLAGS_REMOVE_btext.o = -pg -mno-sched-epilog | ||
| 19 | 20 | ||
| 20 | ifdef CONFIG_DYNAMIC_FTRACE | 21 | ifdef CONFIG_DYNAMIC_FTRACE |
| 21 | # dynamic ftrace setup. | 22 | # dynamic ftrace setup. |
| 22 | CFLAGS_REMOVE_ftrace.o = -pg | 23 | CFLAGS_REMOVE_ftrace.o = -pg -mno-sched-epilog |
| 23 | endif | 24 | endif |
| 24 | 25 | ||
| 25 | endif | 26 | endif |
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c index 367129789cc0..5af4e9b2dbe2 100644 --- a/arch/powerpc/kernel/align.c +++ b/arch/powerpc/kernel/align.c | |||
| @@ -647,7 +647,7 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg, | |||
| 647 | unsigned int flags, unsigned int length) | 647 | unsigned int flags, unsigned int length) |
| 648 | { | 648 | { |
| 649 | char *ptr = (char *) ¤t->thread.TS_FPR(reg); | 649 | char *ptr = (char *) ¤t->thread.TS_FPR(reg); |
| 650 | int ret; | 650 | int ret = 0; |
| 651 | 651 | ||
| 652 | flush_vsx_to_thread(current); | 652 | flush_vsx_to_thread(current); |
| 653 | 653 | ||
diff --git a/arch/powerpc/kernel/idle_6xx.S b/arch/powerpc/kernel/idle_6xx.S index 019b02d8844f..15c611de1ee2 100644 --- a/arch/powerpc/kernel/idle_6xx.S +++ b/arch/powerpc/kernel/idle_6xx.S | |||
| @@ -158,7 +158,7 @@ _GLOBAL(power_save_ppc32_restore) | |||
| 158 | stw r9,_NIP(r11) /* make it do a blr */ | 158 | stw r9,_NIP(r11) /* make it do a blr */ |
| 159 | 159 | ||
| 160 | #ifdef CONFIG_SMP | 160 | #ifdef CONFIG_SMP |
| 161 | mfspr r12,SPRN_SPRG3 | 161 | rlwinm r12,r11,0,0,31-THREAD_SHIFT |
| 162 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ | 162 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ |
| 163 | slwi r11,r11,2 | 163 | slwi r11,r11,2 |
| 164 | #else | 164 | #else |
diff --git a/arch/powerpc/kernel/idle_e500.S b/arch/powerpc/kernel/idle_e500.S index 06304034b393..47a1a983ff88 100644 --- a/arch/powerpc/kernel/idle_e500.S +++ b/arch/powerpc/kernel/idle_e500.S | |||
| @@ -84,10 +84,11 @@ _GLOBAL(power_save_ppc32_restore) | |||
| 84 | stw r9,_NIP(r11) /* make it do a blr */ | 84 | stw r9,_NIP(r11) /* make it do a blr */ |
| 85 | 85 | ||
| 86 | #ifdef CONFIG_SMP | 86 | #ifdef CONFIG_SMP |
| 87 | mfspr r12,SPRN_SPRG3 | 87 | rlwinm r12,r1,0,0,31-THREAD_SHIFT |
| 88 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ | 88 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ |
| 89 | slwi r11,r11,2 | 89 | slwi r11,r11,2 |
| 90 | #else | 90 | #else |
| 91 | li r11,0 | 91 | li r11,0 |
| 92 | #endif | 92 | #endif |
| 93 | |||
| 93 | b transfer_to_handler_cont | 94 | b transfer_to_handler_cont |
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index 4a8ce62fe112..9f6c1ca1739e 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
| @@ -66,11 +66,12 @@ SECTIONS | |||
| 66 | __got2_end = .; | 66 | __got2_end = .; |
| 67 | #endif /* CONFIG_PPC32 */ | 67 | #endif /* CONFIG_PPC32 */ |
| 68 | 68 | ||
| 69 | . = ALIGN(PAGE_SIZE); | ||
| 70 | _etext = .; | ||
| 71 | PROVIDE32 (etext = .); | ||
| 72 | } :kernel | 69 | } :kernel |
| 73 | 70 | ||
| 71 | . = ALIGN(PAGE_SIZE); | ||
| 72 | _etext = .; | ||
| 73 | PROVIDE32 (etext = .); | ||
| 74 | |||
| 74 | /* Read-only data */ | 75 | /* Read-only data */ |
| 75 | RODATA | 76 | RODATA |
| 76 | 77 | ||
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 14be408dfc9b..8920eea34528 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
| @@ -191,12 +191,17 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend, | |||
| 191 | unsigned long hash, hpteg; | 191 | unsigned long hash, hpteg; |
| 192 | unsigned long vsid = get_kernel_vsid(vaddr, ssize); | 192 | unsigned long vsid = get_kernel_vsid(vaddr, ssize); |
| 193 | unsigned long va = hpt_va(vaddr, vsid, ssize); | 193 | unsigned long va = hpt_va(vaddr, vsid, ssize); |
| 194 | unsigned long tprot = prot; | ||
| 195 | |||
| 196 | /* Make kernel text executable */ | ||
| 197 | if (in_kernel_text(vaddr)) | ||
| 198 | tprot &= ~HPTE_R_N; | ||
| 194 | 199 | ||
| 195 | hash = hpt_hash(va, shift, ssize); | 200 | hash = hpt_hash(va, shift, ssize); |
| 196 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); | 201 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); |
| 197 | 202 | ||
| 198 | BUG_ON(!ppc_md.hpte_insert); | 203 | BUG_ON(!ppc_md.hpte_insert); |
| 199 | ret = ppc_md.hpte_insert(hpteg, va, paddr, prot, | 204 | ret = ppc_md.hpte_insert(hpteg, va, paddr, tprot, |
| 200 | HPTE_V_BOLTED, psize, ssize); | 205 | HPTE_V_BOLTED, psize, ssize); |
| 201 | 206 | ||
| 202 | if (ret < 0) | 207 | if (ret < 0) |
| @@ -584,7 +589,7 @@ void __init htab_initialize(void) | |||
| 584 | { | 589 | { |
| 585 | unsigned long table; | 590 | unsigned long table; |
| 586 | unsigned long pteg_count; | 591 | unsigned long pteg_count; |
| 587 | unsigned long prot, tprot; | 592 | unsigned long prot; |
| 588 | unsigned long base = 0, size = 0, limit; | 593 | unsigned long base = 0, size = 0, limit; |
| 589 | int i; | 594 | int i; |
| 590 | 595 | ||
| @@ -660,10 +665,9 @@ void __init htab_initialize(void) | |||
| 660 | for (i=0; i < lmb.memory.cnt; i++) { | 665 | for (i=0; i < lmb.memory.cnt; i++) { |
| 661 | base = (unsigned long)__va(lmb.memory.region[i].base); | 666 | base = (unsigned long)__va(lmb.memory.region[i].base); |
| 662 | size = lmb.memory.region[i].size; | 667 | size = lmb.memory.region[i].size; |
| 663 | tprot = prot | (in_kernel_text(base) ? _PAGE_EXEC : 0); | ||
| 664 | 668 | ||
| 665 | DBG("creating mapping for region: %lx..%lx (prot: %x)\n", | 669 | DBG("creating mapping for region: %lx..%lx (prot: %x)\n", |
| 666 | base, size, tprot); | 670 | base, size, prot); |
| 667 | 671 | ||
| 668 | #ifdef CONFIG_U3_DART | 672 | #ifdef CONFIG_U3_DART |
| 669 | /* Do not map the DART space. Fortunately, it will be aligned | 673 | /* Do not map the DART space. Fortunately, it will be aligned |
| @@ -680,21 +684,21 @@ void __init htab_initialize(void) | |||
| 680 | unsigned long dart_table_end = dart_tablebase + 16 * MB; | 684 | unsigned long dart_table_end = dart_tablebase + 16 * MB; |
| 681 | if (base != dart_tablebase) | 685 | if (base != dart_tablebase) |
| 682 | BUG_ON(htab_bolt_mapping(base, dart_tablebase, | 686 | BUG_ON(htab_bolt_mapping(base, dart_tablebase, |
| 683 | __pa(base), tprot, | 687 | __pa(base), prot, |
| 684 | mmu_linear_psize, | 688 | mmu_linear_psize, |
| 685 | mmu_kernel_ssize)); | 689 | mmu_kernel_ssize)); |
| 686 | if ((base + size) > dart_table_end) | 690 | if ((base + size) > dart_table_end) |
| 687 | BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB, | 691 | BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB, |
| 688 | base + size, | 692 | base + size, |
| 689 | __pa(dart_table_end), | 693 | __pa(dart_table_end), |
| 690 | tprot, | 694 | prot, |
| 691 | mmu_linear_psize, | 695 | mmu_linear_psize, |
| 692 | mmu_kernel_ssize)); | 696 | mmu_kernel_ssize)); |
| 693 | continue; | 697 | continue; |
| 694 | } | 698 | } |
| 695 | #endif /* CONFIG_U3_DART */ | 699 | #endif /* CONFIG_U3_DART */ |
| 696 | BUG_ON(htab_bolt_mapping(base, base + size, __pa(base), | 700 | BUG_ON(htab_bolt_mapping(base, base + size, __pa(base), |
| 697 | tprot, mmu_linear_psize, mmu_kernel_ssize)); | 701 | prot, mmu_linear_psize, mmu_kernel_ssize)); |
| 698 | } | 702 | } |
| 699 | 703 | ||
| 700 | /* | 704 | /* |
diff --git a/arch/powerpc/platforms/powermac/Makefile b/arch/powerpc/platforms/powermac/Makefile index 58ecdd72630f..be60d64be7ad 100644 --- a/arch/powerpc/platforms/powermac/Makefile +++ b/arch/powerpc/platforms/powermac/Makefile | |||
| @@ -2,7 +2,7 @@ CFLAGS_bootx_init.o += -fPIC | |||
| 2 | 2 | ||
| 3 | ifdef CONFIG_FTRACE | 3 | ifdef CONFIG_FTRACE |
| 4 | # Do not trace early boot code | 4 | # Do not trace early boot code |
| 5 | CFLAGS_REMOVE_bootx_init.o = -pg | 5 | CFLAGS_REMOVE_bootx_init.o = -pg -mno-sched-epilog |
| 6 | endif | 6 | endif |
| 7 | 7 | ||
| 8 | obj-y += pic.o setup.o time.o feature.o pci.o \ | 8 | obj-y += pic.o setup.o time.o feature.o pci.o \ |
diff --git a/arch/sh/configs/ap325rxa_defconfig b/arch/sh/configs/ap325rxa_defconfig index 29926a9b9ce2..851c870adf3b 100644 --- a/arch/sh/configs/ap325rxa_defconfig +++ b/arch/sh/configs/ap325rxa_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.26 | 3 | # Linux kernel version: 2.6.27-rc4 |
| 4 | # Wed Jul 30 01:18:59 2008 | 4 | # Tue Aug 26 14:21:17 2008 |
| 5 | # | 5 | # |
| 6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
| 7 | CONFIG_SUPERH32=y | 7 | CONFIG_SUPERH32=y |
| @@ -11,6 +11,7 @@ CONFIG_GENERIC_BUG=y | |||
| 11 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 11 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
| 12 | CONFIG_GENERIC_HWEIGHT=y | 12 | CONFIG_GENERIC_HWEIGHT=y |
| 13 | CONFIG_GENERIC_HARDIRQS=y | 13 | CONFIG_GENERIC_HARDIRQS=y |
| 14 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
| 14 | CONFIG_GENERIC_IRQ_PROBE=y | 15 | CONFIG_GENERIC_IRQ_PROBE=y |
| 15 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 16 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
| 16 | CONFIG_GENERIC_TIME=y | 17 | CONFIG_GENERIC_TIME=y |
| @@ -20,7 +21,6 @@ CONFIG_LOCKDEP_SUPPORT=y | |||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | 21 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set |
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 22 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
| 22 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | 23 | CONFIG_ARCH_NO_VIRT_TO_BUS=y |
| 23 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
| 24 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 24 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 25 | 25 | ||
| 26 | # | 26 | # |
| @@ -58,7 +58,6 @@ CONFIG_SYSCTL=y | |||
| 58 | CONFIG_EMBEDDED=y | 58 | CONFIG_EMBEDDED=y |
| 59 | CONFIG_UID16=y | 59 | CONFIG_UID16=y |
| 60 | CONFIG_SYSCTL_SYSCALL=y | 60 | CONFIG_SYSCTL_SYSCALL=y |
| 61 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 62 | # CONFIG_KALLSYMS is not set | 61 | # CONFIG_KALLSYMS is not set |
| 63 | CONFIG_HOTPLUG=y | 62 | CONFIG_HOTPLUG=y |
| 64 | CONFIG_PRINTK=y | 63 | CONFIG_PRINTK=y |
| @@ -89,6 +88,7 @@ CONFIG_HAVE_OPROFILE=y | |||
| 89 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | 88 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set |
| 90 | CONFIG_HAVE_CLK=y | 89 | CONFIG_HAVE_CLK=y |
| 91 | CONFIG_PROC_PAGE_MONITOR=y | 90 | CONFIG_PROC_PAGE_MONITOR=y |
| 91 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
| 92 | CONFIG_SLABINFO=y | 92 | CONFIG_SLABINFO=y |
| 93 | CONFIG_RT_MUTEXES=y | 93 | CONFIG_RT_MUTEXES=y |
| 94 | # CONFIG_TINY_SHMEM is not set | 94 | # CONFIG_TINY_SHMEM is not set |
| @@ -261,9 +261,10 @@ CONFIG_HZ_250=y | |||
| 261 | # CONFIG_HZ_300 is not set | 261 | # CONFIG_HZ_300 is not set |
| 262 | # CONFIG_HZ_1000 is not set | 262 | # CONFIG_HZ_1000 is not set |
| 263 | CONFIG_HZ=250 | 263 | CONFIG_HZ=250 |
| 264 | # CONFIG_SCHED_HRTICK is not set | 264 | CONFIG_SCHED_HRTICK=y |
| 265 | # CONFIG_KEXEC is not set | 265 | # CONFIG_KEXEC is not set |
| 266 | # CONFIG_CRASH_DUMP is not set | 266 | # CONFIG_CRASH_DUMP is not set |
| 267 | CONFIG_SECCOMP=y | ||
| 267 | # CONFIG_PREEMPT_NONE is not set | 268 | # CONFIG_PREEMPT_NONE is not set |
| 268 | # CONFIG_PREEMPT_VOLUNTARY is not set | 269 | # CONFIG_PREEMPT_VOLUNTARY is not set |
| 269 | CONFIG_PREEMPT=y | 270 | CONFIG_PREEMPT=y |
| @@ -289,10 +290,6 @@ CONFIG_CMDLINE="console=tty1 console=ttySC5,38400 root=/dev/nfs ip=dhcp" | |||
| 289 | # | 290 | # |
| 290 | CONFIG_BINFMT_ELF=y | 291 | CONFIG_BINFMT_ELF=y |
| 291 | # CONFIG_BINFMT_MISC is not set | 292 | # CONFIG_BINFMT_MISC is not set |
| 292 | |||
| 293 | # | ||
| 294 | # Networking | ||
| 295 | # | ||
| 296 | CONFIG_NET=y | 293 | CONFIG_NET=y |
| 297 | 294 | ||
| 298 | # | 295 | # |
| @@ -647,6 +644,7 @@ CONFIG_SSB_POSSIBLE=y | |||
| 647 | # CONFIG_MFD_CORE is not set | 644 | # CONFIG_MFD_CORE is not set |
| 648 | # CONFIG_MFD_SM501 is not set | 645 | # CONFIG_MFD_SM501 is not set |
| 649 | # CONFIG_HTC_PASIC3 is not set | 646 | # CONFIG_HTC_PASIC3 is not set |
| 647 | # CONFIG_MFD_TMIO is not set | ||
| 650 | 648 | ||
| 651 | # | 649 | # |
| 652 | # Multimedia devices | 650 | # Multimedia devices |
| @@ -690,7 +688,10 @@ CONFIG_DUMMY_CONSOLE=y | |||
| 690 | # CONFIG_ACCESSIBILITY is not set | 688 | # CONFIG_ACCESSIBILITY is not set |
| 691 | # CONFIG_RTC_CLASS is not set | 689 | # CONFIG_RTC_CLASS is not set |
| 692 | # CONFIG_DMADEVICES is not set | 690 | # CONFIG_DMADEVICES is not set |
| 693 | # CONFIG_UIO is not set | 691 | CONFIG_UIO=y |
| 692 | # CONFIG_UIO_PDRV is not set | ||
| 693 | CONFIG_UIO_PDRV_GENIRQ=y | ||
| 694 | # CONFIG_UIO_SMX is not set | ||
| 694 | 695 | ||
| 695 | # | 696 | # |
| 696 | # File systems | 697 | # File systems |
| @@ -854,6 +855,7 @@ CONFIG_FRAME_WARN=1024 | |||
| 854 | # CONFIG_DEBUG_KERNEL is not set | 855 | # CONFIG_DEBUG_KERNEL is not set |
| 855 | # CONFIG_DEBUG_BUGVERBOSE is not set | 856 | # CONFIG_DEBUG_BUGVERBOSE is not set |
| 856 | # CONFIG_DEBUG_MEMORY_INIT is not set | 857 | # CONFIG_DEBUG_MEMORY_INIT is not set |
| 858 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 857 | # CONFIG_SAMPLES is not set | 859 | # CONFIG_SAMPLES is not set |
| 858 | # CONFIG_SH_STANDARD_BIOS is not set | 860 | # CONFIG_SH_STANDARD_BIOS is not set |
| 859 | # CONFIG_EARLY_SCIF_CONSOLE is not set | 861 | # CONFIG_EARLY_SCIF_CONSOLE is not set |
diff --git a/arch/sh/configs/migor_defconfig b/arch/sh/configs/migor_defconfig index c4b3e1d8950d..4f8b1974f2c7 100644 --- a/arch/sh/configs/migor_defconfig +++ b/arch/sh/configs/migor_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.26 | 3 | # Linux kernel version: 2.6.27-rc4 |
| 4 | # Wed Jul 30 01:44:41 2008 | 4 | # Tue Aug 26 14:18:17 2008 |
| 5 | # | 5 | # |
| 6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
| 7 | CONFIG_SUPERH32=y | 7 | CONFIG_SUPERH32=y |
| @@ -11,6 +11,7 @@ CONFIG_GENERIC_BUG=y | |||
| 11 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 11 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
| 12 | CONFIG_GENERIC_HWEIGHT=y | 12 | CONFIG_GENERIC_HWEIGHT=y |
| 13 | CONFIG_GENERIC_HARDIRQS=y | 13 | CONFIG_GENERIC_HARDIRQS=y |
| 14 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
| 14 | CONFIG_GENERIC_IRQ_PROBE=y | 15 | CONFIG_GENERIC_IRQ_PROBE=y |
| 15 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 16 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
| 16 | CONFIG_GENERIC_TIME=y | 17 | CONFIG_GENERIC_TIME=y |
| @@ -21,7 +22,6 @@ CONFIG_LOCKDEP_SUPPORT=y | |||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | 22 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set |
| 22 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 23 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
| 23 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | 24 | CONFIG_ARCH_NO_VIRT_TO_BUS=y |
| 24 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
| 25 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 25 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
| 26 | 26 | ||
| 27 | # | 27 | # |
| @@ -87,6 +87,7 @@ CONFIG_HAVE_OPROFILE=y | |||
| 87 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | 87 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set |
| 88 | CONFIG_HAVE_CLK=y | 88 | CONFIG_HAVE_CLK=y |
| 89 | CONFIG_PROC_PAGE_MONITOR=y | 89 | CONFIG_PROC_PAGE_MONITOR=y |
| 90 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
| 90 | CONFIG_SLABINFO=y | 91 | CONFIG_SLABINFO=y |
| 91 | CONFIG_RT_MUTEXES=y | 92 | CONFIG_RT_MUTEXES=y |
| 92 | # CONFIG_TINY_SHMEM is not set | 93 | # CONFIG_TINY_SHMEM is not set |
| @@ -270,6 +271,7 @@ CONFIG_HZ=250 | |||
| 270 | # CONFIG_SCHED_HRTICK is not set | 271 | # CONFIG_SCHED_HRTICK is not set |
| 271 | # CONFIG_KEXEC is not set | 272 | # CONFIG_KEXEC is not set |
| 272 | # CONFIG_CRASH_DUMP is not set | 273 | # CONFIG_CRASH_DUMP is not set |
| 274 | CONFIG_SECCOMP=y | ||
| 273 | CONFIG_PREEMPT_NONE=y | 275 | CONFIG_PREEMPT_NONE=y |
| 274 | # CONFIG_PREEMPT_VOLUNTARY is not set | 276 | # CONFIG_PREEMPT_VOLUNTARY is not set |
| 275 | # CONFIG_PREEMPT is not set | 277 | # CONFIG_PREEMPT is not set |
| @@ -294,10 +296,6 @@ CONFIG_CMDLINE="console=ttySC0,115200 earlyprintk=serial ip=on" | |||
| 294 | # | 296 | # |
| 295 | CONFIG_BINFMT_ELF=y | 297 | CONFIG_BINFMT_ELF=y |
| 296 | # CONFIG_BINFMT_MISC is not set | 298 | # CONFIG_BINFMT_MISC is not set |
| 297 | |||
| 298 | # | ||
| 299 | # Networking | ||
| 300 | # | ||
| 301 | CONFIG_NET=y | 299 | CONFIG_NET=y |
| 302 | 300 | ||
| 303 | # | 301 | # |
| @@ -649,6 +647,7 @@ CONFIG_HW_RANDOM=y | |||
| 649 | CONFIG_I2C=y | 647 | CONFIG_I2C=y |
| 650 | CONFIG_I2C_BOARDINFO=y | 648 | CONFIG_I2C_BOARDINFO=y |
| 651 | # CONFIG_I2C_CHARDEV is not set | 649 | # CONFIG_I2C_CHARDEV is not set |
| 650 | CONFIG_I2C_HELPER_AUTO=y | ||
| 652 | 651 | ||
| 653 | # | 652 | # |
| 654 | # I2C Hardware Bus support | 653 | # I2C Hardware Bus support |
| @@ -709,6 +708,7 @@ CONFIG_SSB_POSSIBLE=y | |||
| 709 | # CONFIG_MFD_CORE is not set | 708 | # CONFIG_MFD_CORE is not set |
| 710 | # CONFIG_MFD_SM501 is not set | 709 | # CONFIG_MFD_SM501 is not set |
| 711 | # CONFIG_HTC_PASIC3 is not set | 710 | # CONFIG_HTC_PASIC3 is not set |
| 711 | # CONFIG_MFD_TMIO is not set | ||
| 712 | 712 | ||
| 713 | # | 713 | # |
| 714 | # Multimedia devices | 714 | # Multimedia devices |
| @@ -755,6 +755,8 @@ CONFIG_USB_ARCH_HAS_HCD=y | |||
| 755 | # CONFIG_USB is not set | 755 | # CONFIG_USB is not set |
| 756 | # CONFIG_USB_OTG_WHITELIST is not set | 756 | # CONFIG_USB_OTG_WHITELIST is not set |
| 757 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | 757 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set |
| 758 | # CONFIG_USB_MUSB_HDRC is not set | ||
| 759 | # CONFIG_USB_GADGET_MUSB_HDRC is not set | ||
| 758 | 760 | ||
| 759 | # | 761 | # |
| 760 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 762 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
| @@ -842,7 +844,10 @@ CONFIG_RTC_DRV_RS5C372=y | |||
| 842 | # | 844 | # |
| 843 | CONFIG_RTC_DRV_SH=y | 845 | CONFIG_RTC_DRV_SH=y |
| 844 | # CONFIG_DMADEVICES is not set | 846 | # CONFIG_DMADEVICES is not set |
| 845 | # CONFIG_UIO is not set | 847 | CONFIG_UIO=y |
| 848 | # CONFIG_UIO_PDRV is not set | ||
| 849 | CONFIG_UIO_PDRV_GENIRQ=y | ||
| 850 | # CONFIG_UIO_SMX is not set | ||
| 846 | 851 | ||
| 847 | # | 852 | # |
| 848 | # File systems | 853 | # File systems |
diff --git a/arch/sh/include/asm/uaccess_64.h b/arch/sh/include/asm/uaccess_64.h index 81b3d515fcb3..5580fd471003 100644 --- a/arch/sh/include/asm/uaccess_64.h +++ b/arch/sh/include/asm/uaccess_64.h | |||
| @@ -76,4 +76,6 @@ extern long __put_user_asm_l(void *, long); | |||
| 76 | extern long __put_user_asm_q(void *, long); | 76 | extern long __put_user_asm_q(void *, long); |
| 77 | extern void __put_user_unknown(void); | 77 | extern void __put_user_unknown(void); |
| 78 | 78 | ||
| 79 | extern long __strnlen_user(const char *__s, long __n); | ||
| 80 | |||
| 79 | #endif /* __ASM_SH_UACCESS_64_H */ | 81 | #endif /* __ASM_SH_UACCESS_64_H */ |
diff --git a/arch/sh/kernel/cpu/sh5/entry.S b/arch/sh/kernel/cpu/sh5/entry.S index 04c7da968146..e640c63d5811 100644 --- a/arch/sh/kernel/cpu/sh5/entry.S +++ b/arch/sh/kernel/cpu/sh5/entry.S | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * arch/sh/kernel/cpu/sh5/entry.S | 2 | * arch/sh/kernel/cpu/sh5/entry.S |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2000, 2001 Paolo Alberelli | 4 | * Copyright (C) 2000, 2001 Paolo Alberelli |
| 5 | * Copyright (C) 2004 - 2007 Paul Mundt | 5 | * Copyright (C) 2004 - 2008 Paul Mundt |
| 6 | * Copyright (C) 2003, 2004 Richard Curnow | 6 | * Copyright (C) 2003, 2004 Richard Curnow |
| 7 | * | 7 | * |
| 8 | * This file is subject to the terms and conditions of the GNU General Public | 8 | * This file is subject to the terms and conditions of the GNU General Public |
| @@ -923,6 +923,8 @@ ret_from_exception: | |||
| 923 | blink tr0, ZERO | 923 | blink tr0, ZERO |
| 924 | 924 | ||
| 925 | resume_kernel: | 925 | resume_kernel: |
| 926 | CLI() | ||
| 927 | |||
| 926 | pta restore_all, tr0 | 928 | pta restore_all, tr0 |
| 927 | 929 | ||
| 928 | getcon KCR0, r6 | 930 | getcon KCR0, r6 |
| @@ -939,19 +941,11 @@ need_resched: | |||
| 939 | andi r7, 0xf0, r7 | 941 | andi r7, 0xf0, r7 |
| 940 | bne r7, ZERO, tr0 | 942 | bne r7, ZERO, tr0 |
| 941 | 943 | ||
| 942 | movi ((PREEMPT_ACTIVE >> 16) & 65535), r8 | 944 | movi preempt_schedule_irq, r7 |
| 943 | shori (PREEMPT_ACTIVE & 65535), r8 | ||
| 944 | st.l r6, TI_PRE_COUNT, r8 | ||
| 945 | |||
| 946 | STI() | ||
| 947 | movi schedule, r7 | ||
| 948 | ori r7, 1, r7 | 945 | ori r7, 1, r7 |
| 949 | ptabs r7, tr1 | 946 | ptabs r7, tr1 |
| 950 | blink tr1, LINK | 947 | blink tr1, LINK |
| 951 | 948 | ||
| 952 | st.l r6, TI_PRE_COUNT, ZERO | ||
| 953 | CLI() | ||
| 954 | |||
| 955 | pta need_resched, tr1 | 949 | pta need_resched, tr1 |
| 956 | blink tr1, ZERO | 950 | blink tr1, ZERO |
| 957 | #endif | 951 | #endif |
diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index 0bc17def55a7..efbb4268875e 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S | |||
| @@ -92,6 +92,7 @@ ENTRY(ret_from_irq) | |||
| 92 | bra resume_userspace | 92 | bra resume_userspace |
| 93 | nop | 93 | nop |
| 94 | ENTRY(resume_kernel) | 94 | ENTRY(resume_kernel) |
| 95 | cli | ||
| 95 | mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count | 96 | mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count |
| 96 | tst r0, r0 | 97 | tst r0, r0 |
| 97 | bf noresched | 98 | bf noresched |
| @@ -105,28 +106,9 @@ need_resched: | |||
| 105 | and #0xf0, r0 ! interrupts off (exception path)? | 106 | and #0xf0, r0 ! interrupts off (exception path)? |
| 106 | cmp/eq #0xf0, r0 | 107 | cmp/eq #0xf0, r0 |
| 107 | bt noresched | 108 | bt noresched |
| 108 | |||
| 109 | mov.l 1f, r0 | ||
| 110 | mov.l r0, @(TI_PRE_COUNT,r8) | ||
| 111 | |||
| 112 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
| 113 | mov.l 3f, r0 | 109 | mov.l 3f, r0 |
| 114 | jsr @r0 | 110 | jsr @r0 ! call preempt_schedule_irq |
| 115 | nop | ||
| 116 | #endif | ||
| 117 | sti | ||
| 118 | mov.l 2f, r0 | ||
| 119 | jsr @r0 | ||
| 120 | nop | ||
| 121 | mov #0, r0 | ||
| 122 | mov.l r0, @(TI_PRE_COUNT,r8) | ||
| 123 | cli | ||
| 124 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
| 125 | mov.l 4f, r0 | ||
| 126 | jsr @r0 | ||
| 127 | nop | 111 | nop |
| 128 | #endif | ||
| 129 | |||
| 130 | bra need_resched | 112 | bra need_resched |
| 131 | nop | 113 | nop |
| 132 | 114 | ||
| @@ -137,10 +119,7 @@ noresched: | |||
| 137 | .align 2 | 119 | .align 2 |
| 138 | 1: .long PREEMPT_ACTIVE | 120 | 1: .long PREEMPT_ACTIVE |
| 139 | 2: .long schedule | 121 | 2: .long schedule |
| 140 | #ifdef CONFIG_TRACE_IRQFLAGS | 122 | 3: .long preempt_schedule_irq |
| 141 | 3: .long trace_hardirqs_on | ||
| 142 | 4: .long trace_hardirqs_off | ||
| 143 | #endif | ||
| 144 | #endif | 123 | #endif |
| 145 | 124 | ||
| 146 | ENTRY(resume_userspace) | 125 | ENTRY(resume_userspace) |
diff --git a/arch/sh/kernel/machine_kexec.c b/arch/sh/kernel/machine_kexec.c index 4703dff174d5..94df56b0d1f6 100644 --- a/arch/sh/kernel/machine_kexec.c +++ b/arch/sh/kernel/machine_kexec.c | |||
| @@ -102,7 +102,7 @@ void machine_kexec(struct kimage *image) | |||
| 102 | 102 | ||
| 103 | /* now call it */ | 103 | /* now call it */ |
| 104 | rnk = (relocate_new_kernel_t) reboot_code_buffer; | 104 | rnk = (relocate_new_kernel_t) reboot_code_buffer; |
| 105 | (*rnk)(page_list, reboot_code_buffer, image->start, vbr_reg); | 105 | (*rnk)(page_list, reboot_code_buffer, P2SEGADDR(image->start), vbr_reg); |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | void arch_crash_save_vmcoreinfo(void) | 108 | void arch_crash_save_vmcoreinfo(void) |
diff --git a/arch/sh/kernel/ptrace_64.c b/arch/sh/kernel/ptrace_64.c index 5922edd416db..9c6424892bd3 100644 --- a/arch/sh/kernel/ptrace_64.c +++ b/arch/sh/kernel/ptrace_64.c | |||
| @@ -131,6 +131,8 @@ void user_enable_single_step(struct task_struct *child) | |||
| 131 | 131 | ||
| 132 | void user_disable_single_step(struct task_struct *child) | 132 | void user_disable_single_step(struct task_struct *child) |
| 133 | { | 133 | { |
| 134 | struct pt_regs *regs = child->thread.uregs; | ||
| 135 | |||
| 134 | regs->sr &= ~SR_SSTEP; | 136 | regs->sr &= ~SR_SSTEP; |
| 135 | } | 137 | } |
| 136 | 138 | ||
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index a35207655e7b..de832056bf1b 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
| @@ -171,6 +171,7 @@ static void __init reserve_crashkernel(void) | |||
| 171 | (unsigned long)(free_mem >> 20)); | 171 | (unsigned long)(free_mem >> 20)); |
| 172 | crashk_res.start = crash_base; | 172 | crashk_res.start = crash_base; |
| 173 | crashk_res.end = crash_base + crash_size - 1; | 173 | crashk_res.end = crash_base + crash_size - 1; |
| 174 | insert_resource(&iomem_resource, &crashk_res); | ||
| 174 | } | 175 | } |
| 175 | } | 176 | } |
| 176 | #else | 177 | #else |
| @@ -204,11 +205,6 @@ void __init __add_active_range(unsigned int nid, unsigned long start_pfn, | |||
| 204 | request_resource(res, &data_resource); | 205 | request_resource(res, &data_resource); |
| 205 | request_resource(res, &bss_resource); | 206 | request_resource(res, &bss_resource); |
| 206 | 207 | ||
| 207 | #ifdef CONFIG_KEXEC | ||
| 208 | if (crashk_res.start != crashk_res.end) | ||
| 209 | request_resource(res, &crashk_res); | ||
| 210 | #endif | ||
| 211 | |||
| 212 | add_active_range(nid, start_pfn, end_pfn); | 208 | add_active_range(nid, start_pfn, end_pfn); |
| 213 | } | 209 | } |
| 214 | 210 | ||
diff --git a/arch/sh/kernel/sys_sh.c b/arch/sh/kernel/sys_sh.c index 59cd2859ce9b..9061b86d73fa 100644 --- a/arch/sh/kernel/sys_sh.c +++ b/arch/sh/kernel/sys_sh.c | |||
| @@ -170,7 +170,7 @@ asmlinkage int sys_ipc(uint call, int first, int second, | |||
| 170 | version = call >> 16; /* hack for backward compatibility */ | 170 | version = call >> 16; /* hack for backward compatibility */ |
| 171 | call &= 0xffff; | 171 | call &= 0xffff; |
| 172 | 172 | ||
| 173 | if (call <= SEMCTL) | 173 | if (call <= SEMTIMEDOP) |
| 174 | switch (call) { | 174 | switch (call) { |
| 175 | case SEMOP: | 175 | case SEMOP: |
| 176 | return sys_semtimedop(first, | 176 | return sys_semtimedop(first, |
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index 895bb3f335c7..64b8f7f96f9a 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
| @@ -101,7 +101,7 @@ static int __init memchunk_setup(char *str) | |||
| 101 | } | 101 | } |
| 102 | __setup("memchunk.", memchunk_setup); | 102 | __setup("memchunk.", memchunk_setup); |
| 103 | 103 | ||
| 104 | static void memchunk_cmdline_override(char *name, unsigned long *sizep) | 104 | static void __init memchunk_cmdline_override(char *name, unsigned long *sizep) |
| 105 | { | 105 | { |
| 106 | char *p = boot_command_line; | 106 | char *p = boot_command_line; |
| 107 | int k = strlen(name); | 107 | int k = strlen(name); |
| @@ -118,8 +118,8 @@ static void memchunk_cmdline_override(char *name, unsigned long *sizep) | |||
| 118 | } | 118 | } |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | int platform_resource_setup_memory(struct platform_device *pdev, | 121 | int __init platform_resource_setup_memory(struct platform_device *pdev, |
| 122 | char *name, unsigned long memsize) | 122 | char *name, unsigned long memsize) |
| 123 | { | 123 | { |
| 124 | struct resource *r; | 124 | struct resource *r; |
| 125 | dma_addr_t dma_handle; | 125 | dma_addr_t dma_handle; |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 743ccad61c60..2be166c544ca 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
| @@ -80,8 +80,6 @@ void smp_bogo(struct seq_file *m) | |||
| 80 | i, cpu_data(i).clock_tick); | 80 | i, cpu_data(i).clock_tick); |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | static __cacheline_aligned_in_smp DEFINE_SPINLOCK(call_lock); | ||
| 84 | |||
| 85 | extern void setup_sparc64_timer(void); | 83 | extern void setup_sparc64_timer(void); |
| 86 | 84 | ||
| 87 | static volatile unsigned long callin_flag = 0; | 85 | static volatile unsigned long callin_flag = 0; |
| @@ -120,9 +118,9 @@ void __cpuinit smp_callin(void) | |||
| 120 | while (!cpu_isset(cpuid, smp_commenced_mask)) | 118 | while (!cpu_isset(cpuid, smp_commenced_mask)) |
| 121 | rmb(); | 119 | rmb(); |
| 122 | 120 | ||
| 123 | spin_lock(&call_lock); | 121 | ipi_call_lock(); |
| 124 | cpu_set(cpuid, cpu_online_map); | 122 | cpu_set(cpuid, cpu_online_map); |
| 125 | spin_unlock(&call_lock); | 123 | ipi_call_unlock(); |
| 126 | 124 | ||
| 127 | /* idle thread is expected to have preempt disabled */ | 125 | /* idle thread is expected to have preempt disabled */ |
| 128 | preempt_disable(); | 126 | preempt_disable(); |
| @@ -1305,10 +1303,6 @@ int __cpu_disable(void) | |||
| 1305 | c->core_id = 0; | 1303 | c->core_id = 0; |
| 1306 | c->proc_id = -1; | 1304 | c->proc_id = -1; |
| 1307 | 1305 | ||
| 1308 | spin_lock(&call_lock); | ||
| 1309 | cpu_clear(cpu, cpu_online_map); | ||
| 1310 | spin_unlock(&call_lock); | ||
| 1311 | |||
| 1312 | smp_wmb(); | 1306 | smp_wmb(); |
| 1313 | 1307 | ||
| 1314 | /* Make sure no interrupts point to this cpu. */ | 1308 | /* Make sure no interrupts point to this cpu. */ |
| @@ -1318,6 +1312,10 @@ int __cpu_disable(void) | |||
| 1318 | mdelay(1); | 1312 | mdelay(1); |
| 1319 | local_irq_disable(); | 1313 | local_irq_disable(); |
| 1320 | 1314 | ||
| 1315 | ipi_call_lock(); | ||
| 1316 | cpu_clear(cpu, cpu_online_map); | ||
| 1317 | ipi_call_unlock(); | ||
| 1318 | |||
| 1321 | return 0; | 1319 | return 0; |
| 1322 | } | 1320 | } |
| 1323 | 1321 | ||
diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c index 4b9ae7c56748..4d3ff037201f 100644 --- a/arch/x86/boot/cpucheck.c +++ b/arch/x86/boot/cpucheck.c | |||
| @@ -38,12 +38,12 @@ static const u32 req_flags[NCAPINTS] = | |||
| 38 | { | 38 | { |
| 39 | REQUIRED_MASK0, | 39 | REQUIRED_MASK0, |
| 40 | REQUIRED_MASK1, | 40 | REQUIRED_MASK1, |
| 41 | REQUIRED_MASK2, | 41 | 0, /* REQUIRED_MASK2 not implemented in this file */ |
| 42 | REQUIRED_MASK3, | 42 | 0, /* REQUIRED_MASK3 not implemented in this file */ |
| 43 | REQUIRED_MASK4, | 43 | REQUIRED_MASK4, |
| 44 | REQUIRED_MASK5, | 44 | 0, /* REQUIRED_MASK5 not implemented in this file */ |
| 45 | REQUIRED_MASK6, | 45 | REQUIRED_MASK6, |
| 46 | REQUIRED_MASK7, | 46 | 0, /* REQUIRED_MASK7 not implemented in this file */ |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | #define A32(a, b, c, d) (((d) << 24)+((c) << 16)+((b) << 8)+(a)) | 49 | #define A32(a, b, c, d) (((d) << 24)+((c) << 16)+((b) << 8)+(a)) |
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 2763cb37b553..65a0c1b48696 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c | |||
| @@ -145,35 +145,25 @@ static const unsigned char *const p6_nops[ASM_NOP_MAX+1] = { | |||
| 145 | extern char __vsyscall_0; | 145 | extern char __vsyscall_0; |
| 146 | const unsigned char *const *find_nop_table(void) | 146 | const unsigned char *const *find_nop_table(void) |
| 147 | { | 147 | { |
| 148 | return boot_cpu_data.x86_vendor != X86_VENDOR_INTEL || | 148 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && |
| 149 | boot_cpu_data.x86 < 6 ? k8_nops : p6_nops; | 149 | boot_cpu_has(X86_FEATURE_NOPL)) |
| 150 | return p6_nops; | ||
| 151 | else | ||
| 152 | return k8_nops; | ||
| 150 | } | 153 | } |
| 151 | 154 | ||
| 152 | #else /* CONFIG_X86_64 */ | 155 | #else /* CONFIG_X86_64 */ |
| 153 | 156 | ||
| 154 | static const struct nop { | ||
| 155 | int cpuid; | ||
| 156 | const unsigned char *const *noptable; | ||
| 157 | } noptypes[] = { | ||
| 158 | { X86_FEATURE_K8, k8_nops }, | ||
| 159 | { X86_FEATURE_K7, k7_nops }, | ||
| 160 | { X86_FEATURE_P4, p6_nops }, | ||
| 161 | { X86_FEATURE_P3, p6_nops }, | ||
| 162 | { -1, NULL } | ||
| 163 | }; | ||
| 164 | |||
| 165 | const unsigned char *const *find_nop_table(void) | 157 | const unsigned char *const *find_nop_table(void) |
| 166 | { | 158 | { |
| 167 | const unsigned char *const *noptable = intel_nops; | 159 | if (boot_cpu_has(X86_FEATURE_K8)) |
| 168 | int i; | 160 | return k8_nops; |
| 169 | 161 | else if (boot_cpu_has(X86_FEATURE_K7)) | |
| 170 | for (i = 0; noptypes[i].cpuid >= 0; i++) { | 162 | return k7_nops; |
| 171 | if (boot_cpu_has(noptypes[i].cpuid)) { | 163 | else if (boot_cpu_has(X86_FEATURE_NOPL)) |
| 172 | noptable = noptypes[i].noptable; | 164 | return p6_nops; |
| 173 | break; | 165 | else |
| 174 | } | 166 | return intel_nops; |
| 175 | } | ||
| 176 | return noptable; | ||
| 177 | } | 167 | } |
| 178 | 168 | ||
| 179 | #endif /* CONFIG_X86_64 */ | 169 | #endif /* CONFIG_X86_64 */ |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index cae9cabc3031..18514ed26104 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
| @@ -31,6 +31,11 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c) | |||
| 31 | if (c->x86_power & (1<<8)) | 31 | if (c->x86_power & (1<<8)) |
| 32 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | 32 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
| 33 | } | 33 | } |
| 34 | |||
| 35 | /* Set MTRR capability flag if appropriate */ | ||
| 36 | if (c->x86_model == 13 || c->x86_model == 9 || | ||
| 37 | (c->x86_model == 8 && c->x86_mask >= 8)) | ||
| 38 | set_cpu_cap(c, X86_FEATURE_K6_MTRR); | ||
| 34 | } | 39 | } |
| 35 | 40 | ||
| 36 | static void __cpuinit init_amd(struct cpuinfo_x86 *c) | 41 | static void __cpuinit init_amd(struct cpuinfo_x86 *c) |
| @@ -166,10 +171,6 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
| 166 | mbytes); | 171 | mbytes); |
| 167 | } | 172 | } |
| 168 | 173 | ||
| 169 | /* Set MTRR capability flag if appropriate */ | ||
| 170 | if (c->x86_model == 13 || c->x86_model == 9 || | ||
| 171 | (c->x86_model == 8 && c->x86_mask >= 8)) | ||
| 172 | set_cpu_cap(c, X86_FEATURE_K6_MTRR); | ||
| 173 | break; | 174 | break; |
| 174 | } | 175 | } |
| 175 | 176 | ||
diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c index e0f45edd6a55..a0534c04d38a 100644 --- a/arch/x86/kernel/cpu/centaur.c +++ b/arch/x86/kernel/cpu/centaur.c | |||
| @@ -314,6 +314,16 @@ enum { | |||
| 314 | EAMD3D = 1<<20, | 314 | EAMD3D = 1<<20, |
| 315 | }; | 315 | }; |
| 316 | 316 | ||
| 317 | static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c) | ||
| 318 | { | ||
| 319 | switch (c->x86) { | ||
| 320 | case 5: | ||
| 321 | /* Emulate MTRRs using Centaur's MCR. */ | ||
| 322 | set_cpu_cap(c, X86_FEATURE_CENTAUR_MCR); | ||
| 323 | break; | ||
| 324 | } | ||
| 325 | } | ||
| 326 | |||
| 317 | static void __cpuinit init_centaur(struct cpuinfo_x86 *c) | 327 | static void __cpuinit init_centaur(struct cpuinfo_x86 *c) |
| 318 | { | 328 | { |
| 319 | 329 | ||
| @@ -462,6 +472,7 @@ centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size) | |||
| 462 | static struct cpu_dev centaur_cpu_dev __cpuinitdata = { | 472 | static struct cpu_dev centaur_cpu_dev __cpuinitdata = { |
| 463 | .c_vendor = "Centaur", | 473 | .c_vendor = "Centaur", |
| 464 | .c_ident = { "CentaurHauls" }, | 474 | .c_ident = { "CentaurHauls" }, |
| 475 | .c_early_init = early_init_centaur, | ||
| 465 | .c_init = init_centaur, | 476 | .c_init = init_centaur, |
| 466 | .c_size_cache = centaur_size_cache, | 477 | .c_size_cache = centaur_size_cache, |
| 467 | }; | 478 | }; |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 80ab20d4fa39..8aab8517642e 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <asm/mtrr.h> | 13 | #include <asm/mtrr.h> |
| 14 | #include <asm/mce.h> | 14 | #include <asm/mce.h> |
| 15 | #include <asm/pat.h> | 15 | #include <asm/pat.h> |
| 16 | #include <asm/asm.h> | ||
| 16 | #ifdef CONFIG_X86_LOCAL_APIC | 17 | #ifdef CONFIG_X86_LOCAL_APIC |
| 17 | #include <asm/mpspec.h> | 18 | #include <asm/mpspec.h> |
| 18 | #include <asm/apic.h> | 19 | #include <asm/apic.h> |
| @@ -334,11 +335,40 @@ static void __init early_cpu_detect(void) | |||
| 334 | 335 | ||
| 335 | get_cpu_vendor(c, 1); | 336 | get_cpu_vendor(c, 1); |
| 336 | 337 | ||
| 338 | early_get_cap(c); | ||
| 339 | |||
| 337 | if (c->x86_vendor != X86_VENDOR_UNKNOWN && | 340 | if (c->x86_vendor != X86_VENDOR_UNKNOWN && |
| 338 | cpu_devs[c->x86_vendor]->c_early_init) | 341 | cpu_devs[c->x86_vendor]->c_early_init) |
| 339 | cpu_devs[c->x86_vendor]->c_early_init(c); | 342 | cpu_devs[c->x86_vendor]->c_early_init(c); |
| 343 | } | ||
| 340 | 344 | ||
| 341 | early_get_cap(c); | 345 | /* |
| 346 | * The NOPL instruction is supposed to exist on all CPUs with | ||
| 347 | * family >= 6, unfortunately, that's not true in practice because | ||
| 348 | * of early VIA chips and (more importantly) broken virtualizers that | ||
| 349 | * are not easy to detect. Hence, probe for it based on first | ||
| 350 | * principles. | ||
| 351 | */ | ||
| 352 | static void __cpuinit detect_nopl(struct cpuinfo_x86 *c) | ||
| 353 | { | ||
| 354 | const u32 nopl_signature = 0x888c53b1; /* Random number */ | ||
| 355 | u32 has_nopl = nopl_signature; | ||
| 356 | |||
| 357 | clear_cpu_cap(c, X86_FEATURE_NOPL); | ||
| 358 | if (c->x86 >= 6) { | ||
| 359 | asm volatile("\n" | ||
| 360 | "1: .byte 0x0f,0x1f,0xc0\n" /* nopl %eax */ | ||
| 361 | "2:\n" | ||
| 362 | " .section .fixup,\"ax\"\n" | ||
| 363 | "3: xor %0,%0\n" | ||
| 364 | " jmp 2b\n" | ||
| 365 | " .previous\n" | ||
| 366 | _ASM_EXTABLE(1b,3b) | ||
| 367 | : "+a" (has_nopl)); | ||
| 368 | |||
| 369 | if (has_nopl == nopl_signature) | ||
| 370 | set_cpu_cap(c, X86_FEATURE_NOPL); | ||
| 371 | } | ||
| 342 | } | 372 | } |
| 343 | 373 | ||
| 344 | static void __cpuinit generic_identify(struct cpuinfo_x86 *c) | 374 | static void __cpuinit generic_identify(struct cpuinfo_x86 *c) |
| @@ -395,8 +425,8 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 *c) | |||
| 395 | } | 425 | } |
| 396 | 426 | ||
| 397 | init_scattered_cpuid_features(c); | 427 | init_scattered_cpuid_features(c); |
| 428 | detect_nopl(c); | ||
| 398 | } | 429 | } |
| 399 | |||
| 400 | } | 430 | } |
| 401 | 431 | ||
| 402 | static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c) | 432 | static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c) |
diff --git a/arch/x86/kernel/cpu/common_64.c b/arch/x86/kernel/cpu/common_64.c index dd6e3f15017e..a11f5d4477cd 100644 --- a/arch/x86/kernel/cpu/common_64.c +++ b/arch/x86/kernel/cpu/common_64.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <asm/mtrr.h> | 18 | #include <asm/mtrr.h> |
| 19 | #include <asm/mce.h> | 19 | #include <asm/mce.h> |
| 20 | #include <asm/pat.h> | 20 | #include <asm/pat.h> |
| 21 | #include <asm/asm.h> | ||
| 21 | #include <asm/numa.h> | 22 | #include <asm/numa.h> |
| 22 | #ifdef CONFIG_X86_LOCAL_APIC | 23 | #ifdef CONFIG_X86_LOCAL_APIC |
| 23 | #include <asm/mpspec.h> | 24 | #include <asm/mpspec.h> |
| @@ -215,6 +216,39 @@ static void __init early_cpu_support_print(void) | |||
| 215 | } | 216 | } |
| 216 | } | 217 | } |
| 217 | 218 | ||
| 219 | /* | ||
| 220 | * The NOPL instruction is supposed to exist on all CPUs with | ||
| 221 | * family >= 6, unfortunately, that's not true in practice because | ||
| 222 | * of early VIA chips and (more importantly) broken virtualizers that | ||
| 223 | * are not easy to detect. Hence, probe for it based on first | ||
| 224 | * principles. | ||
| 225 | * | ||
| 226 | * Note: no 64-bit chip is known to lack these, but put the code here | ||
| 227 | * for consistency with 32 bits, and to make it utterly trivial to | ||
| 228 | * diagnose the problem should it ever surface. | ||
| 229 | */ | ||
| 230 | static void __cpuinit detect_nopl(struct cpuinfo_x86 *c) | ||
| 231 | { | ||
| 232 | const u32 nopl_signature = 0x888c53b1; /* Random number */ | ||
| 233 | u32 has_nopl = nopl_signature; | ||
| 234 | |||
| 235 | clear_cpu_cap(c, X86_FEATURE_NOPL); | ||
| 236 | if (c->x86 >= 6) { | ||
| 237 | asm volatile("\n" | ||
| 238 | "1: .byte 0x0f,0x1f,0xc0\n" /* nopl %eax */ | ||
| 239 | "2:\n" | ||
| 240 | " .section .fixup,\"ax\"\n" | ||
| 241 | "3: xor %0,%0\n" | ||
| 242 | " jmp 2b\n" | ||
| 243 | " .previous\n" | ||
| 244 | _ASM_EXTABLE(1b,3b) | ||
| 245 | : "+a" (has_nopl)); | ||
| 246 | |||
| 247 | if (has_nopl == nopl_signature) | ||
| 248 | set_cpu_cap(c, X86_FEATURE_NOPL); | ||
| 249 | } | ||
| 250 | } | ||
| 251 | |||
| 218 | static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c); | 252 | static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c); |
| 219 | 253 | ||
| 220 | void __init early_cpu_init(void) | 254 | void __init early_cpu_init(void) |
| @@ -313,6 +347,8 @@ static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c) | |||
| 313 | c->x86_phys_bits = eax & 0xff; | 347 | c->x86_phys_bits = eax & 0xff; |
| 314 | } | 348 | } |
| 315 | 349 | ||
| 350 | detect_nopl(c); | ||
| 351 | |||
| 316 | if (c->x86_vendor != X86_VENDOR_UNKNOWN && | 352 | if (c->x86_vendor != X86_VENDOR_UNKNOWN && |
| 317 | cpu_devs[c->x86_vendor]->c_early_init) | 353 | cpu_devs[c->x86_vendor]->c_early_init) |
| 318 | cpu_devs[c->x86_vendor]->c_early_init(c); | 354 | cpu_devs[c->x86_vendor]->c_early_init(c); |
| @@ -493,17 +529,20 @@ void pda_init(int cpu) | |||
| 493 | /* others are initialized in smpboot.c */ | 529 | /* others are initialized in smpboot.c */ |
| 494 | pda->pcurrent = &init_task; | 530 | pda->pcurrent = &init_task; |
| 495 | pda->irqstackptr = boot_cpu_stack; | 531 | pda->irqstackptr = boot_cpu_stack; |
| 532 | pda->irqstackptr += IRQSTACKSIZE - 64; | ||
| 496 | } else { | 533 | } else { |
| 497 | pda->irqstackptr = (char *) | 534 | if (!pda->irqstackptr) { |
| 498 | __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER); | 535 | pda->irqstackptr = (char *) |
| 499 | if (!pda->irqstackptr) | 536 | __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER); |
| 500 | panic("cannot allocate irqstack for cpu %d", cpu); | 537 | if (!pda->irqstackptr) |
| 538 | panic("cannot allocate irqstack for cpu %d", | ||
| 539 | cpu); | ||
| 540 | pda->irqstackptr += IRQSTACKSIZE - 64; | ||
| 541 | } | ||
| 501 | 542 | ||
| 502 | if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE) | 543 | if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE) |
| 503 | pda->nodenumber = cpu_to_node(cpu); | 544 | pda->nodenumber = cpu_to_node(cpu); |
| 504 | } | 545 | } |
| 505 | |||
| 506 | pda->irqstackptr += IRQSTACKSIZE-64; | ||
| 507 | } | 546 | } |
| 508 | 547 | ||
| 509 | char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + | 548 | char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + |
| @@ -601,19 +640,22 @@ void __cpuinit cpu_init(void) | |||
| 601 | /* | 640 | /* |
| 602 | * set up and load the per-CPU TSS | 641 | * set up and load the per-CPU TSS |
| 603 | */ | 642 | */ |
| 604 | for (v = 0; v < N_EXCEPTION_STACKS; v++) { | 643 | if (!orig_ist->ist[0]) { |
| 605 | static const unsigned int order[N_EXCEPTION_STACKS] = { | 644 | static const unsigned int order[N_EXCEPTION_STACKS] = { |
| 606 | [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER, | 645 | [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER, |
| 607 | [DEBUG_STACK - 1] = DEBUG_STACK_ORDER | 646 | [DEBUG_STACK - 1] = DEBUG_STACK_ORDER |
| 608 | }; | 647 | }; |
| 609 | if (cpu) { | 648 | for (v = 0; v < N_EXCEPTION_STACKS; v++) { |
| 610 | estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]); | 649 | if (cpu) { |
| 611 | if (!estacks) | 650 | estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]); |
| 612 | panic("Cannot allocate exception stack %ld %d\n", | 651 | if (!estacks) |
| 613 | v, cpu); | 652 | panic("Cannot allocate exception " |
| 653 | "stack %ld %d\n", v, cpu); | ||
| 654 | } | ||
| 655 | estacks += PAGE_SIZE << order[v]; | ||
| 656 | orig_ist->ist[v] = t->x86_tss.ist[v] = | ||
| 657 | (unsigned long)estacks; | ||
| 614 | } | 658 | } |
| 615 | estacks += PAGE_SIZE << order[v]; | ||
| 616 | orig_ist->ist[v] = t->x86_tss.ist[v] = (unsigned long)estacks; | ||
| 617 | } | 659 | } |
| 618 | 660 | ||
| 619 | t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap); | 661 | t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap); |
diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c index e710a21bb6e8..898a5a2002ed 100644 --- a/arch/x86/kernel/cpu/cyrix.c +++ b/arch/x86/kernel/cpu/cyrix.c | |||
| @@ -15,13 +15,11 @@ | |||
| 15 | /* | 15 | /* |
| 16 | * Read NSC/Cyrix DEVID registers (DIR) to get more detailed info. about the CPU | 16 | * Read NSC/Cyrix DEVID registers (DIR) to get more detailed info. about the CPU |
| 17 | */ | 17 | */ |
| 18 | static void __cpuinit do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) | 18 | static void __cpuinit __do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) |
| 19 | { | 19 | { |
| 20 | unsigned char ccr2, ccr3; | 20 | unsigned char ccr2, ccr3; |
| 21 | unsigned long flags; | ||
| 22 | 21 | ||
| 23 | /* we test for DEVID by checking whether CCR3 is writable */ | 22 | /* we test for DEVID by checking whether CCR3 is writable */ |
| 24 | local_irq_save(flags); | ||
| 25 | ccr3 = getCx86(CX86_CCR3); | 23 | ccr3 = getCx86(CX86_CCR3); |
| 26 | setCx86(CX86_CCR3, ccr3 ^ 0x80); | 24 | setCx86(CX86_CCR3, ccr3 ^ 0x80); |
| 27 | getCx86(0xc0); /* dummy to change bus */ | 25 | getCx86(0xc0); /* dummy to change bus */ |
| @@ -44,9 +42,16 @@ static void __cpuinit do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) | |||
| 44 | *dir0 = getCx86(CX86_DIR0); | 42 | *dir0 = getCx86(CX86_DIR0); |
| 45 | *dir1 = getCx86(CX86_DIR1); | 43 | *dir1 = getCx86(CX86_DIR1); |
| 46 | } | 44 | } |
| 47 | local_irq_restore(flags); | ||
| 48 | } | 45 | } |
| 49 | 46 | ||
| 47 | static void __cpuinit do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) | ||
| 48 | { | ||
| 49 | unsigned long flags; | ||
| 50 | |||
| 51 | local_irq_save(flags); | ||
| 52 | __do_cyrix_devid(dir0, dir1); | ||
| 53 | local_irq_restore(flags); | ||
| 54 | } | ||
| 50 | /* | 55 | /* |
| 51 | * Cx86_dir0_msb is a HACK needed by check_cx686_cpuid/slop in bugs.h in | 56 | * Cx86_dir0_msb is a HACK needed by check_cx686_cpuid/slop in bugs.h in |
| 52 | * order to identify the Cyrix CPU model after we're out of setup.c | 57 | * order to identify the Cyrix CPU model after we're out of setup.c |
| @@ -161,6 +166,24 @@ static void __cpuinit geode_configure(void) | |||
| 161 | local_irq_restore(flags); | 166 | local_irq_restore(flags); |
| 162 | } | 167 | } |
| 163 | 168 | ||
| 169 | static void __cpuinit early_init_cyrix(struct cpuinfo_x86 *c) | ||
| 170 | { | ||
| 171 | unsigned char dir0, dir0_msn, dir1 = 0; | ||
| 172 | |||
| 173 | __do_cyrix_devid(&dir0, &dir1); | ||
| 174 | dir0_msn = dir0 >> 4; /* identifies CPU "family" */ | ||
| 175 | |||
| 176 | switch (dir0_msn) { | ||
| 177 | case 3: /* 6x86/6x86L */ | ||
| 178 | /* Emulate MTRRs using Cyrix's ARRs. */ | ||
| 179 | set_cpu_cap(c, X86_FEATURE_CYRIX_ARR); | ||
| 180 | break; | ||
| 181 | case 5: /* 6x86MX/M II */ | ||
| 182 | /* Emulate MTRRs using Cyrix's ARRs. */ | ||
| 183 | set_cpu_cap(c, X86_FEATURE_CYRIX_ARR); | ||
| 184 | break; | ||
| 185 | } | ||
| 186 | } | ||
| 164 | 187 | ||
| 165 | static void __cpuinit init_cyrix(struct cpuinfo_x86 *c) | 188 | static void __cpuinit init_cyrix(struct cpuinfo_x86 *c) |
| 166 | { | 189 | { |
| @@ -416,6 +439,7 @@ static void __cpuinit cyrix_identify(struct cpuinfo_x86 *c) | |||
| 416 | static struct cpu_dev cyrix_cpu_dev __cpuinitdata = { | 439 | static struct cpu_dev cyrix_cpu_dev __cpuinitdata = { |
| 417 | .c_vendor = "Cyrix", | 440 | .c_vendor = "Cyrix", |
| 418 | .c_ident = { "CyrixInstead" }, | 441 | .c_ident = { "CyrixInstead" }, |
| 442 | .c_early_init = early_init_cyrix, | ||
| 419 | .c_init = init_cyrix, | 443 | .c_init = init_cyrix, |
| 420 | .c_identify = cyrix_identify, | 444 | .c_identify = cyrix_identify, |
| 421 | }; | 445 | }; |
diff --git a/arch/x86/kernel/cpu/feature_names.c b/arch/x86/kernel/cpu/feature_names.c index e43ad4ad4cba..c9017799497c 100644 --- a/arch/x86/kernel/cpu/feature_names.c +++ b/arch/x86/kernel/cpu/feature_names.c | |||
| @@ -39,7 +39,8 @@ const char * const x86_cap_flags[NCAPINTS*32] = { | |||
| 39 | NULL, NULL, NULL, NULL, | 39 | NULL, NULL, NULL, NULL, |
| 40 | "constant_tsc", "up", NULL, "arch_perfmon", | 40 | "constant_tsc", "up", NULL, "arch_perfmon", |
| 41 | "pebs", "bts", NULL, NULL, | 41 | "pebs", "bts", NULL, NULL, |
| 42 | "rep_good", NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 42 | "rep_good", NULL, NULL, NULL, |
| 43 | "nopl", NULL, NULL, NULL, | ||
| 43 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 44 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| 44 | 45 | ||
| 45 | /* Intel-defined (#2) */ | 46 | /* Intel-defined (#2) */ |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index 59fd3b6b1303..73deaffadd03 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
| @@ -210,8 +210,8 @@ static void hpet_legacy_clockevent_register(void) | |||
| 210 | /* Calculate the min / max delta */ | 210 | /* Calculate the min / max delta */ |
| 211 | hpet_clockevent.max_delta_ns = clockevent_delta2ns(0x7FFFFFFF, | 211 | hpet_clockevent.max_delta_ns = clockevent_delta2ns(0x7FFFFFFF, |
| 212 | &hpet_clockevent); | 212 | &hpet_clockevent); |
| 213 | hpet_clockevent.min_delta_ns = clockevent_delta2ns(0x30, | 213 | /* 5 usec minimum reprogramming delta. */ |
| 214 | &hpet_clockevent); | 214 | hpet_clockevent.min_delta_ns = 5000; |
| 215 | 215 | ||
| 216 | /* | 216 | /* |
| 217 | * Start hpet with the boot cpu mask and make it | 217 | * Start hpet with the boot cpu mask and make it |
| @@ -270,15 +270,22 @@ static void hpet_legacy_set_mode(enum clock_event_mode mode, | |||
| 270 | } | 270 | } |
| 271 | 271 | ||
| 272 | static int hpet_legacy_next_event(unsigned long delta, | 272 | static int hpet_legacy_next_event(unsigned long delta, |
| 273 | struct clock_event_device *evt) | 273 | struct clock_event_device *evt) |
| 274 | { | 274 | { |
| 275 | unsigned long cnt; | 275 | u32 cnt; |
| 276 | 276 | ||
| 277 | cnt = hpet_readl(HPET_COUNTER); | 277 | cnt = hpet_readl(HPET_COUNTER); |
| 278 | cnt += delta; | 278 | cnt += (u32) delta; |
| 279 | hpet_writel(cnt, HPET_T0_CMP); | 279 | hpet_writel(cnt, HPET_T0_CMP); |
| 280 | 280 | ||
| 281 | return ((long)(hpet_readl(HPET_COUNTER) - cnt ) > 0) ? -ETIME : 0; | 281 | /* |
| 282 | * We need to read back the CMP register to make sure that | ||
| 283 | * what we wrote hit the chip before we compare it to the | ||
| 284 | * counter. | ||
| 285 | */ | ||
| 286 | WARN_ON((u32)hpet_readl(HPET_T0_CMP) != cnt); | ||
| 287 | |||
| 288 | return (s32)((u32)hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0; | ||
| 282 | } | 289 | } |
| 283 | 290 | ||
| 284 | /* | 291 | /* |
diff --git a/arch/x86/kernel/io_delay.c b/arch/x86/kernel/io_delay.c index 1c3a66a67f83..720d2607aacb 100644 --- a/arch/x86/kernel/io_delay.c +++ b/arch/x86/kernel/io_delay.c | |||
| @@ -92,6 +92,14 @@ static struct dmi_system_id __initdata io_delay_0xed_port_dmi_table[] = { | |||
| 92 | DMI_MATCH(DMI_BOARD_NAME, "30BF") | 92 | DMI_MATCH(DMI_BOARD_NAME, "30BF") |
| 93 | } | 93 | } |
| 94 | }, | 94 | }, |
| 95 | { | ||
| 96 | .callback = dmi_io_delay_0xed_port, | ||
| 97 | .ident = "Presario F700", | ||
| 98 | .matches = { | ||
| 99 | DMI_MATCH(DMI_BOARD_VENDOR, "Quanta"), | ||
| 100 | DMI_MATCH(DMI_BOARD_NAME, "30D3") | ||
| 101 | } | ||
| 102 | }, | ||
| 95 | { } | 103 | { } |
| 96 | }; | 104 | }; |
| 97 | 105 | ||
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index ac79bd143da8..8f98e9de1b82 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
| @@ -122,15 +122,75 @@ static u64 tsc_read_refs(u64 *pm, u64 *hpet) | |||
| 122 | return ULLONG_MAX; | 122 | return ULLONG_MAX; |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | /* | ||
| 126 | * Try to calibrate the TSC against the Programmable | ||
| 127 | * Interrupt Timer and return the frequency of the TSC | ||
| 128 | * in kHz. | ||
| 129 | * | ||
| 130 | * Return ULONG_MAX on failure to calibrate. | ||
| 131 | */ | ||
| 132 | static unsigned long pit_calibrate_tsc(void) | ||
| 133 | { | ||
| 134 | u64 tsc, t1, t2, delta; | ||
| 135 | unsigned long tscmin, tscmax; | ||
| 136 | int pitcnt; | ||
| 137 | |||
| 138 | /* Set the Gate high, disable speaker */ | ||
| 139 | outb((inb(0x61) & ~0x02) | 0x01, 0x61); | ||
| 140 | |||
| 141 | /* | ||
| 142 | * Setup CTC channel 2* for mode 0, (interrupt on terminal | ||
| 143 | * count mode), binary count. Set the latch register to 50ms | ||
| 144 | * (LSB then MSB) to begin countdown. | ||
| 145 | */ | ||
| 146 | outb(0xb0, 0x43); | ||
| 147 | outb((CLOCK_TICK_RATE / (1000 / 50)) & 0xff, 0x42); | ||
| 148 | outb((CLOCK_TICK_RATE / (1000 / 50)) >> 8, 0x42); | ||
| 149 | |||
| 150 | tsc = t1 = t2 = get_cycles(); | ||
| 151 | |||
| 152 | pitcnt = 0; | ||
| 153 | tscmax = 0; | ||
| 154 | tscmin = ULONG_MAX; | ||
| 155 | while ((inb(0x61) & 0x20) == 0) { | ||
| 156 | t2 = get_cycles(); | ||
| 157 | delta = t2 - tsc; | ||
| 158 | tsc = t2; | ||
| 159 | if ((unsigned long) delta < tscmin) | ||
| 160 | tscmin = (unsigned int) delta; | ||
| 161 | if ((unsigned long) delta > tscmax) | ||
| 162 | tscmax = (unsigned int) delta; | ||
| 163 | pitcnt++; | ||
| 164 | } | ||
| 165 | |||
| 166 | /* | ||
| 167 | * Sanity checks: | ||
| 168 | * | ||
| 169 | * If we were not able to read the PIT more than 5000 | ||
| 170 | * times, then we have been hit by a massive SMI | ||
| 171 | * | ||
| 172 | * If the maximum is 10 times larger than the minimum, | ||
| 173 | * then we got hit by an SMI as well. | ||
| 174 | */ | ||
| 175 | if (pitcnt < 5000 || tscmax > 10 * tscmin) | ||
| 176 | return ULONG_MAX; | ||
| 177 | |||
| 178 | /* Calculate the PIT value */ | ||
| 179 | delta = t2 - t1; | ||
| 180 | do_div(delta, 50); | ||
| 181 | return delta; | ||
| 182 | } | ||
| 183 | |||
| 184 | |||
| 125 | /** | 185 | /** |
| 126 | * native_calibrate_tsc - calibrate the tsc on boot | 186 | * native_calibrate_tsc - calibrate the tsc on boot |
| 127 | */ | 187 | */ |
| 128 | unsigned long native_calibrate_tsc(void) | 188 | unsigned long native_calibrate_tsc(void) |
| 129 | { | 189 | { |
| 130 | u64 tsc1, tsc2, tr1, tr2, tsc, delta, pm1, pm2, hpet1, hpet2; | 190 | u64 tsc1, tsc2, delta, pm1, pm2, hpet1, hpet2; |
| 131 | unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX; | 191 | unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX; |
| 132 | unsigned long flags, tscmin, tscmax; | 192 | unsigned long flags; |
| 133 | int hpet = is_hpet_enabled(), pitcnt, i; | 193 | int hpet = is_hpet_enabled(), i; |
| 134 | 194 | ||
| 135 | /* | 195 | /* |
| 136 | * Run 5 calibration loops to get the lowest frequency value | 196 | * Run 5 calibration loops to get the lowest frequency value |
| @@ -157,72 +217,22 @@ unsigned long native_calibrate_tsc(void) | |||
| 157 | * amount of time anyway. | 217 | * amount of time anyway. |
| 158 | */ | 218 | */ |
| 159 | for (i = 0; i < 5; i++) { | 219 | for (i = 0; i < 5; i++) { |
| 160 | 220 | unsigned long tsc_pit_khz; | |
| 161 | tscmin = ULONG_MAX; | ||
| 162 | tscmax = 0; | ||
| 163 | pitcnt = 0; | ||
| 164 | |||
| 165 | local_irq_save(flags); | ||
| 166 | 221 | ||
| 167 | /* | 222 | /* |
| 168 | * Read the start value and the reference count of | 223 | * Read the start value and the reference count of |
| 169 | * hpet/pmtimer when available: | 224 | * hpet/pmtimer when available. Then do the PIT |
| 225 | * calibration, which will take at least 50ms, and | ||
| 226 | * read the end value. | ||
| 170 | */ | 227 | */ |
| 228 | local_irq_save(flags); | ||
| 171 | tsc1 = tsc_read_refs(&pm1, hpet ? &hpet1 : NULL); | 229 | tsc1 = tsc_read_refs(&pm1, hpet ? &hpet1 : NULL); |
| 172 | 230 | tsc_pit_khz = pit_calibrate_tsc(); | |
| 173 | /* Set the Gate high, disable speaker */ | ||
| 174 | outb((inb(0x61) & ~0x02) | 0x01, 0x61); | ||
| 175 | |||
| 176 | /* | ||
| 177 | * Setup CTC channel 2* for mode 0, (interrupt on terminal | ||
| 178 | * count mode), binary count. Set the latch register to 50ms | ||
| 179 | * (LSB then MSB) to begin countdown. | ||
| 180 | * | ||
| 181 | * Some devices need a delay here. | ||
| 182 | */ | ||
| 183 | outb(0xb0, 0x43); | ||
| 184 | outb((CLOCK_TICK_RATE / (1000 / 50)) & 0xff, 0x42); | ||
| 185 | outb((CLOCK_TICK_RATE / (1000 / 50)) >> 8, 0x42); | ||
| 186 | |||
| 187 | tsc = tr1 = tr2 = get_cycles(); | ||
| 188 | |||
| 189 | while ((inb(0x61) & 0x20) == 0) { | ||
| 190 | tr2 = get_cycles(); | ||
| 191 | delta = tr2 - tsc; | ||
| 192 | tsc = tr2; | ||
| 193 | if ((unsigned int) delta < tscmin) | ||
| 194 | tscmin = (unsigned int) delta; | ||
| 195 | if ((unsigned int) delta > tscmax) | ||
| 196 | tscmax = (unsigned int) delta; | ||
| 197 | pitcnt++; | ||
| 198 | } | ||
| 199 | |||
| 200 | /* | ||
| 201 | * We waited at least 50ms above. Now read | ||
| 202 | * pmtimer/hpet reference again | ||
| 203 | */ | ||
| 204 | tsc2 = tsc_read_refs(&pm2, hpet ? &hpet2 : NULL); | 231 | tsc2 = tsc_read_refs(&pm2, hpet ? &hpet2 : NULL); |
| 205 | |||
| 206 | local_irq_restore(flags); | 232 | local_irq_restore(flags); |
| 207 | 233 | ||
| 208 | /* | 234 | /* Pick the lowest PIT TSC calibration so far */ |
| 209 | * Sanity checks: | 235 | tsc_pit_min = min(tsc_pit_min, tsc_pit_khz); |
| 210 | * | ||
| 211 | * If we were not able to read the PIT more than 5000 | ||
| 212 | * times, then we have been hit by a massive SMI | ||
| 213 | * | ||
| 214 | * If the maximum is 10 times larger than the minimum, | ||
| 215 | * then we got hit by an SMI as well. | ||
| 216 | */ | ||
| 217 | if (pitcnt > 5000 && tscmax < 10 * tscmin) { | ||
| 218 | |||
| 219 | /* Calculate the PIT value */ | ||
| 220 | delta = tr2 - tr1; | ||
| 221 | do_div(delta, 50); | ||
| 222 | |||
| 223 | /* We take the smallest value into account */ | ||
| 224 | tsc_pit_min = min(tsc_pit_min, (unsigned long) delta); | ||
| 225 | } | ||
| 226 | 236 | ||
| 227 | /* hpet or pmtimer available ? */ | 237 | /* hpet or pmtimer available ? */ |
| 228 | if (!hpet && !pm1 && !pm2) | 238 | if (!hpet && !pm1 && !pm2) |
| @@ -257,8 +267,7 @@ unsigned long native_calibrate_tsc(void) | |||
| 257 | */ | 267 | */ |
| 258 | if (tsc_pit_min == ULONG_MAX) { | 268 | if (tsc_pit_min == ULONG_MAX) { |
| 259 | /* PIT gave no useful value */ | 269 | /* PIT gave no useful value */ |
| 260 | printk(KERN_WARNING "TSC: PIT calibration failed due to " | 270 | printk(KERN_WARNING "TSC: Unable to calibrate against PIT\n"); |
| 261 | "SMI disturbance.\n"); | ||
| 262 | 271 | ||
| 263 | /* We don't have an alternative source, disable TSC */ | 272 | /* We don't have an alternative source, disable TSC */ |
| 264 | if (!hpet && !pm1 && !pm2) { | 273 | if (!hpet && !pm1 && !pm2) { |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 9ff6e3cbf08f..a4e201b47f64 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -1324,7 +1324,7 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = { | |||
| 1324 | .ptep_modify_prot_commit = __ptep_modify_prot_commit, | 1324 | .ptep_modify_prot_commit = __ptep_modify_prot_commit, |
| 1325 | 1325 | ||
| 1326 | .pte_val = xen_pte_val, | 1326 | .pte_val = xen_pte_val, |
| 1327 | .pte_flags = native_pte_val, | 1327 | .pte_flags = native_pte_flags, |
| 1328 | .pgd_val = xen_pgd_val, | 1328 | .pgd_val = xen_pgd_val, |
| 1329 | 1329 | ||
| 1330 | .make_pte = xen_make_pte, | 1330 | .make_pte = xen_make_pte, |
