Программирование APIC в Windows

Тема в разделе "WASM.NT.KERNEL", создана пользователем n0name, 2 авг 2007.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    При чтении регистра, винда "зависает".
    Если для регистров не назначать дополнительный виртуальный адрес, а воспользоватся 0xfffe0000, то всё нормально.
    просмотрел в таблице страниц, аттрибуты почти одинковые - различаются только в поле Aviable for programmers used. Не думаю что это критично.

    Код (Text):
    1. ULONG GetAPICBaseAndInfo(PUCHAR *base)
    2. {
    3.     ULONG msrLow, msrHi;
    4.    
    5.     __asm mov ecx, IA32_APIC_BASE_MSR
    6.     __asm rdmsr
    7.     __asm mov msrLow, eax
    8.     __asm mov msrHi, edx
    9.     *base = (PUCHAR)(msrLow & 0xFFFFF000);
    10.     return (msrLow & 0x0800);
    11. }
    12.  
    13. ULONG APICReadReg(ULONG offset)
    14. {
    15.     return *(PULONG)(apicBase + offset);
    16. }
    17.  
    18. ULONG InitAPICModule()
    19. {
    20.     PHYSICAL_ADDRESS physBase;
    21.  
    22.     __asm int 3
    23.     if (!GetAPICBaseAndInfo(&apicBase)){
    24.         DbgPrint("[Error] InitAPICModule(): APIC global enable bit is 0.\n");
    25.         return 0;
    26.     }
    27.     DbgPrint("[Info] InitAPICModule(): Physical APIC base = %08X.\n", apicBase);
    28.     physBase.QuadPart = (ULONGLONG)apicBase;
    29.     apicBase = MmMapIoSpace(physBase, 0x1000, MmNonCached);
    30. //    apicBase = (PUCHAR)0xfffe0000;
    31.     DbgPrint("[Info] InitAPICModule(): Virtual APIC base = %08X.\n", apicBase);
    32.     if (!(APICReadReg(APIC_REG_SVR) & 0x0100)){
    33.         DbgPrint("[Error] InitAPICModule(): APIC software enable bit is 0.\n");
    34.         return 0;
    35.     }
    36.     return 1;
    37. }
     
  2. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    n0name

    Если программа зависает на инструкции __asm rdmsr, то может быть следующее поскольку это модельно-специфические регистры, то индекс IA32_APIC_BASE_MSR на разных моделях может быть разным. К примеру у меня такая же ситуация была с чтением LastBrunchFromIP на 3 пне и на 4 пне, на пне 4 код исправно работающий на 3 выдавал исключение - недопустимая комманда.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    не, зависает на APICReadReg(APIC_REG_SVR).
     
  4. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    n0name

    APIC_REG_SVR - а при его чтении не запрещаются ли прерывания вообще? И как его чтение вообще отражается на APIC.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    PROFi
    не, пишу же, что при чтении из 0xfffe0000 всё нормально.
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    n0name
    какой тип у apicBase?