Subversion Repositories HelenOS-historic

Rev

Rev 1705 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1705 Rev 1780
Line 46... Line 46...
46
}
46
}
47
 
47
 
48
/** Ensure that thread's kernel stack is locked in TLB. */
48
/** Ensure that thread's kernel stack is locked in TLB. */
49
void before_thread_runs_arch(void)
49
void before_thread_runs_arch(void)
50
{
50
{
51
    __address base;
51
    uintptr_t base;
52
   
52
   
53
    base = ALIGN_DOWN(config.base, 1<<KERNEL_PAGE_WIDTH);
53
    base = ALIGN_DOWN(config.base, 1<<KERNEL_PAGE_WIDTH);
54
 
54
 
55
    if ((__address) THREAD->kstack < base || (__address) THREAD->kstack > base + (1<<KERNEL_PAGE_WIDTH)) {
55
    if ((uintptr_t) THREAD->kstack < base || (uintptr_t) THREAD->kstack > base + (1<<KERNEL_PAGE_WIDTH)) {
56
        /*
56
        /*
57
         * Kernel stack of this thread is not locked in DTLB.
57
         * Kernel stack of this thread is not locked in DTLB.
58
         * First, make sure it is not mapped already.
58
         * First, make sure it is not mapped already.
59
         * If not, create a locked mapping for it.
59
         * If not, create a locked mapping for it.
60
         */
60
         */
61
         dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (__address) THREAD->kstack);
61
         dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t) THREAD->kstack);
62
         dtlb_insert_mapping((__address) THREAD->kstack, KA2PA(THREAD->kstack), PAGESIZE_8K, true, true);
62
         dtlb_insert_mapping((uintptr_t) THREAD->kstack, KA2PA(THREAD->kstack), PAGESIZE_8K, true, true);
63
    }  
63
    }  
64
}
64
}
65
 
65
 
66
/** Unlock thread's stack from TLB, if necessary. */
66
/** Unlock thread's stack from TLB, if necessary. */
67
void after_thread_ran_arch(void)
67
void after_thread_ran_arch(void)
68
{
68
{
69
    __address base;
69
    uintptr_t base;
70
 
70
 
71
    base = ALIGN_DOWN(config.base, 1<<KERNEL_PAGE_WIDTH);
71
    base = ALIGN_DOWN(config.base, 1<<KERNEL_PAGE_WIDTH);
72
 
72
 
73
    if ((__address) THREAD->kstack < base || (__address) THREAD->kstack > base + (1<<KERNEL_PAGE_WIDTH)) {
73
    if ((uintptr_t) THREAD->kstack < base || (uintptr_t) THREAD->kstack > base + (1<<KERNEL_PAGE_WIDTH)) {
74
        /*
74
        /*
75
         * Kernel stack of this thread is locked in DTLB.
75
         * Kernel stack of this thread is locked in DTLB.
76
         * Destroy the mapping.
76
         * Destroy the mapping.
77
         */
77
         */
78
        dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (__address) THREAD->kstack);
78
        dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, (uintptr_t) THREAD->kstack);
79
    }
79
    }
80
}
80
}
81
 
81
 
82
 /** @}
82
 /** @}
83
 */
83
 */