Ticket #4399: boot_mtrr_dump.diff

File boot_mtrr_dump.diff, 3.2 KB (added by mmlr, 12 years ago)
  • src/system/boot/platform/bios_ia32/cpu.h

     
    1313extern "C" {
    1414#endif
    1515
     16extern void mtrr_dump(void);
    1617extern void cpu_init(void);
    1718
    1819#ifdef __cplusplus
  • src/system/boot/platform/bios_ia32/console.cpp

     
    7171        return bufferSize;
    7272
    7373    for (uint32 i = 0; i < bufferSize; i++) {
    74         if (string[0] == '\n')
     74        if (string[0] == '\n') {
    7575            sScreenOffset += sScreenWidth - (sScreenOffset % sScreenWidth);
    76         else
     76            spin(1 * 1000 * 1000);
     77        } else
    7778            sScreenBase[sScreenOffset++] = sColor | string[0];
    7879
    7980        if (sScreenOffset >= sScreenWidth * sScreenHeight)
  • src/system/boot/platform/bios_ia32/cpu.cpp

     
    251251}
    252252
    253253
     254static uint64
     255read_msr(uint32 msr)
     256{
     257    uint32 low, high;
     258    asm volatile ("rdmsr" : "=a"(low), "=d"(high) : "c"(msr));
     259    return ((uint64)high << 32) | low;
     260}
     261
     262
     263static const char *
     264mtrr_type_to_string(uint8 type)
     265{
     266    switch (type) {
     267        case 0:
     268            return "uncacheable";
     269        case 1:
     270            return "write combining";
     271        case 4:
     272            return "write-through";
     273        case 5:
     274            return "write-protected";
     275        case 6:
     276            return "write-back";
     277        default:
     278            return "reserved";
     279    }
     280}
     281
     282
     283static bool
     284get_mtrr(uint32 index, uint64 *_base, uint64 *_length, uint8 *_type)
     285{
     286    uint64 mask = read_msr(0x201 + index * 2);
     287    if ((mask & (1 << 11)) == 0)
     288        return false;
     289
     290    uint64 base = read_msr(0x200 + index * 2);
     291
     292    *_base = base & ~(B_PAGE_SIZE - 1);
     293    *_length = (~mask & ((1ULL << 36) - 1)) + B_PAGE_SIZE;
     294    *_type = base & 0xff;
     295
     296    return true;
     297}
     298
     299
    254300extern "C" void
     301mtrr_dump()
     302{
     303    uint32 count = (read_msr(0xfe) & 0xff);
     304    dprintf("mtrr: %lu variable ranges\n", count);
     305
     306    uint64 defaultType = read_msr(0x2ff);
     307    dprintf("mtrr: default type: 0x%llx (%s, variable %sabled, fixed %sabled)\n",
     308        defaultType, mtrr_type_to_string(defaultType),
     309        (defaultType & (1 << 11)) != 0 ? "en" : "dis",
     310        (defaultType & (1 << 10)) != 0 ? "en" : "dis");
     311
     312    for (uint32 i = 0; i < count; i++) {
     313        uint64 base, length;
     314        uint8 type;
     315        if (get_mtrr(i, &base, &length, &type)) {
     316            dprintf("mtrr: entry %lu: base: 0x%llx; length: 0x%llx; type: %u %s\n",
     317                i, base, length, type, mtrr_type_to_string(type));
     318        } else
     319            dprintf("mtrr: entry %lu: empty\n", i);
     320    }
     321}
     322
     323
     324extern "C" void
    255325cpu_init()
    256326{
    257327    if (check_cpu_features() != B_OK)
  • src/system/boot/platform/bios_ia32/start.c

     
    138138    //if (sBootOptions & BOOT_OPTION_DEBUG_OUTPUT)
    139139        serial_enable();
    140140
     141    mtrr_dump();
    141142    apm_init();
    142143    acpi_init();
    143144    smp_init();