Changeset 9970a5a in mainline for kernel/generic/src/mm


Ignore:
Timestamp:
2012-01-27T23:24:27Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7b3b571, fe56c08a
Parents:
d81eaf94 (diff), 221c9ec (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge from lp:~jakub/helenos/mm.

Location:
kernel/generic/src/mm
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/backend_elf.c

    rd81eaf94 r9970a5a  
    318318                        dirty = true;
    319319                } else {
    320                         frame = KA2PA(base + i * FRAME_SIZE);
     320                        pte_t *pte = page_mapping_find(AS_KERNEL,
     321                            base + i * FRAME_SIZE, true);
     322
     323                        ASSERT(pte);
     324                        ASSERT(PTE_PRESENT(pte));
     325
     326                        frame = PTE_GET_FRAME(pte);
    321327                }       
    322328        } else if (upage >= start_anon) {
  • kernel/generic/src/mm/frame.c

    rd81eaf94 r9970a5a  
    924924                                for (i = 0; i < init.cnt; i++)
    925925                                        if (overlaps(addr, PFN2ADDR(confcount),
    926                                             KA2PA(init.tasks[i].addr),
     926                                            init.tasks[i].paddr,
    927927                                            init.tasks[i].size)) {
    928928                                                overlap = true;
     
    12511251                size_t i;
    12521252                for (i = 0; i < init.cnt; i++) {
    1253                         pfn_t pfn = ADDR2PFN(KA2PA(init.tasks[i].addr));
     1253                        pfn_t pfn = ADDR2PFN(init.tasks[i].paddr);
    12541254                        frame_mark_unavailable(pfn,
    12551255                            SIZE2FRAMES(init.tasks[i].size));
  • kernel/generic/src/mm/km.c

    rd81eaf94 r9970a5a  
    4646#include <debug.h>
    4747#include <arch.h>
     48#include <align.h>
     49#include <macros.h>
     50#include <bitops.h>
    4851
    4952static ra_arena_t *km_ni_arena;
     
    120123        ra_free(km_ni_arena, page, size);
    121124}
     125
     126uintptr_t km_map(uintptr_t paddr, size_t size, unsigned int flags)
     127{
     128        uintptr_t vaddr;
     129        size_t asize;
     130        size_t align;
     131        uintptr_t offs;
     132
     133        asize = ALIGN_UP(size, PAGE_SIZE);
     134        align = ispwr2(size) ? size : (1U << (fnzb(size) + 1));
     135        vaddr = km_page_alloc(asize, max(PAGE_SIZE, align));
     136
     137        page_table_lock(AS_KERNEL, true);
     138        for (offs = 0; offs < asize; offs += PAGE_SIZE) {
     139                page_mapping_insert(AS_KERNEL, vaddr + offs, paddr + offs,
     140                    flags);
     141        }
     142        page_table_unlock(AS_KERNEL, true);
     143       
     144        return vaddr;
     145}
     146
    122147
    123148/** Unmap kernen non-identity page.
     
    165190            FRAME_HIGHMEM | FRAME_ATOMIC | flags);
    166191        if (frame) {
    167                 page = km_page_alloc(PAGE_SIZE, PAGE_SIZE);
     192                page = km_map(frame, PAGE_SIZE,
     193                    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
    168194                ASSERT(page);   // FIXME
    169                 page_table_lock(AS_KERNEL, true);
    170                 page_mapping_insert(AS_KERNEL, page, frame,
    171                     PAGE_CACHEABLE | PAGE_READ | PAGE_WRITE);
    172                 page_table_unlock(AS_KERNEL, true);
    173195        } else {
    174196                frame = (uintptr_t) frame_alloc_noreserve(ONE_FRAME,
  • kernel/generic/src/mm/page.c

    rd81eaf94 r9970a5a  
    6565#include <arch/mm/asid.h>
    6666#include <mm/as.h>
    67 #include <mm/km.h>
    6867#include <mm/frame.h>
    6968#include <arch/barrier.h>
     
    7675#include <errno.h>
    7776#include <align.h>
    78 #include <macros.h>
    79 #include <bitops.h>
    8077
    8178/** Virtual operations for page subsystem. */
     
    193190}
    194191
    195 uintptr_t hw_map(uintptr_t physaddr, size_t size)
    196 {
    197         uintptr_t virtaddr;
    198         size_t asize;
    199         size_t align;
    200         pfn_t i;
    201 
    202         asize = ALIGN_UP(size, PAGE_SIZE);
    203         align = ispwr2(size) ? size : (1U << (fnzb(size) + 1));
    204         virtaddr = km_page_alloc(asize, max(PAGE_SIZE, align));
    205 
    206         page_table_lock(AS_KERNEL, true);
    207         for (i = 0; i < ADDR2PFN(asize); i++) {
    208                 uintptr_t addr = PFN2ADDR(i);
    209                 page_mapping_insert(AS_KERNEL, virtaddr + addr, physaddr + addr,
    210                     PAGE_NOT_CACHEABLE | PAGE_WRITE);
    211         }
    212         page_table_unlock(AS_KERNEL, true);
    213        
    214         return virtaddr;
    215 }
    216 
    217192int page_find_mapping(uintptr_t virt, void **phys)
    218193{
Note: See TracChangeset for help on using the changeset viewer.