免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2224 | 回复: 2
打印 上一主题 下一主题

[中断] Linux在X86架构下对APIC和IOAPIC的flat模式配置问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-31 11:07 |只看该作者 |倒序浏览
大家好,
   小弟最近在阅读中断硬件初始化的时候遇到一个问题有点疑惑,想请教各位大虾。

X86下Linux对于APIC LDR的配置如下

  1. void flat_init_apic_ldr(void)
  2. {
  3.         unsigned long val;
  4.         unsigned long num, id;

  5.         num = smp_processor_id();
  6.         id = 1UL << num;
  7.         apic_write(APIC_DFR, APIC_DFR_FLAT);
  8.         val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
  9.         val |= SET_APIC_LOGICAL_ID(id);
  10.         apic_write(APIC_LDR, val);
  11. }
复制代码
其中LDR的值通过CPU ID左移产生;
而对于IOAPIC的RTE配置
  1.        
  2. if (apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus(),
  3.                                          &dest)) {
  4.                 pr_warn("Failed to obtain apicid for ioapic %d, pin %d\n",
  5.                         mpc_ioapic_id(attr->ioapic), attr->ioapic_pin);
  6.                 __clear_irq_vector(irq, cfg);

  7.                 return;
  8.         }

  9. int default_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
  10.                                    const struct cpumask *andmask,
  11.                                    unsigned int *apicid)
  12. {
  13.         unsigned int cpu;

  14.         for_each_cpu_and(cpu, cpumask, andmask) {
  15.                 if (cpumask_test_cpu(cpu, cpu_online_mask))
  16.                         break;
  17.         }

  18.         if (likely(cpu < nr_cpu_ids)) {
  19.                 *apicid = per_cpu(x86_cpu_to_apicid, cpu);
  20.                 return 0;
  21.         }

  22.         return -EINVAL;
  23. }

复制代码
上述代码中的dest即使IOAPIC RTE中的目的发送中断地址;
这里dest值即在线第一个CPU的apic id值;


小弟不明白为什么LDR采用CPU iD 而这里采用APIC id呢,如此不一致后面如何判断CPU是否该接受某中断呢?

论坛徽章:
0
2 [报告]
发表于 2012-10-31 14:10 |只看该作者
val |= SET_APIC_LOGICAL_ID(id);
        apic_write(APIC_LDR, val);

可以看看 SET_APIC_LOGICAL_ID() 里面有没有干啥其他事情。这部分俺也没研究过。

论坛徽章:
0
3 [报告]
发表于 2012-10-31 15:25 |只看该作者
#define                SET_APIC_LOGICAL_ID(x)        (((x) << 24)),这里只是为了写LDR寄存器(对应高8位而进行的偏移)
本身值并无改变
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP