Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1482609
  • 博文数量: 181
  • 博客积分: 3308
  • 博客等级: 中校
  • 技术积分: 2227
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-03 12:03
个人简介

我是zoro

文章分类

全部博文(181)

文章存档

2015年(1)

2013年(35)

2012年(39)

2011年(50)

2010年(56)

分类: LINUX

2010-12-24 15:23:13

用到的常量

   S_FRAME_SIZE  72

   S_PC  60

 

保存现场

    .macro irq_save_user_regs

    sub sp, sp, #S_FRAME_SIZE

    stmia  sp, {r0 - r12}    @ Calling r0-r12

    add r8, sp, #S_PC        @ !!!! R8 NEEDS to be saved !!!! a reserved stack spot would be good.

    stmdb  r8, {sp, lr}^     @ Calling SP, LR

    str lr, [r8, #0]         @ Save calling PC

    mrs r6, spsr

    str r6, [r8, #4]         @ Save CPSR

    str r0, [r8, #8]         @ Save OLD_R0

    mov r0, sp

    .endm

 

在此之前硬件做的事情

1.  CPSR -à SPSR_irq

2.  PC   -à  LR_irq

 

保存现场在内存中的体现

 

 

ß-- SP1           

R0_irq

 

Cpsr_user

 

Lr_irq/PC_user

    ß-r8

Lr_user

 

R13_user

 

R12

 

R11

 

R10

 

R9

 

R8

 

R7

 

R6

 

R5

 

R4

 

R3

 

R2

 

R1

 

R0

 ß--SP=SP1-72    ß--r0

 

 

恢复现场 

    .macro irq_restore_user_regs

    ldmia  sp,  {r0 - lr}^

    mov  r0, r0

    ldr  lr, [sp, #S_PC]

    add  sp, sp, #S_FRAME_SIZE

    subs  ps, lr, #4

    .endm

 

阅读(1448) | 评论(0) | 转发(0) |
0

上一篇:关于volatile

下一篇:hello world模块

给主人留下些什么吧!~~