コード例 #1
0
ファイル: ary_utils.c プロジェクト: kazu1977/prml
int *new_int_vector(int n)
{
	int *v = NULL;
	
	v = alloc_int_vector(n);
	
	return v;
}
コード例 #2
0
ファイル: ioapic.c プロジェクト: zhengruohuang/toddler
void init_ioapic()
{
    ulong ioapic_paddr = IOAPIC_DEFAULT_PADDR;
    ulong ioapic_vaddr = IOAPIC_TOP_VADDR;
    ioapic_count = 8;
    
    if (acpi_supported && madt_supported) {
        kprintf("acpi supported!\n");
        
        if (madt_ioapic_count < ioapic_count) {
            ioapic_count = madt_ioapic_count;
        }
        assert(ioapic_count > 0);
        
        struct acpi_madt_ioapic *e = NULL;
        int i = 0;
        while ((e = get_next_acpi_ioapic_entry(e, &ioapic_paddr)) != NULL) {
            assert(ioapic_paddr);
            ioapic_vaddr -= PAGE_SIZE;
            
            kernel_indirect_map_array(
                ioapic_vaddr, ioapic_paddr, PAGE_SIZE, 1, 1
            );
            
            kprintf("\tIOAPIC #%d mapped: %p -> %p\n", i, ioapic_vaddr, ioapic_paddr);
            i++;
        }
    }
    
    else if (mps_supported) {
        if (mps_ioapic_count < ioapic_count) {
            ioapic_count = mps_ioapic_count;
        }
        assert(ioapic_count > 0);
        
        struct mps_ioapic *e = NULL;
        int i = 0;
        while ((e = get_next_mps_ioapic_entry(e, &ioapic_paddr)) != NULL) {
            assert(ioapic_paddr);
            ioapic_vaddr -= PAGE_SIZE;
            
            kernel_indirect_map_array(
                ioapic_vaddr, ioapic_paddr, PAGE_SIZE, 1, 1
            );
            
            kprintf("\tIOAPIC #%d mapped: %p -> %p\n", i, ioapic_vaddr, ioapic_paddr);
            i++;
        }
    }
    
    // Update HAL virtual space boundary
    get_bootparam()->hal_vspace_end -= PAGE_SIZE * ioapic_count;
    //panic("get_bootparam()->hal_vspace_end: %p\n", get_bootparam()->hal_vspace_end);
    
    // Override IO APIC using MADT or MPS
    int i;
    
    // Set default ISA IRQ map
    for (i = 0; i < 16; i++) {
        irq_map[i].chip = 0;
        irq_map[i].pin = i;
        irq_map[i].irq = i;
        irq_map[i].vector = i;
        irq_map[i].available = 1;
        
        // Default ISA Trigger Mode: EDGE (As ACPI Specification 5.0)
        irq_map[i].trigger = APIC_TRIGMOD_EDGE;
        
        // Default ISA Polarity: Active High (I guess)
        irq_map[i].polarity = APIC_POLARITY_HIGH;
    }
    
    if (acpi_supported && madt_supported) {
        // Go through MADT Interrupt Structures
        ioapic_override_madt();
    } else if (mps_supported) {
        // Go through MP IO Interrupt Structures
        ioapic_override_mps();
    }
    
    kprintf("\tIO APIC IRQ map\n");
    
    for (i = 0; i < 16; i++) {
        if (!irq_map[i].available) {
            continue;
        }
        
        kprintf("\t\tIRQ: %d, Chip: %d, Pin: %d, Trigger: %d, Polarity: %d\n",
            irq_map[i].irq,
            irq_map[i].chip,
            irq_map[i].pin,
            irq_map[i].trigger,
            irq_map[i].polarity
        );
    }
    
    kprintf("\tIO APIC vector map\n");
    
    // Initialize Vector Map
    for (i = 0; i < 256; i++) {
        vector_map[i].available = 0;
    }
    
    // Generate Vector Map, and Program Redirection Table
    for (i = 0; i < 256; i++) {
        if (!irq_map[i].available) {
            continue;
        }
        
        int vector = alloc_int_vector(ioapic_handler);
        vector_map[vector].vector = vector;
        vector_map[vector].irq = irq_map[i].irq;
        
        vector_map[vector].chip = irq_map[i].chip;
        vector_map[vector].pin = irq_map[i].pin;
        vector_map[vector].available = irq_map[i].available;
        vector_map[vector].trigger = irq_map[i].trigger;
        vector_map[vector].polarity = irq_map[i].polarity;
        
//         if (irq_map[i].irq >= 2) {
//             continue;
//         }
        
        // Redirection Table
        ioapic_init_redirection_table(
            vector_map[vector].chip,
            vector_map[vector].pin,
            vector,
            vector_map[vector].trigger,
            vector_map[vector].polarity
        );
        
        kprintf("\t\tVector: %d, IRQ: %d, Chip: %d, Pin: %d, Trigger: %d, Polarity: %d\n",
            vector,
            vector_map[vector].irq,
            vector_map[vector].chip,
            vector_map[vector].pin,
            vector_map[vector].trigger,
            vector_map[vector].polarity
        );
    }
    
    //panic("here");
}