Чтобы разобраться с APIC timer даже разобрался с Bochs - теперь он у меня работает с отладчиком gdb и отлаживается через eclipse
Только вот APIC как не живой. Bochs собирал с опцией --enable-apic, вот конфиг
Код:
#------------------------------------------------------------------------------
#
# Bochs configuration file
# (c) maisvendoo, 01.07.2013
#
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# BIOS
#-------------------------------------------------------------------------------
romimage: file=$BXSHARE/BIOS-bochs-latest
#-------------------------------------------------------------------------------
# CPU
#-------------------------------------------------------------------------------
cpu: model=p2_klamath,count=1,ips=50000000,reset_on_triple_fault=1,ignore_bad_msrs=1,msrs="msrs.def"
cpu: cpuid_limit_winnt=0
cpuid: level=6, mmx=1, sep=1, sse=sse4_2, apic=xapic, aes=1, movbe=1, xsave=1
#-------------------------------------------------------------------------------
# Memory
#-------------------------------------------------------------------------------
memory: guest=512, host=256
#-------------------------------------------------------------------------------
# ATA
#-------------------------------------------------------------------------------
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9
ata0-master: type=disk, mode=flat, path="/home/maisvendoo/PhantomEx/hdd/hdd.img"
#-------------------------------------------------------------------------------
# Boot
#-------------------------------------------------------------------------------
boot: disk
floppy_bootsig_check: disabled=1
#-------------------------------------------------------------------------------
# Bochs log
#-------------------------------------------------------------------------------
log: /home/maisvendoo/phantom/logs/bochsout.txt
panic: action=ask
error: action=report
info: action=report
#debug: action=1, pci=report # report BX_DEBUG from module 'pci'
megs: 128
#-------------------------------------------------------------------------------
# GDB interface
#-------------------------------------------------------------------------------
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
Да ладно борщ, та же беда с QEMU и VMware - везде память по адресу 0xFEE00000 заполняется я а счетчик apic-таймера не идет. Базу APIC определял как полагается через MSR 0x1B
Код инициализации. Под это дело отобразил в ВАП ядра страницу
Код:
/*------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------*/
void init_apic_timer(u32int quatum)
{
cpu_ver_ext_t ver_ext;
u64int msr_0x1B = 0;
u32int tmp = 0;
u32int cpu_bus_freq = 0;
get_cpu_ver_ext(&ver_ext);
if (ver_ext.apic == 0)
{
print_text("APIC is not supported by this processor...FAIL");
return;
}
/* Get APIC base address */
apic = get_apic_base() & 0xFFFFF000;
/* Set interrupt handler */
register_interrupt_handler(IRQ7, &apic_spurios_callback);
register_interrupt_handler(IRQ0, &apic_timer_callback);
/* Initialize LAPIC in known state */
apic_set_register(APIC_DFR, 0xFFFFFFFF);
tmp = apic_get_register(APIC_LDR);
tmp &= 0x00FFFFFF;
tmp |= 1;
apic_set_register(APIC_LDR, tmp);
apic_set_register(APIC_LVT_TMR, APIC_DISABLE);
apic_set_register(APIC_LVT_PERF, APIC_NMI);
apic_set_register(APIC_LVT_LINT0, APIC_DISABLE);
apic_set_register(APIC_LVT_LINT1, APIC_DISABLE);
apic_set_register(APIC_TASKPRIOR, 0);
/* Enable APIC global */
set_apic_base(get_apic_base());
apic_set_register(APIC_SPURIOS, IRQ7 | APIC_SW_ENABLE);
apic_set_register(APIC_LVT_TMR, IRQ0);
apic_set_register(APIC_TMRDIV, 0x03);
/* Initialize PIT channel 2 in one-shot mode */
u8int tmp_port = inb(0x61);
tmp_port &= 0xFD;
tmp_port |= 1;
outb(0x61, tmp_port);
outb(0x43, 0xB2);
outb(0x42, 0x9B);
inb(0x60);
outb(0x42, 0x2E);
tmp_port = inb(0x61);
tmp_port &= 0xFE;
tmp_port |= 0x03;
outb(0x61, tmp_port);
apic_set_register(APIC_TMRINITCNT, 0xFFFFFFFF);
do
{
tmp_port = 0;
tmp_port = inb(0x61);
tmp_port &= 0x20;
} while (!tmp_port);
apic_set_register(APIC_LVT_TMR, APIC_DISABLE);
tmp = apic_get_register(APIC_TMRCURRCNT);
cpu_bus_freq = (0xFFFFFFFF - tmp + 1 )*16*100;
tmp = cpu_bus_freq/quatum/16;
apic_set_register(APIC_TMRINITCNT, (tmp < 16 ? 16 : tmp));
apic_set_register(APIC_LVT_TMR, IRQ0 | TMR_PERIODIC);
apic_set_register(APIC_TMRDIV, 0x03);
}
Короче говоря мозги уже сломал...
P.S.: Поле APIC_APICVER содержит ноль, или какую-то чепуху, во всех ВМ