Changeset 03427d0 in mainline


Ignore:
Timestamp:
2006-03-02T17:57:45Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9459255
Parents:
9ad03fe
Message:

ia64 work.
Add code needed for running multiple address spaces and location of kernel stack
after switch from userspace.

Location:
arch/ia64
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • arch/ia64/include/mm/as.h

    r9ad03fe r03427d0  
    4141#define UDATA_ADDRESS_ARCH      0x0000000001001000
    4242
    43 #define as_install_arch(as)
    44 
    4543extern void as_arch_init(void);
    4644
  • arch/ia64/src/mm/as.c

    r9ad03fe r03427d0  
    2828
    2929#include <arch/mm/as.h>
     30#include <arch/mm/asid.h>
     31#include <arch/mm/page.h>
    3032#include <genarch/mm/as_ht.h>
    3133#include <genarch/mm/asid_fifo.h>
     34#include <mm/asid.h>
     35#include <arch.h>
     36#include <arch/barrier.h>
     37#include <synch/spinlock.h>
    3238
    3339/** Architecture dependent address space init. */
     
    3743        asid_fifo_init();
    3844}
     45
     46/** Prepare registers for switching to another address space.
     47 *
     48 * @param as Address space.
     49 */
     50void as_install_arch(as_t *as)
     51{
     52        ipl_t ipl;
     53        region_register rr;
     54        int i;
     55       
     56        ipl = interrupts_disable();
     57        spinlock_lock(&as->lock);
     58       
     59        ASSERT(as->asid != ASID_INVALID);
     60       
     61        /*
     62         * Load respective ASID (7 consecutive RIDs) to
     63         * region registers.
     64         */
     65        for (i = 0; i < REGION_REGISTERS; i++) {
     66                if (i == VRN_KERNEL)
     67                        continue;
     68               
     69                rr.word = rr_read(i);
     70                rr.map.ve = false;                      /* disable VHPT walker */
     71                rr.map.rid = ASID2RID(as->asid, i);
     72                rr.map.ps = PAGE_WIDTH;
     73                rr_write(i, rr.word);
     74        }
     75        srlz_d();
     76        srlz_i();
     77       
     78        spinlock_unlock(&as->lock);
     79        interrupts_restore(ipl);
     80}
  • arch/ia64/src/proc/scheduler.c

    r9ad03fe r03427d0  
    3434#include <align.h>
    3535
    36 /** Ensure that thread's kernel stack is locked in TLB. */
     36/** Record kernel stack address in ar.k7 and make sure it is mapped in DTR. */
    3737void before_thread_runs_arch(void)
    3838{
     
    4343        if ((__address) THREAD->kstack < base || (__address) THREAD->kstack > base + (1<<KERNEL_PAGE_WIDTH)) {
    4444                /*
    45                  * Kernel stack of this thread is not locked in DTLB.
    46                  * First, make sure it is not mapped already.
    47                  * If not, fill respective tranlsation register.
     45                 * Kernel stack of this thread is not mapped by DTR[TR_KERNEL].
     46                 * Use DTR[TR_KSTACK] to map it.
    4847                 */
    4948                 dtlb_kernel_mapping_insert((__address) THREAD->kstack, KA2PA(THREAD->kstack), true, DTR_KSTACK);
    5049        }
     50       
     51        /*
     52         * Record address of kernel stack to ar.k7
     53         * where it will be found after switch
     54         * from userspace.
     55         */
     56        __asm__ volatile ("mov ar.k7 = %0\n" : : "r" (THREAD->kstack));
    5157}
    5258
Note: See TracChangeset for help on using the changeset viewer.