Date:2011-05-02 09:43:18 (12 years 10 months ago)
Author:Werner Almesberger
Commit:0dbf29e599ae5ea3e2ad0699b2a3b1f16bc08fd1
Message:physmem.c: improved correctness and efficiency of alignment

- physmem.c (align_brk): don't waste memory if already aligned
- physmem.c (ALIGN, calloc_phys_vec): align by DMA transfer size
- physmem.c (calloc_phys_vec): make sure allocations don't straddle
page boundaries
- physmem.c (xlat_one): print "unsigned long" with %lx, not %x
Files: ubb-vga/physmem.c (3 diffs)

Change Details

ubb-vga/physmem.c
2828#define PM_SWAPPED 62
2929#define PM_PRESENT 63
3030
31#define ALIGN 32 /* DMA transfer size */
32
3133
3234static void align_brk(int alignment)
3335{
34    unsigned long addr;
36    unsigned long addr, remainder;
3537
3638    addr = (unsigned long) sbrk(0);
37    sbrk(alignment-(addr % alignment));
39    remainder = addr % alignment;
40    if (remainder)
41        sbrk(alignment-remainder);
3842}
3943
4044
4145void **calloc_phys_vec(size_t n, size_t size)
4246{
4347    void **vec;
48    unsigned long pos;
4449    int i;
4550
4651    vec = malloc(sizeof(void *)*n);
...... 
5055    }
5156
5257    for (i = 0; i != n; i++) {
53        align_brk(512); /* crude page alignment */
58        align_brk(ALIGN);
59        pos = (unsigned long) sbrk(0);
60        if ((pos & ~(PAGE_SIZE-1)) != ((pos+size) & ~(PAGE_SIZE-1)))
61            sbrk(PAGE_SIZE-(pos & (PAGE_SIZE-1)));
5462        vec[i] = sbrk(size);
5563        memset(vec[i], 0, size);
5664    }
...... 
94102        abort();
95103    }
96104    paddr = ((map & 0x7fffffffffffffULL) << pshift) | offset;
97// fprintf(stderr, "0x%x -> 0x%x\n", vaddr, paddr);
105// fprintf(stderr, "0x%lx -> 0x%lx\n", vaddr, paddr);
98106    return paddr;
99107}
100108

Archive Download the corresponding diff file

Branches:
master



interactive