Subversion Repositories HelenOS

Rev

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

Rev 2294 Rev 2298
Line 150... Line 150...
150
}
150
}
151
 
151
 
152
/** Perform arm32 specific tasks needed before the new thread is scheduled. */
152
/** Perform arm32 specific tasks needed before the new thread is scheduled. */
153
void before_thread_runs_arch(void)
153
void before_thread_runs_arch(void)
154
{
154
{
155
    supervisor_sp = (uintptr_t) &THREAD->kstack/*[THREAD_STACK_SIZE-SP_DELTA]*/;
155
    supervisor_sp = (uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE-SP_DELTA];
156
}
156
}
157
 
157
 
158
void after_thread_ran_arch(void)
158
void after_thread_ran_arch(void)
159
{
159
{
160
    /* TODO */
160
    /* TODO */
Line 192... Line 192...
192
 *  kernel_uarg.uspace_entry
192
 *  kernel_uarg.uspace_entry
193
 * \param kernel_uarg information needed for correct setting of userspace
193
 * \param kernel_uarg information needed for correct setting of userspace
194
 */
194
 */
195
void userspace(uspace_arg_t *kernel_uarg)
195
void userspace(uspace_arg_t *kernel_uarg)
196
{
196
{
197
//  dprintf("userspace\n");
197
    dprintf("userspace\n");
198
// WILL be changed .. after exception return .. eret will be done
-
 
199
/*
198
 
200
        volatile ustate_t ustate;
-
 
201
    dprintf("userspce krnl_uard  .uspace_uarg(%X), .uspace_entry(%X), .uspace_stack(%X)\n",
199
    dprintf("userspce krnl_uard  .uspace_uarg(%X), .uspace_entry(%X), .uspace_stack(%X)\n",
202
      (unsigned int)(kernel_uarg->uspace_uarg),
200
      (unsigned int)(kernel_uarg->uspace_uarg),
203
      kernel_uarg->uspace_entry,
201
      kernel_uarg->uspace_entry,
204
      kernel_uarg->uspace_stack);
202
      kernel_uarg->uspace_stack);
-
 
203
 
-
 
204
        volatile ustate_t ustate;
-
 
205
 
205
    // Step 1 ... prepare user space environmen
206
    //Step 1 ... prepare user space environment
206
    // set first paramater
207
    //set first paramater
207
    ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg;
208
    ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg;
-
 
209
 
208
    // clear other registers
210
    //clear other registers
209
    ustate.r1 = ustate.r2  = ustate.r3  = ustate.r4  =
211
    ustate.r1 = ustate.r2  = ustate.r3  = ustate.r4  =
210
        ustate.r5 = ustate.r6  = ustate.r7  = ustate.r8  =
212
        ustate.r5 = ustate.r6  = ustate.r7  = ustate.r8  =
211
        ustate.r9 = ustate.r10 = ustate.r11 = ustate.r12 = 1;
213
        ustate.r9 = ustate.r10 = ustate.r11 = ustate.r12 = 1;
212
        ustate.lr = 3;
214
        ustate.lr = 3;
-
 
215
 
213
        // set user stack
216
    //set user stack
214
        ustate.sp = ((uint32_t)kernel_uarg->uspace_stack)+PAGE_SIZE;
217
        ustate.sp = ((uint32_t)kernel_uarg->uspace_stack)+PAGE_SIZE;
-
 
218
 
215
        // set where uspace executin starts
219
    //set where uspace executin starts
216
        ustate.pc = (uintptr_t) kernel_uarg->uspace_entry;
220
        ustate.pc = (uintptr_t) kernel_uarg->uspace_entry;
217
 
221
 
-
 
222
 
218
    // status register in user mode
223
    //status register in user mode
219
    ipl_t cpsr = current_status_reg_read();
224
    ipl_t cpsr = current_status_reg_read();
220
        cpsr &= ~STATUS_REG_MODE_MASK | USER_MODE;
225
        cpsr &= ~STATUS_REG_MODE_MASK | USER_MODE;
221
    //
226
   
222
    ipl_t tmpsr = (cpsr & ~STATUS_REG_MODE_MASK) | ABORT_MODE;
227
    ipl_t tmpsr = (cpsr & ~STATUS_REG_MODE_MASK) | SUPERVISOR_MODE;
223
 
228
 
224
    asm __volatile__ (
229
    asm __volatile__ (
225
        "mov r0, %0        \n" // save pointer into ustate struct
230
        // save pointer into ustate struct
-
 
231
        "mov r0, %0         \n"
-
 
232
        // save cspr
226
        "mov r1, %1        \n" // save cspr
233
        "mov r1, %1         \n"
227
        "msr cpsr_c, %2    \n" // change mode into any exception mode
234
        // change mode into any exception mode
-
 
235
        "msr cpsr_c, %2         \n"
-
 
236
        // set saved cpsr
228
        "msr spsr_c, r1    \n" // set saved cpsr ... as user mode
237
        "msr spsr_c, r1 \n"
-
 
238
 
-
 
239
        "mov sp, r0 \n"
-
 
240
        // replace almost all registers
229
        "ldmfd r0, {r0-r12, sp, lr, pc}^\n" // jump into user mode
241
        "ldmfd sp!, {r0-r12, sp, lr}^\n"
-
 
242
        //jump to the usermode
-
 
243
        "ldmfd sp!, {pc}^"
230
    : // no output
244
    : // no output
231
    : "r"(&ustate), "r"(cpsr), "r"(tmpsr) //
245
    : "r"(&ustate), "r"(cpsr), "r"(tmpsr) //
232
    : "r0","r1"
246
    : "r0","r1"
233
    );
247
    );
234
*/
248
 
235
    while(1)
249
    while(1) ;
236
        ;
-
 
237
       
-
 
238
}
250
}
239
/** @}
251
/** @}
240
 */
252
 */
241
 
253
 
242
 
254