diff options
| -rw-r--r-- | arch/arm/common/dmabounce.c | 18 | ||||
| -rw-r--r-- | arch/arm/common/sa1111.c | 13 | ||||
| -rw-r--r-- | arch/arm/kernel/setup.c | 25 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 29 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.h | 12 | ||||
| -rw-r--r-- | arch/arm/kernel/traps.c | 9 | ||||
| -rw-r--r-- | arch/arm/mach-clps7500/core.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-rpc/riscpc.c | 7 | ||||
| -rw-r--r-- | arch/arm/mm/init.c | 19 | ||||
| -rw-r--r-- | include/asm-arm/pgalloc.h | 24 |
10 files changed, 86 insertions, 72 deletions
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 9d63a01214eb..cbf2165476b0 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c | |||
| @@ -93,15 +93,12 @@ static void print_alloc_stats(struct dmabounce_device_info *device_info) | |||
| 93 | static inline struct dmabounce_device_info * | 93 | static inline struct dmabounce_device_info * |
| 94 | find_dmabounce_dev(struct device *dev) | 94 | find_dmabounce_dev(struct device *dev) |
| 95 | { | 95 | { |
| 96 | struct list_head *entry; | 96 | struct dmabounce_device_info *d; |
| 97 | |||
| 98 | list_for_each(entry, &dmabounce_devs) { | ||
| 99 | struct dmabounce_device_info *d = | ||
| 100 | list_entry(entry, struct dmabounce_device_info, node); | ||
| 101 | 97 | ||
| 98 | list_for_each_entry(d, &dmabounce_devs, node) | ||
| 102 | if (d->dev == dev) | 99 | if (d->dev == dev) |
| 103 | return d; | 100 | return d; |
| 104 | } | 101 | |
| 105 | return NULL; | 102 | return NULL; |
| 106 | } | 103 | } |
| 107 | 104 | ||
| @@ -172,15 +169,11 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr, | |||
| 172 | static inline struct safe_buffer * | 169 | static inline struct safe_buffer * |
| 173 | find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr) | 170 | find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr) |
| 174 | { | 171 | { |
| 175 | struct list_head *entry; | 172 | struct safe_buffer *b; |
| 176 | |||
| 177 | list_for_each(entry, &device_info->safe_buffers) { | ||
| 178 | struct safe_buffer *b = | ||
| 179 | list_entry(entry, struct safe_buffer, node); | ||
| 180 | 173 | ||
| 174 | list_for_each_entry(b, &device_info->safe_buffers, node) | ||
| 181 | if (b->safe_dma_addr == safe_dma_addr) | 175 | if (b->safe_dma_addr == safe_dma_addr) |
| 182 | return b; | 176 | return b; |
| 183 | } | ||
| 184 | 177 | ||
| 185 | return NULL; | 178 | return NULL; |
| 186 | } | 179 | } |
| @@ -301,7 +294,6 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 301 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 294 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), |
| 302 | buf->safe, (void *) buf->safe_dma_addr); | 295 | buf->safe, (void *) buf->safe_dma_addr); |
| 303 | 296 | ||
| 304 | |||
| 305 | DO_STATS ( device_info->bounce_count++ ); | 297 | DO_STATS ( device_info->bounce_count++ ); |
| 306 | 298 | ||
| 307 | if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) { | 299 | if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) { |
diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c index 21fce3414ed1..38c2eb667eb9 100644 --- a/arch/arm/common/sa1111.c +++ b/arch/arm/common/sa1111.c | |||
| @@ -721,16 +721,17 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) | |||
| 721 | return ret; | 721 | return ret; |
| 722 | } | 722 | } |
| 723 | 723 | ||
| 724 | static int sa1111_remove_one(struct device *dev, void *data) | ||
| 725 | { | ||
| 726 | device_unregister(dev); | ||
| 727 | return 0; | ||
| 728 | } | ||
| 729 | |||
| 724 | static void __sa1111_remove(struct sa1111 *sachip) | 730 | static void __sa1111_remove(struct sa1111 *sachip) |
| 725 | { | 731 | { |
| 726 | struct list_head *l, *n; | ||
| 727 | void __iomem *irqbase = sachip->base + SA1111_INTC; | 732 | void __iomem *irqbase = sachip->base + SA1111_INTC; |
| 728 | 733 | ||
| 729 | list_for_each_safe(l, n, &sachip->dev->children) { | 734 | device_for_each_child(sachip->dev, NULL, sa1111_remove_one); |
| 730 | struct device *d = list_to_dev(l); | ||
| 731 | |||
| 732 | device_unregister(d); | ||
| 733 | } | ||
| 734 | 735 | ||
| 735 | /* disable all IRQs */ | 736 | /* disable all IRQs */ |
| 736 | sa1111_writel(0, irqbase + SA1111_INTEN0); | 737 | sa1111_writel(0, irqbase + SA1111_INTEN0); |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 9fed5fa194d9..8cf733daa800 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
| @@ -395,6 +395,20 @@ static void __init early_initrd(char **p) | |||
| 395 | } | 395 | } |
| 396 | __early_param("initrd=", early_initrd); | 396 | __early_param("initrd=", early_initrd); |
| 397 | 397 | ||
| 398 | static void __init add_memory(unsigned long start, unsigned long size) | ||
| 399 | { | ||
| 400 | /* | ||
| 401 | * Ensure that start/size are aligned to a page boundary. | ||
| 402 | * Size is appropriately rounded down, start is rounded up. | ||
| 403 | */ | ||
| 404 | size -= start & ~PAGE_MASK; | ||
| 405 | |||
| 406 | meminfo.bank[meminfo.nr_banks].start = PAGE_ALIGN(start); | ||
| 407 | meminfo.bank[meminfo.nr_banks].size = size & PAGE_MASK; | ||
| 408 | meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(start); | ||
| 409 | meminfo.nr_banks += 1; | ||
| 410 | } | ||
| 411 | |||
| 398 | /* | 412 | /* |
| 399 | * Pick out the memory size. We look for mem=size@start, | 413 | * Pick out the memory size. We look for mem=size@start, |
| 400 | * where start and size are "size[KkMm]" | 414 | * where start and size are "size[KkMm]" |
| @@ -419,10 +433,7 @@ static void __init early_mem(char **p) | |||
| 419 | if (**p == '@') | 433 | if (**p == '@') |
| 420 | start = memparse(*p + 1, p); | 434 | start = memparse(*p + 1, p); |
| 421 | 435 | ||
| 422 | meminfo.bank[meminfo.nr_banks].start = start; | 436 | add_memory(start, size); |
| 423 | meminfo.bank[meminfo.nr_banks].size = size; | ||
| 424 | meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(start); | ||
| 425 | meminfo.nr_banks += 1; | ||
| 426 | } | 437 | } |
| 427 | __early_param("mem=", early_mem); | 438 | __early_param("mem=", early_mem); |
| 428 | 439 | ||
| @@ -564,11 +575,7 @@ static int __init parse_tag_mem32(const struct tag *tag) | |||
| 564 | tag->u.mem.start, tag->u.mem.size / 1024); | 575 | tag->u.mem.start, tag->u.mem.size / 1024); |
| 565 | return -EINVAL; | 576 | return -EINVAL; |
| 566 | } | 577 | } |
| 567 | meminfo.bank[meminfo.nr_banks].start = tag->u.mem.start; | 578 | add_memory(tag->u.mem.start, tag->u.mem.size); |
| 568 | meminfo.bank[meminfo.nr_banks].size = tag->u.mem.size; | ||
| 569 | meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(tag->u.mem.start); | ||
| 570 | meminfo.nr_banks += 1; | ||
| 571 | |||
| 572 | return 0; | 579 | return 0; |
| 573 | } | 580 | } |
| 574 | 581 | ||
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 931919fd5121..07ddeed61766 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <asm/unistd.h> | 19 | #include <asm/unistd.h> |
| 20 | 20 | ||
| 21 | #include "ptrace.h" | 21 | #include "ptrace.h" |
| 22 | #include "signal.h" | ||
| 22 | 23 | ||
| 23 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 24 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
| 24 | 25 | ||
| @@ -35,7 +36,7 @@ | |||
| 35 | #define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE)) | 36 | #define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE)) |
| 36 | #define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE)) | 37 | #define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE)) |
| 37 | 38 | ||
| 38 | static const unsigned long retcodes[4] = { | 39 | const unsigned long sigreturn_codes[4] = { |
| 39 | SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN, | 40 | SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN, |
| 40 | SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN | 41 | SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN |
| 41 | }; | 42 | }; |
| @@ -500,17 +501,25 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka, | |||
| 500 | if (ka->sa.sa_flags & SA_SIGINFO) | 501 | if (ka->sa.sa_flags & SA_SIGINFO) |
| 501 | idx += 2; | 502 | idx += 2; |
| 502 | 503 | ||
| 503 | if (__put_user(retcodes[idx], rc)) | 504 | if (__put_user(sigreturn_codes[idx], rc)) |
| 504 | return 1; | 505 | return 1; |
| 505 | 506 | ||
| 506 | /* | 507 | if (cpsr & MODE32_BIT) { |
| 507 | * Ensure that the instruction cache sees | 508 | /* |
| 508 | * the return code written onto the stack. | 509 | * 32-bit code can use the new high-page |
| 509 | */ | 510 | * signal return code support. |
| 510 | flush_icache_range((unsigned long)rc, | 511 | */ |
| 511 | (unsigned long)(rc + 1)); | 512 | retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb; |
| 512 | 513 | } else { | |
| 513 | retcode = ((unsigned long)rc) + thumb; | 514 | /* |
| 515 | * Ensure that the instruction cache sees | ||
| 516 | * the return code written onto the stack. | ||
| 517 | */ | ||
| 518 | flush_icache_range((unsigned long)rc, | ||
| 519 | (unsigned long)(rc + 1)); | ||
| 520 | |||
| 521 | retcode = ((unsigned long)rc) + thumb; | ||
| 522 | } | ||
| 514 | } | 523 | } |
| 515 | 524 | ||
| 516 | regs->ARM_r0 = usig; | 525 | regs->ARM_r0 = usig; |
diff --git a/arch/arm/kernel/signal.h b/arch/arm/kernel/signal.h new file mode 100644 index 000000000000..91d26faca62b --- /dev/null +++ b/arch/arm/kernel/signal.h | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/kernel/signal.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005 Russell King. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | #define KERN_SIGRETURN_CODE 0xffff0500 | ||
| 11 | |||
| 12 | extern const unsigned long sigreturn_codes[4]; | ||
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 45d2a032d890..2fb0a4cfb37a 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <asm/traps.h> | 30 | #include <asm/traps.h> |
| 31 | 31 | ||
| 32 | #include "ptrace.h" | 32 | #include "ptrace.h" |
| 33 | #include "signal.h" | ||
| 33 | 34 | ||
| 34 | const char *processor_modes[]= | 35 | const char *processor_modes[]= |
| 35 | { "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" , | 36 | { "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" , |
| @@ -683,6 +684,14 @@ void __init trap_init(void) | |||
| 683 | memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start); | 684 | memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start); |
| 684 | memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start); | 685 | memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start); |
| 685 | memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz); | 686 | memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz); |
| 687 | |||
| 688 | /* | ||
| 689 | * Copy signal return handlers into the vector page, and | ||
| 690 | * set sigreturn to be a pointer to these. | ||
| 691 | */ | ||
| 692 | memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes, | ||
| 693 | sizeof(sigreturn_codes)); | ||
| 694 | |||
| 686 | flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); | 695 | flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); |
| 687 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); | 696 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); |
| 688 | } | 697 | } |
diff --git a/arch/arm/mach-clps7500/core.c b/arch/arm/mach-clps7500/core.c index fdfededfd96f..0bc7da488612 100644 --- a/arch/arm/mach-clps7500/core.c +++ b/arch/arm/mach-clps7500/core.c | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | #include <asm/irq.h> | 26 | #include <asm/irq.h> |
| 27 | #include <asm/mach-types.h> | 27 | #include <asm/mach-types.h> |
| 28 | 28 | ||
| 29 | unsigned int vram_size; | ||
| 30 | |||
| 29 | static void cl7500_ack_irq_a(unsigned int irq) | 31 | static void cl7500_ack_irq_a(unsigned int irq) |
| 30 | { | 32 | { |
| 31 | unsigned int val, mask; | 33 | unsigned int val, mask; |
diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c index 815c53225cd8..437106881436 100644 --- a/arch/arm/mach-rpc/riscpc.c +++ b/arch/arm/mach-rpc/riscpc.c | |||
| @@ -32,10 +32,7 @@ | |||
| 32 | 32 | ||
| 33 | extern void rpc_init_irq(void); | 33 | extern void rpc_init_irq(void); |
| 34 | 34 | ||
| 35 | extern unsigned int vram_size; | 35 | unsigned int vram_size; |
| 36 | |||
| 37 | #if 0 | ||
| 38 | |||
| 39 | unsigned int memc_ctrl_reg; | 36 | unsigned int memc_ctrl_reg; |
| 40 | unsigned int number_mfm_drives; | 37 | unsigned int number_mfm_drives; |
| 41 | 38 | ||
| @@ -63,8 +60,6 @@ static int __init parse_tag_acorn(const struct tag *tag) | |||
| 63 | 60 | ||
| 64 | __tagtable(ATAG_ACORN, parse_tag_acorn); | 61 | __tagtable(ATAG_ACORN, parse_tag_acorn); |
| 65 | 62 | ||
| 66 | #endif | ||
| 67 | |||
| 68 | static struct map_desc rpc_io_desc[] __initdata = { | 63 | static struct map_desc rpc_io_desc[] __initdata = { |
| 69 | { SCREEN_BASE, SCREEN_START, 2*1048576, MT_DEVICE }, /* VRAM */ | 64 | { SCREEN_BASE, SCREEN_START, 2*1048576, MT_DEVICE }, /* VRAM */ |
| 70 | { (u32)IO_BASE, IO_START, IO_SIZE , MT_DEVICE }, /* IO space */ | 65 | { (u32)IO_BASE, IO_START, IO_SIZE , MT_DEVICE }, /* IO space */ |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 72a2b8cee319..c08710b1ff02 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
| @@ -93,14 +93,7 @@ struct node_info { | |||
| 93 | }; | 93 | }; |
| 94 | 94 | ||
| 95 | #define O_PFN_DOWN(x) ((x) >> PAGE_SHIFT) | 95 | #define O_PFN_DOWN(x) ((x) >> PAGE_SHIFT) |
| 96 | #define V_PFN_DOWN(x) O_PFN_DOWN(__pa(x)) | ||
| 97 | |||
| 98 | #define O_PFN_UP(x) (PAGE_ALIGN(x) >> PAGE_SHIFT) | 96 | #define O_PFN_UP(x) (PAGE_ALIGN(x) >> PAGE_SHIFT) |
| 99 | #define V_PFN_UP(x) O_PFN_UP(__pa(x)) | ||
| 100 | |||
| 101 | #define PFN_SIZE(x) ((x) >> PAGE_SHIFT) | ||
| 102 | #define PFN_RANGE(s,e) PFN_SIZE(PAGE_ALIGN((unsigned long)(e)) - \ | ||
| 103 | (((unsigned long)(s)) & PAGE_MASK)) | ||
| 104 | 97 | ||
| 105 | /* | 98 | /* |
| 106 | * FIXME: We really want to avoid allocating the bootmap bitmap | 99 | * FIXME: We really want to avoid allocating the bootmap bitmap |
| @@ -113,7 +106,7 @@ find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages) | |||
| 113 | { | 106 | { |
| 114 | unsigned int start_pfn, bank, bootmap_pfn; | 107 | unsigned int start_pfn, bank, bootmap_pfn; |
| 115 | 108 | ||
| 116 | start_pfn = V_PFN_UP(&_end); | 109 | start_pfn = O_PFN_UP(__pa(&_end)); |
| 117 | bootmap_pfn = 0; | 110 | bootmap_pfn = 0; |
| 118 | 111 | ||
| 119 | for (bank = 0; bank < mi->nr_banks; bank ++) { | 112 | for (bank = 0; bank < mi->nr_banks; bank ++) { |
| @@ -122,9 +115,9 @@ find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages) | |||
| 122 | if (mi->bank[bank].node != node) | 115 | if (mi->bank[bank].node != node) |
| 123 | continue; | 116 | continue; |
| 124 | 117 | ||
| 125 | start = O_PFN_UP(mi->bank[bank].start); | 118 | start = mi->bank[bank].start >> PAGE_SHIFT; |
| 126 | end = O_PFN_DOWN(mi->bank[bank].size + | 119 | end = (mi->bank[bank].size + |
| 127 | mi->bank[bank].start); | 120 | mi->bank[bank].start) >> PAGE_SHIFT; |
| 128 | 121 | ||
| 129 | if (end < start_pfn) | 122 | if (end < start_pfn) |
| 130 | continue; | 123 | continue; |
| @@ -191,8 +184,8 @@ find_memend_and_nodes(struct meminfo *mi, struct node_info *np) | |||
| 191 | /* | 184 | /* |
| 192 | * Get the start and end pfns for this bank | 185 | * Get the start and end pfns for this bank |
| 193 | */ | 186 | */ |
| 194 | start = O_PFN_UP(mi->bank[i].start); | 187 | start = mi->bank[i].start >> PAGE_SHIFT; |
| 195 | end = O_PFN_DOWN(mi->bank[i].start + mi->bank[i].size); | 188 | end = (mi->bank[i].start + mi->bank[i].size) >> PAGE_SHIFT; |
| 196 | 189 | ||
| 197 | if (np[node].start > start) | 190 | if (np[node].start > start) |
| 198 | np[node].start = start; | 191 | np[node].start = start; |
diff --git a/include/asm-arm/pgalloc.h b/include/asm-arm/pgalloc.h index e814f8144f8b..bc18ff405181 100644 --- a/include/asm-arm/pgalloc.h +++ b/include/asm-arm/pgalloc.h | |||
| @@ -89,6 +89,13 @@ static inline void pte_free(struct page *pte) | |||
| 89 | __free_page(pte); | 89 | __free_page(pte); |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval) | ||
| 93 | { | ||
| 94 | pmdp[0] = __pmd(pmdval); | ||
| 95 | pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); | ||
| 96 | flush_pmd_entry(pmdp); | ||
| 97 | } | ||
| 98 | |||
| 92 | /* | 99 | /* |
| 93 | * Populate the pmdp entry with a pointer to the pte. This pmd is part | 100 | * Populate the pmdp entry with a pointer to the pte. This pmd is part |
| 94 | * of the mm address space. | 101 | * of the mm address space. |
| @@ -99,32 +106,19 @@ static inline void | |||
| 99 | pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep) | 106 | pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep) |
| 100 | { | 107 | { |
| 101 | unsigned long pte_ptr = (unsigned long)ptep; | 108 | unsigned long pte_ptr = (unsigned long)ptep; |
| 102 | unsigned long pmdval; | ||
| 103 | |||
| 104 | BUG_ON(mm != &init_mm); | ||
| 105 | 109 | ||
| 106 | /* | 110 | /* |
| 107 | * The pmd must be loaded with the physical | 111 | * The pmd must be loaded with the physical |
| 108 | * address of the PTE table | 112 | * address of the PTE table |
| 109 | */ | 113 | */ |
| 110 | pte_ptr -= PTRS_PER_PTE * sizeof(void *); | 114 | pte_ptr -= PTRS_PER_PTE * sizeof(void *); |
| 111 | pmdval = __pa(pte_ptr) | _PAGE_KERNEL_TABLE; | 115 | __pmd_populate(pmdp, __pa(pte_ptr) | _PAGE_KERNEL_TABLE); |
| 112 | pmdp[0] = __pmd(pmdval); | ||
| 113 | pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); | ||
| 114 | flush_pmd_entry(pmdp); | ||
| 115 | } | 116 | } |
| 116 | 117 | ||
| 117 | static inline void | 118 | static inline void |
| 118 | pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep) | 119 | pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep) |
| 119 | { | 120 | { |
| 120 | unsigned long pmdval; | 121 | __pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE); |
| 121 | |||
| 122 | BUG_ON(mm == &init_mm); | ||
| 123 | |||
| 124 | pmdval = page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE; | ||
| 125 | pmdp[0] = __pmd(pmdval); | ||
| 126 | pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); | ||
| 127 | flush_pmd_entry(pmdp); | ||
| 128 | } | 122 | } |
| 129 | 123 | ||
| 130 | #endif | 124 | #endif |
