Chinaunix首页 | 论坛 | 博客
  • 博客访问: 661724
  • 博文数量: 156
  • 博客积分: 4833
  • 博客等级: 上校
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-21 19:36
文章分类

全部博文(156)

文章存档

2016年(2)

2013年(1)

2012年(13)

2011年(30)

2010年(46)

2009年(29)

2008年(23)

2007年(12)

分类: LINUX

2010-07-21 15:28:56

mips 4kec 中断分析
kernel:2.6.21

支持dedicated(专门中断) INT


setup_arch()->cpu_probe()->cpu_probe_mips()
->decode_configs
{
    c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER |
                 MIPS_CPU_DIVEC | MIPS_CPU_LLSC | MIPS_CPU_MCHECK;
}

所以会执行:
    

trap_init()
{
    ...
    set_handler(0x200, &except_vec4, 0x8);
  ...
  ...
   
    set_except_vector(0, handle_int);
  ...
  ...
}

except_vec4 只是占位并没有作用

在 void *set_except_vector(int n, void *addr)
{
    ...
  ...
      if (n == 0 && cpu_has_divec)
      {
        *(volatile u32 *)(ebase + 0x200) =
         0x08000000 | (0x03ffffff & (handler >> 2));//安装中断向量,相当于MIPS 汇编  j handler
         ......
    }                                     
  ...
  ...

}
 !!!替换了原来的except_vec4!!!


handle_int在汇编genex.s:   
NESTED(handle_int, PT_SIZE, sp)
...
...
j    plat_irq_dispatch//调用 plat_irq_dispatch 各CPU自己定义分发中断
END(handle_int)  


trap_init()->per_cpu_trap_init()
per_cpu_trap_init
{
     ....
    set_c0_cause(CAUSEF_IV);//打开dedicated INT
     .....
}

MIPS时钟:(新内核已采用 clock event& source 架构)
 
 time_init->plat_timer_setup      函数注册中断
 time_init->init_mips_clocksource 函数注册CLOCK


by the way:
多CPU启动, 例如cavium mips
__cpu_up启动CPU
先 fork_idle 创建新的CPU内核栈
然后 mp_ops->boot_secondary
设置启动CPU编号octeon_processor_boot

其他cpu空转 mach_cavium_octeon.h
octeon_spin_wait_boot:
    LONG_L  t1, (t0)                    # Get the core id of the next to be booted
    bne t1, v0, octeon_spin_wait_boot   # Keep looping if it isnt me        

octeon_processor_boot变量-smp_bootstrap->start_secondary->

smp_init->cpu_up->_cpu_up->__cpu_up->fork_idle


阅读(1460) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~