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 | ||
---|---|---|
28 | 28 | #define PM_SWAPPED 62 |
29 | 29 | #define PM_PRESENT 63 |
30 | 30 | |
31 | #define ALIGN 32 /* DMA transfer size */ | |
32 | ||
31 | 33 | |
32 | 34 | static void align_brk(int alignment) |
33 | 35 | { |
34 | unsigned long addr; | |
36 | unsigned long addr, remainder; | |
35 | 37 | |
36 | 38 | addr = (unsigned long) sbrk(0); |
37 | sbrk(alignment-(addr % alignment)); | |
39 | remainder = addr % alignment; | |
40 | if (remainder) | |
41 | sbrk(alignment-remainder); | |
38 | 42 | } |
39 | 43 | |
40 | 44 | |
41 | 45 | void **calloc_phys_vec(size_t n, size_t size) |
42 | 46 | { |
43 | 47 | void **vec; |
48 | unsigned long pos; | |
44 | 49 | int i; |
45 | 50 | |
46 | 51 | vec = malloc(sizeof(void *)*n); |
... | ... | |
50 | 55 | } |
51 | 56 | |
52 | 57 | 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))); | |
54 | 62 | vec[i] = sbrk(size); |
55 | 63 | memset(vec[i], 0, size); |
56 | 64 | } |
... | ... | |
94 | 102 | abort(); |
95 | 103 | } |
96 | 104 | 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); | |
98 | 106 | return paddr; |
99 | 107 | } |
100 | 108 |
Branches:
master