Changeset d3e7ff4 in mainline


Ignore:
Timestamp:
2006-03-14T14:10:25Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5581c45e
Parents:
5be1923
Message:

Add sys_mremap() syscall.

Files:
14 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/include/mm/page.h

    r5be1923 rd3e7ff4  
    8282
    8383#define PTE_VALID_ARCH(p)                       (*((__u64 *) (p)) != 0)
     84#define PTE_PRESENT_ARCH(p)                     ((p)->present != 0)
     85#define PTE_GET_FRAME_ARCH(p)                   ((((__address)(p)->addr_12_31)<<12) | ((__address)(p)->addr_32_51<<32))
    8486
    8587#ifndef __ASM__
  • arch/ia32/include/mm/page.h

    r5be1923 rd3e7ff4  
    8181
    8282#define PTE_VALID_ARCH(p)                       (*((__u32 *) (p)) != 0)
     83#define PTE_PRESENT_ARCH(p)                     ((p)->present != 0)
     84#define PTE_GET_FRAME_ARCH(p)                   ((p)->frame_address<<FRAME_WIDTH)
    8385
    8486#ifndef __ASM__
  • arch/mips32/include/mm/page.h

    r5be1923 rd3e7ff4  
    9595#define SET_FRAME_FLAGS_ARCH(ptl3, i, x)        set_pt_flags((pte_t *)(ptl3), (index_t)(i), (x))
    9696
    97 #define PTE_VALID_ARCH(p)                       (*((__u32 *) (p)) != 0)
     97#define PTE_VALID_ARCH(pte)                     (*((__u32 *) (pte)) != 0)
     98#define PTE_PRESENT_ARCH(pte)                   ((pte)->p != 0)
     99#define PTE_GET_FRAME_ARCH(pte)                 ((pte)->pfn<<FRAME_WIDTH)
    98100
    99101#ifndef __ASM__
  • arch/ppc32/include/mm/page.h

    r5be1923 rd3e7ff4  
    7878
    7979#define PTE_VALID_ARCH(p)               1
     80#define PTE_PRESENT_ARCH(p)             1
     81#define PTE_GET_FRAME_ARCH(p)           0
    8082
    8183#ifndef __ASM__
  • arch/ppc32/src/dummy.s

    r5be1923 rd3e7ff4  
    3737.global fpu_enable
    3838.global fpu_disable
     39.global tlb_invalidate_all
     40.global tlb_invalidate_asid
     41.global tlb_invalidate_pages
    3942
    4043before_thread_runs_arch:
     
    4548fpu_enable:     
    4649fpu_disable:   
     50tlb_invalidate_all:
     51tlb_invalidate_asid:
     52tlb_invalidate_pages:
     53
    4754
    4855dummy:
  • arch/sparc64/include/mm/page.h

    r5be1923 rd3e7ff4  
    3939#include <mm/page.h>
    4040#include <arch/types.h>
     41#include <genarch/mm/page_ht.h>
    4142
    4243#define KA2PA(x)        ((__address) (x))
  • arch/sparc64/include/types.h

    r5be1923 rd3e7ff4  
    4848
    4949typedef __u64 __native;
    50 typedef __s64 __native;
     50typedef __s64 __snative;
    5151
    5252typedef struct pte pte_t;
  • genarch/include/mm/page_ht.h

    r5be1923 rd3e7ff4  
    4747#define PAGE_HT_ENTRIES         (1<<PAGE_HT_ENTRIES_BITS)
    4848
     49#define PTE_VALID_ARCH(pte)             ((pte) != NULL)
     50#define PTE_PRESENT_ARCH(pte)           ((pte)->p != 0)
     51#define PTE_GET_FRAME_ARCH(pte)         ((pte)->frame)
     52
    4953struct pte {
    5054        link_t link;            /**< Page hash table link. */
  • genarch/include/mm/page_pt.h

    r5be1923 rd3e7ff4  
    9393#define SET_FRAME_FLAGS(ptl3, i, x)     SET_FRAME_FLAGS_ARCH(ptl3, i, x)
    9494
    95 /*
    96  * Determine whether the mapping is valid.
    97  */
    98 #define PTE_VALID(p)                    PTE_VALID_ARCH((p))
     95#define PTE_VALID(p)            PTE_VALID_ARCH((p))
     96#define PTE_PRESENT(p)          PTE_PRESENT_ARCH((p))
     97#define PTE_GET_FRAME(p)        PTE_GET_FRAME_ARCH((p))
    9998
    10099extern page_mapping_operations_t pt_mapping_operations;
  • generic/include/mm/as.h

    r5be1923 rd3e7ff4  
    105105extern as_t *as_create(int flags);
    106106extern as_area_t *as_area_create(as_t *as, as_area_type_t type, size_t size, __address base);
     107extern __address as_remap(as_t *as, __address address, size_t size, int flags);
    107108extern void as_set_mapping(as_t *as, __address page, __address frame);
    108109extern int as_page_fault(__address page);
  • generic/include/mm/page.h

    r5be1923 rd3e7ff4  
    6161#define PAGE_GLOBAL             (1<<PAGE_GLOBAL_SHIFT)
    6262
    63 
    6463/* TODO - check that userspace is OK, platform specific functions etc */
    6564static inline void copy_to_uspace(void *dst, void *src, count_t cnt)
  • generic/include/syscall/syscall.h

    r5be1923 rd3e7ff4  
    3333        SYS_CTL = 0,
    3434        SYS_IO,
     35        SYS_MREMAP,
    3536        SYS_IPC_CALL_SYNC,
    3637        SYS_IPC_CALL_SYNC_MEDIUM,
  • generic/src/mm/as.c

    r5be1923 rd3e7ff4  
    7070
    7171static int get_area_flags(as_area_t *a);
     72static as_area_t *find_area_and_lock(as_t *as, __address va);
    7273
    7374/** Initialize address space subsystem. */
     
    169170void as_set_mapping(as_t *as, __address page, __address frame)
    170171{
    171         as_area_t *a, *area = NULL;
    172         link_t *cur;
     172        as_area_t *area;
    173173        ipl_t ipl;
    174174       
     
    176176        spinlock_lock(&as->lock);
    177177       
    178         /*
    179          * First, try locate an area.
    180          */
    181         for (cur = as->as_area_head.next; cur != &as->as_area_head; cur = cur->next) {
    182                 a = list_get_instance(cur, as_area_t, link);
    183                 spinlock_lock(&a->lock);
    184 
    185                 if ((page >= a->base) && (page < a->base + a->size * PAGE_SIZE)) {
    186                         area = a;
    187                         break;
    188                 }
    189                
    190                 spinlock_unlock(&a->lock);
    191         }
    192        
     178        area = find_area_and_lock(as, page);
    193179        if (!area) {
    194180                panic("page not part of any as_area\n");
    195181        }
    196182
    197         /*
    198          * Note: area->lock is held.
    199          */
    200        
    201183        page_mapping_insert(as, page, frame, get_area_flags(area));
    202184       
     
    217199int as_page_fault(__address page)
    218200{
    219         link_t *cur;
    220         as_area_t *a, *area = NULL;
     201        as_area_t *area;
    221202        __address frame;
    222203       
     
    224205        spinlock_lock(&AS->lock);
    225206       
    226         /*
    227          * Search this areas of this address space for presence of 'page'.
    228          */
    229         for (cur = AS->as_area_head.next; cur != &AS->as_area_head; cur = cur->next) {
    230                 a = list_get_instance(cur, as_area_t, link);
    231                 spinlock_lock(&a->lock);
    232 
    233                 if ((page >= a->base) && (page < a->base + a->size * PAGE_SIZE)) {
    234 
    235                         /*
    236                          * We found the area containing 'page'.
    237                          * TODO: access checking
    238                          */
    239                         area = a;
    240                         break;
    241                 }
    242                
    243                 spinlock_unlock(&a->lock);
    244         }
    245        
     207        area = find_area_and_lock(AS, page);   
    246208        if (!area) {
    247209                /*
     
    253215        }
    254216
    255         /*
    256          * Note: area->lock is held.
    257          */
    258        
    259217        /*
    260218         * In general, there can be several reasons that
     
    400358        return as_operations->page_table_create(flags);
    401359}
     360
     361/** Find address space area and change it.
     362 *
     363 * @param as Address space.
     364 * @param address Virtual address belonging to the area to be changed. Must be page-aligned.
     365 * @param size New size of the virtual memory block starting at address.
     366 * @param flags Flags influencing the remap operation. Currently unused.
     367 *
     368 * @return address on success, (__address) -1 otherwise.
     369 */
     370__address as_remap(as_t *as, __address address, size_t size, int flags)
     371{
     372        as_area_t *area = NULL;
     373        ipl_t ipl;
     374        size_t pages;
     375       
     376        ipl = interrupts_disable();
     377        spinlock_lock(&as->lock);
     378       
     379        /*
     380         * Locate the area.
     381         */
     382        area = find_area_and_lock(as, address);
     383        if (!area) {
     384                spinlock_unlock(&as->lock);
     385                return (__address) -1;
     386        }
     387
     388        pages = SIZE2FRAMES((address - area->base) + size);
     389        if (pages < area->size) {
     390                int i;
     391
     392                /*
     393                 * Shrinking the area.
     394                 */
     395                for (i = pages; i < area->size; i++) {
     396                        pte_t *pte;
     397                       
     398                        /*
     399                         * Releasing physical memory.
     400                         * This depends on the fact that the memory was allocated using frame_alloc().
     401                         */
     402                        pte = page_mapping_find(as, area->base + i*PAGE_SIZE);
     403                        if (pte) {
     404                                ASSERT(PTE_PRESENT(pte));
     405                                frame_free(ADDR2PFN(PTE_GET_FRAME(pte)));
     406                        }
     407                        page_mapping_remove(as, area->base + i*PAGE_SIZE);
     408                }
     409                /*
     410                 * Invalidate TLB's.
     411                 */
     412                tlb_shootdown_start(TLB_INVL_PAGES, AS->asid, area->base + pages*PAGE_SIZE, area->size - pages);
     413                tlb_invalidate_pages(AS->asid, area->base + pages*PAGE_SIZE, area->size - pages);
     414                tlb_shootdown_finalize();
     415        } else {
     416                /*
     417                 * Growing the area.
     418                 */
     419                area->size = size;
     420        }
     421       
     422        spinlock_unlock(&area->lock);
     423        spinlock_unlock(&as->lock);
     424        interrupts_restore(ipl);
     425
     426        return address;
     427}
     428
     429/** Find address space area and lock it.
     430 *
     431 * The address space must be locked and interrupts must be disabled.
     432 *
     433 * @param as Address space.
     434 * @param va Virtual address.
     435 *
     436 * @return Locked address space area containing va on success or NULL on failure.
     437 */
     438as_area_t *find_area_and_lock(as_t *as, __address va)
     439{
     440        link_t *cur;
     441        as_area_t *a;
     442       
     443        for (cur = as->as_area_head.next; cur != &as->as_area_head; cur = cur->next) {
     444                a = list_get_instance(cur, as_area_t, link);
     445                spinlock_lock(&a->lock);
     446
     447                if ((va >= a->base) && (va < a->base + a->size * PAGE_SIZE))
     448                         return a;
     449               
     450                spinlock_unlock(&a->lock);
     451        }
     452
     453        return NULL;
     454}
  • generic/src/syscall/syscall.c

    r5be1923 rd3e7ff4  
    2929#include <syscall/syscall.h>
    3030#include <proc/thread.h>
     31#include <mm/as.h>
    3132#include <print.h>
    3233#include <putchar.h>
     
    182183}
    183184
     185static __native sys_mremap(void *address, size_t size, unsigned long flags)
     186{
     187        return as_remap(AS, (__address) address, size, 0);
     188}
    184189
    185190syshandler_t syscall_table[SYSCALL_END] = {
    186191        sys_ctl,
    187192        sys_io,
     193        sys_mremap,
    188194        sys_ipc_call_sync,
    189195        sys_ipc_call_sync_medium,
Note: See TracChangeset for help on using the changeset viewer.