- 论坛徽章:
- 0
|
249 /*
250 * savectx(struct user *up)
251 */
252 LEAF(savectx)
253 mfc0 v0, MIPS_COP_0_STATUS
254 REG_PROLOGUE 即.set push
255 REG_S s0, U_PCB_CONTEXT+SF_REG_S0(a0) 保存当前进程PCB,savectx(&dumppcb)
256 REG_S s1, U_PCB_CONTEXT+SF_REG_S1(a0)
257 REG_S s2, U_PCB_CONTEXT+SF_REG_S2(a0)
258 REG_S s3, U_PCB_CONTEXT+SF_REG_S3(a0)
259 REG_S s4, U_PCB_CONTEXT+SF_REG_S4(a0)
260 REG_S s5, U_PCB_CONTEXT+SF_REG_S5(a0)
261 REG_S s6, U_PCB_CONTEXT+SF_REG_S6(a0)
262 REG_S s7, U_PCB_CONTEXT+SF_REG_S7(a0)
263 REG_S sp, U_PCB_CONTEXT+SF_REG_SP(a0)
264 REG_S s8, U_PCB_CONTEXT+SF_REG_S8(a0)
265 REG_S ra, U_PCB_CONTEXT+SF_REG_RA(a0)
266 REG_S v0, U_PCB_CONTEXT+SF_REG_SR(a0)
267 REG_EPILOGUE
268 j ra
269 move v0, zero 注意在延迟槽里,切换出去
270 END(savectx)
271
272 #if defined(DDB) || defined(KGDB)
273 /*
274 * setjmp(label_t *)
275 * longjmp(label_t *)
276 */
277 LEAF(setjmp)
278 mfc0 v0, MIPS_COP_0_STATUS
279 REG_PROLOGUE
280 REG_S s0, SF_REG_S0(a0)
281 REG_S s1, SF_REG_S1(a0)
282 REG_S s2, SF_REG_S2(a0)
283 REG_S s3, SF_REG_S3(a0)
284 REG_S s4, SF_REG_S4(a0)
285 REG_S s5, SF_REG_S5(a0)
286 REG_S s6, SF_REG_S6(a0)
287 REG_S s7, SF_REG_S7(a0)
288 REG_S sp, SF_REG_SP(a0)
289 REG_S s8, SF_REG_S8(a0)
290 REG_S ra, SF_REG_RA(a0)
291 REG_S v0, SF_REG_SR(a0)
292 REG_EPILOGUE
293 j ra
294 move v0, zero
295 END(setjmp)
296
297 LEAF(longjmp)
298 REG_PROLOGUE
299 REG_L v0, SF_REG_SR(a0)
300 DYNAMIC_STATUS_MASK(v0,ra) # machine dependent masking
301 REG_L ra, SF_REG_RA(a0)
302 REG_L s0, SF_REG_S0(a0)
303 REG_L s1, SF_REG_S1(a0)
304 REG_L s2, SF_REG_S2(a0)
305 REG_L s3, SF_REG_S3(a0)
306 REG_L s4, SF_REG_S4(a0)
307 REG_L s5, SF_REG_S5(a0)
308 REG_L s6, SF_REG_S6(a0)
309 REG_L s7, SF_REG_S7(a0)
310 REG_L sp, SF_REG_SP(a0)
311 REG_L s8, SF_REG_S8(a0)
312 REG_EPILOGUE
313 mtc0 v0, MIPS_COP_0_STATUS
314 COP0_SYNC
315 j ra
316 li v0, 1
317 END(longjmp)
318 #endif
319
320
321 /*
322 * MIPS processor interrupt control MIPS处理器中断控制,是spl内核接口的构件。设备驱动并不用它,而是用rwlock(读者,写者锁),
323 *
324 * Used as building blocks for spl(9) kernel interface. mutex等,MP系统里只改变本地的IPL。spl用于保护临界区代码。
325 */
326 LEAF(_splraise) splraise和splset用来做splhigh和splx
327 XLEAF(_splraise_noprof) # does not get mcount hooks
328 mfc0 v0, MIPS_COP_0_STATUS # fetch status register 取状态寄存器
329 and a0, a0, MIPS_INT_MASK # extract INT bits 析出中断位,中断掩码MIPS_INT_MASK = 0xff00,即低8位清零
330 nor a0, zero, a0 # bitwise inverse of A0 高位不变
331 and a0, a0, v0 # disable retaining other bits v0和a0的8~31位相与,低8位为0
332 DYNAMIC_STATUS_MASK(a0,t0) # machine dependent masking升级中断掩码的附加操作,用于运行时中断掩码或处理低速清除掩码
333 mtc0 a0, MIPS_COP_0_STATUS # store back 把结果存回SR
334 COP0_SYNC
335 and v0, v0, (MIPS_INT_MASK | MIPS_SR_INT_IE) v0返回值,MIPS_SR_INT_IE全局中断使能位( 0x00000001 ),2~7位清0
336 j ra 返回
337 nop
338 END(_splraise)
339
340 LEAF(_spllower)
341 mfc0 v0, MIPS_COP_0_STATUS # fetch status register 取状态寄存器
342 li v1, ~MIPS_INT_MASK v1 = 0x000000ff
343 and v1, v0, v1 # turn off INT bit 关中断位,取v0低8位到v1
344 nor a0, zero, a0 # bitwise inverse of A0 与0异或,不变
345 and a0, a0, MIPS_INT_MASK # extract INT bits 低8位清零
346 or a0, a0, v1 # disable making other bits on低8位清0的a0与8~31位清0的v0相或,存到a0
347 DYNAMIC_STATUS_MASK(a0,t0) # machine dependent masking
348 mtc0 a0, MIPS_COP_0_STATUS # store back 把结果存到SR
349 COP0_SYNC
350 and v0, v0, (MIPS_INT_MASK | MIPS_SR_INT_IE)
351 j ra 返回
352 nop
353 END(_spllower)
354
355 LEAF(_splrestore)
356 mfc0 v0, MIPS_COP_0_STATUS # fetch status register 读取SR寄存器
357 and a0, a0, MIPS_INT_MASK 低8位清0
358 li v1, ~MIPS_INT_MASK 取反读到v1
359 and v1, v1, v0 # turn off every INT bit 取v0低8位
360 or v1, v1, a0 # set old INT bits 低8位清零的a0和v0低8位相或,存到v1
361 DYNAMIC_STATUS_MASK(v1,t0) # machine dependent masking
362 mtc0 v1, MIPS_COP_0_STATUS # store back 把存回SR
363 COP0_SYNC
364 and v0, v0, MIPS_INT_MASK
365 j ra
366 nop
367 END(_splrestore)
368
369 LEAF(_splset)
370 XLEAF(_splset_noprof) # does not get mcount hooks
371 mfc0 v0, MIPS_COP_0_STATUS # fetch status register
372 and a0, a0, (MIPS_INT_MASK | MIPS_SR_INT_IE)
373 li v1, ~(MIPS_INT_MASK | MIPS_SR_INT_IE)
374 and v1, v1, v0 # turn off every INT bit
375 or v1, v1, a0 # set old INT bits
376 DYNAMIC_STATUS_MASK(v1,t0) # machine dependent masking
377 mtc0 v1, MIPS_COP_0_STATUS # store back
378 COP0_SYNC
379 and v0, v0, (MIPS_INT_MASK | MIPS_SR_INT_IE)
380 j ra
381 nop
382 END(_splset)
383
384 LEAF(_splget)
385 mfc0 v0, MIPS_COP_0_STATUS # fetch status register
386 and v0, v0, (MIPS_INT_MASK | MIPS_SR_INT_IE) 2~7位清0
387 j ra
388 nop
389 END(_splget)
390
391 LEAF(_setsoftintr)
392 mfc0 v1, MIPS_COP_0_STATUS # save status register 保存状态寄存器
393 mtc0 zero, MIPS_COP_0_STATUS # disable interrupts (2 cycles) 关中断,2个周期
394 COP0_SYNC
395 nop
396 nop
397 mfc0 v0, MIPS_COP_0_CAUSE # fetch cause register 读原因寄存器
398 nop
399 or v0, v0, a0 # set soft intr. bits 设置软中断位后写回
400 mtc0 v0, MIPS_COP_0_CAUSE # store back
401 COP0_SYNC
402 mtc0 v1, MIPS_COP_0_STATUS # enable interrupts 允许中断
403 COP0_SYNC
404 j ra 返回
405 nop
406 END(_setsoftintr)
407
408 LEAF(_clrsoftintr)
409 mfc0 v1, MIPS_COP_0_STATUS # save status register
410 mtc0 zero, MIPS_COP_0_STATUS # disable interrupts (2 cycles)
411 COP0_SYNC
412 nop
413 nop
414 mfc0 v0, MIPS_COP_0_CAUSE # fetch cause register
415 nor a0, zero, a0 # bitwise inverse of A0
416 and v0, v0, a0 # clear soft intr. bits 清除软件中断位
417 mtc0 v0, MIPS_COP_0_CAUSE # store back
418 COP0_SYNC
419 mtc0 v1, MIPS_COP_0_STATUS # enable interrupts
420 COP0_SYNC
421 j ra
422 nop
423 END(_clrsoftintr)
424
425 LEAF(_splnone)
426 mtc0 zero, MIPS_COP_0_CAUSE # clear SOFT_INT bits 清除软件中断位(IP域)
427 COP0_SYNC
428 li v0, (MIPS_INT_MASK | MIPS_SR_INT_IE) v0 = 0xffffff01
429 DYNAMIC_STATUS_MASK(v0,t0) # machine dependent masking
430 mtc0 v0, MIPS_COP_0_STATUS # enable all sources 无异常
431 COP0_SYNC
432 nop
433 j ra
434 nop
435 END(_splnone)
436
437 /*
438 * u_int32_t mips_cp0_cause_read(void)
439 *
440 * Return the current value of the CP0 Cause register. 返回当前Case CP0寄存器的值
441 *
442 * Note: Not profiled, skews CPU-clock measurement (mips_mcclock.c)
443 * to uselessness.
444 */
445 LEAF_NOPROFILE(mips_cp0_cause_read)
446 mfc0 v0, MIPS_COP_0_CAUSE 读到v0,然后返回
447 j ra
448 nop
449 END(mips_cp0_cause_read)
450
451 /*
452 * void mips_cp0_cause_write(u_int32_t)
453 *
454 * Set the value of the CP0 Cause register. 设置Case CP0寄存器的值
455 */
456 LEAF(mips_cp0_cause_write)
457 mtc0 a0, MIPS_COP_0_CAUSE 写到Case寄存器,然后返回
458 COP0_SYNC
459 nop
460 nop
461 j ra
462 nop
463 END(mips_cp0_cause_write)
464
465
466 /*
467 * u_int32_t mips_cp0_status_read(void)
468 *
469 * Return the current value of the CP0 Status register. 返回状态寄存器的值
470 */ |
|