Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 279881
b: refs/heads/master
c: 0536bdf
h: refs/heads/master
i:
  279879: 5b1acae
v: v3
  • Loading branch information
Nicolas Pitre authored and Nicolas Pitre committed Nov 27, 2011
1 parent 0499e78 commit 9e38be9
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: be9b7335e70696bee731c152429b1737e42fe163
refs/heads/master: 0536bdf33faff4d940ac094c77998cfac368cfff
11 changes: 5 additions & 6 deletions trunk/Documentation/arm/memory.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,14 @@ ffc00000 ffefffff DMA memory mapping region. Memory returned
ff000000 ffbfffff Reserved for future expansion of DMA
mapping region.

VMALLOC_END feffffff Free for platform use, recommended.
VMALLOC_END must be aligned to a 2MB
boundary.

VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space.
Memory returned by vmalloc/ioremap will
be dynamically placed in this region.
VMALLOC_START may be based upon the value
of the high_memory variable.
Machine specific static mappings are also
located here through iotable_init().
VMALLOC_START is based upon the value
of the high_memory variable, and VMALLOC_END
is equal to 0xff000000.

PAGE_OFFSET high_memory-1 Kernel direct-mapped RAM region.
This maps the platforms RAM, and typically
Expand Down
8 changes: 1 addition & 7 deletions trunk/arch/arm/include/asm/pgtable.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#else

#include <asm/memory.h>
#include <mach/vmalloc.h>
#include <asm/pgtable-hwdef.h>

#include <asm/pgtable-2level.h>
Expand All @@ -33,15 +32,10 @@
* any out-of-bounds memory accesses will hopefully be caught.
* The vmalloc() routines leaves a hole of 4kB between each vmalloced
* area for the same reason. ;)
*
* Note that platforms may override VMALLOC_START, but they must provide
* VMALLOC_END. VMALLOC_END defines the (exclusive) limit of this space,
* which may not overlap IO space.
*/
#ifndef VMALLOC_START
#define VMALLOC_OFFSET (8*1024*1024)
#define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
#endif
#define VMALLOC_END 0xff000000UL

#define LIBRARY_TEXT_START 0x0c000000

Expand Down
49 changes: 35 additions & 14 deletions trunk/arch/arm/mm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <linux/nodemask.h>
#include <linux/memblock.h>
#include <linux/fs.h>
#include <linux/vmalloc.h>

#include <asm/cputype.h>
#include <asm/sections.h>
Expand Down Expand Up @@ -529,13 +530,18 @@ EXPORT_SYMBOL(phys_mem_access_prot);

#define vectors_base() (vectors_high() ? 0xffff0000 : 0)

static void __init *early_alloc(unsigned long sz)
static void __init *early_alloc_aligned(unsigned long sz, unsigned long align)
{
void *ptr = __va(memblock_alloc(sz, sz));
void *ptr = __va(memblock_alloc(sz, align));
memset(ptr, 0, sz);
return ptr;
}

static void __init *early_alloc(unsigned long sz)
{
return early_alloc_aligned(sz, sz);
}

static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot)
{
if (pmd_none(*pmd)) {
Expand Down Expand Up @@ -685,9 +691,10 @@ static void __init create_mapping(struct map_desc *md)
}

if ((md->type == MT_DEVICE || md->type == MT_ROM) &&
md->virtual >= PAGE_OFFSET && md->virtual < VMALLOC_END) {
md->virtual >= PAGE_OFFSET &&
(md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) {
printk(KERN_WARNING "BUG: mapping for 0x%08llx"
" at 0x%08lx overlaps vmalloc space\n",
" at 0x%08lx out of vmalloc space\n",
(long long)__pfn_to_phys((u64)md->pfn), md->virtual);
}

Expand Down Expand Up @@ -729,18 +736,32 @@ static void __init create_mapping(struct map_desc *md)
*/
void __init iotable_init(struct map_desc *io_desc, int nr)
{
int i;
struct map_desc *md;
struct vm_struct *vm;

if (!nr)
return;

for (i = 0; i < nr; i++)
create_mapping(io_desc + i);
vm = early_alloc_aligned(sizeof(*vm) * nr, __alignof__(*vm));

for (md = io_desc; nr; md++, nr--) {
create_mapping(md);
vm->addr = (void *)(md->virtual & PAGE_MASK);
vm->size = PAGE_ALIGN(md->length + (md->virtual & ~PAGE_MASK));
vm->phys_addr = __pfn_to_phys(md->pfn);
vm->flags = VM_IOREMAP;
vm->caller = iotable_init;
vm_area_add_early(vm++);
}
}

static void * __initdata vmalloc_min = (void *)(VMALLOC_END - SZ_128M);
static void * __initdata vmalloc_min =
(void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET);

/*
* vmalloc=size forces the vmalloc area to be exactly 'size'
* bytes. This can be used to increase (or decrease) the vmalloc
* area - the default is 128m.
* area - the default is 240m.
*/
static int __init early_vmalloc(char *arg)
{
Expand Down Expand Up @@ -891,10 +912,10 @@ static inline void prepare_page_table(void)

/*
* Clear out all the kernel space mappings, except for the first
* memory bank, up to the end of the vmalloc region.
* memory bank, up to the vmalloc region.
*/
for (addr = __phys_to_virt(end);
addr < VMALLOC_END; addr += PMD_SIZE)
addr < VMALLOC_START; addr += PMD_SIZE)
pmd_clear(pmd_off_k(addr));
}

Expand All @@ -921,8 +942,8 @@ void __init arm_mm_memblock_reserve(void)
}

/*
* Set up device the mappings. Since we clear out the page tables for all
* mappings above VMALLOC_END, we will remove any debug device mappings.
* Set up the device mappings. Since we clear out the page tables for all
* mappings above VMALLOC_START, we will remove any debug device mappings.
* This means you have to be careful how you debug this function, or any
* called function. This means you can't use any function or debugging
* method which may touch any device, otherwise the kernel _will_ crash.
Expand All @@ -937,7 +958,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
*/
vectors_page = early_alloc(PAGE_SIZE);

for (addr = VMALLOC_END; addr; addr += PMD_SIZE)
for (addr = VMALLOC_START; addr; addr += PMD_SIZE)
pmd_clear(pmd_off_k(addr));

/*
Expand Down

0 comments on commit 9e38be9

Please sign in to comment.