- 论坛徽章:
- 0
|
大家好,
小弟最近在阅读中断硬件初始化的时候遇到一个问题有点疑惑,想请教各位大虾。
X86下Linux对于APIC LDR的配置如下
- void flat_init_apic_ldr(void)
- {
- unsigned long val;
- unsigned long num, id;
- num = smp_processor_id();
- id = 1UL << num;
- apic_write(APIC_DFR, APIC_DFR_FLAT);
- val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
- val |= SET_APIC_LOGICAL_ID(id);
- apic_write(APIC_LDR, val);
- }
复制代码 其中LDR的值通过CPU ID左移产生;
而对于IOAPIC的RTE配置-
- if (apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus(),
- &dest)) {
- pr_warn("Failed to obtain apicid for ioapic %d, pin %d\n",
- mpc_ioapic_id(attr->ioapic), attr->ioapic_pin);
- __clear_irq_vector(irq, cfg);
- return;
- }
- int default_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
- const struct cpumask *andmask,
- unsigned int *apicid)
- {
- unsigned int cpu;
- for_each_cpu_and(cpu, cpumask, andmask) {
- if (cpumask_test_cpu(cpu, cpu_online_mask))
- break;
- }
- if (likely(cpu < nr_cpu_ids)) {
- *apicid = per_cpu(x86_cpu_to_apicid, cpu);
- return 0;
- }
- return -EINVAL;
- }
复制代码 上述代码中的dest即使IOAPIC RTE中的目的发送中断地址;
这里dest值即在线第一个CPU的apic id值;
小弟不明白为什么LDR采用CPU iD 而这里采用APIC id呢,如此不一致后面如何判断CPU是否该接受某中断呢? |
|