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 |