Changeset 6b781c0 in mainline for kernel/arch/arm32/src/mm/page.c


Ignore:
Timestamp:
2007-06-08T15:02:49Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c03ee1c
Parents:
3ee8a075
Message:

Merge arm32 into trunk.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/arm32/src/mm/page.c

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2003-2004 Jakub Jermar
     2 * Copyright (c) 2007 Pavel Jancik, Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3131 */
    3232/** @file
     33 *  @brief Paging related functions.
    3334 */
    3435
     
    3637#include <genarch/mm/page_pt.h>
    3738#include <mm/page.h>
     39#include <align.h>
     40#include <config.h>
     41#include <arch/exception.h>
     42#include <typedefs.h>
     43#include <arch/types.h>
     44#include <interrupt.h>
     45#include <arch/mm/frame.h>
    3846
     47/** Initializes page tables.
     48 *
     49 * 1:1 virtual-physical mapping is created in kernel address space. Mapping
     50 * for table with exception vectors is also created.
     51 */
    3952void page_arch_init(void)
    4053{
     54        uintptr_t cur;
     55        int flags;
     56
    4157        page_mapping_operations = &pt_mapping_operations;
     58
     59        flags = PAGE_CACHEABLE;
     60
     61        /* PA2KA(identity) mapping for all frames until last_frame */
     62        for (cur = 0; cur < last_frame; cur += FRAME_SIZE) {
     63                page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
     64        }
     65       
     66        /* create mapping for exception table at high offset */
     67#ifdef HIGH_EXCEPTION_VECTORS
     68        void *virtaddr = frame_alloc(ONE_FRAME, FRAME_KA);
     69        page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), flags);
     70#else
     71#error "Only high exception vector supported now"
     72#endif
     73
     74        as_switch(NULL, AS_KERNEL);
     75
     76        boot_page_table_free();
    4277}
    4378
    44 /** Map device into kernel space. */
     79/** Maps device into the kernel space.
     80 *
     81 * Maps physical address of device into kernel virtual address space (so it can
     82 * be accessed only by kernel through virtual address).
     83 *
     84 * @param physaddr Physical address where device is connected.
     85 * @param size Length of area where device is present.
     86 *
     87 * @return Virtual address where device will be accessible.
     88 */
    4589uintptr_t hw_map(uintptr_t physaddr, size_t size)
    4690{
    47         /* TODO */
    48         return NULL;
     91        if (last_frame + ALIGN_UP(size, PAGE_SIZE) >
     92            KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) {
     93                panic("Unable to map physical memory %p (%d bytes)",
     94                    physaddr, size)
     95        }
     96
     97        uintptr_t virtaddr = PA2KA(last_frame);
     98        pfn_t i;
     99        for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) {
     100                page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i),
     101                    physaddr + PFN2ADDR(i),
     102                    PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL);
     103        }
     104
     105        last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
     106        return virtaddr;
    49107}
    50108
Note: See TracChangeset for help on using the changeset viewer.