LINUX.ORG.RU

xen kernel panic


0

1

Доброго времени суток. Использую gentoo x86_64, кое что из ~

Собрал гипервизор(4.1.2 из ~), ядро(2.6.38-xen) для dom0, xen-tools(с поддержкой hvm). Всё замечательно загружается и работает до тех пор пока не включил поддержку 'Virtualization technology' в биосе своего ноутбука(HP 6530b). После этого всё стало заканчиваться вот так: http://i27.fastpic.ru/big/2011/1114/99/fd0339aea058e9825a7047f6e34b7599.jpg

Процессор Intel(R) Core(TM)2 Duo CPU T9400 @ 2.53GHz виртуализацию VT-X поддерживает (vmx присутствует), на сайте интела так же написано что поддержка есть. Без включения в биосе тоже флаг присутствует, но xen запускать hvm домен не хочет. Попробовал под off-topic утилитку от M$ которая проверяет наличие нужных для VirtualPC возможностей - утилитка сказала что всё есть.

Соответственно два вопроса: 1. Как можно успеть посмотреть вывод ядра при загрузке, если он пролетает очень быстро(на видео даже посмотреть ни чего не возможно). Да, машинка - ноут, com порт использовать не удастся так как железного нет, а usb нельзя использовать для консоли(с сайта xen)

2. Куда вообще копать с такой проблемой.

P.S. Что странно при сборке гипервизора app-emulation/xen нету почти ни каких флагов...

P.P.S. биос на всякий случай обновил .

★★

Последнее исправление: The_Ketchup (всего исправлений: 1)
Ответ на: комментарий от bff7755a

Шутишь ? Какой boot.log, dmesg.log, kernel.log если бы вы посмотрели скрин то там виден kernel panic. Соответственно до монтирования FS ещё очень далеко.

The_Ketchup ★★
() автор топика
Ответ на: комментарий от bff7755a

Вообще только если какие-то особые фичи гипервизора xen для прокрутки, так как ядро уже подгружает он, но вообще, как мне кажется, я сомневаюсь что что-то можно сделать... Обычным ядром в состоянии panic можно управлять двумя кнопками: reset,power :))

The_Ketchup ★★
() автор топика
Ответ на: комментарий от The_Ketchup

Напишите версию XEN, и линк на сорцы (было бы совсем прекрасно).

bff7755a
()

Очевидно, это здесь:

static int rmrr_identity_mapping(struct domain *d,
                                 struct acpi_rmrr_unit *rmrr)
{
    u64 base, end;
    unsigned long base_pfn, end_pfn;
    struct mapped_rmrr *mrmrr;
    struct hvm_iommu *hd = domain_hvm_iommu(d);

    ASSERT(spin_is_locked(&pcidevs_lock));
    ASSERT(rmrr->base_address < rmrr->end_address);

    if ( domain_rmrr_mapped(d, rmrr) )
        return 0;

    base = rmrr->base_address & PAGE_MASK_4K;
    base_pfn = base >> PAGE_SHIFT_4K;
    end = PAGE_ALIGN_4K(rmrr->end_address);
    end_pfn = end >> PAGE_SHIFT_4K;

    while ( base_pfn < end_pfn )
    {
        if ( intel_iommu_map_page(d, base_pfn, base_pfn,
                                  IOMMUF_readable|IOMMUF_writable) )
            return -1;
        base_pfn++;
    }

    mrmrr = xmalloc(struct mapped_rmrr);
    if ( !mrmrr )SSERT(rmrr->base_address < rmrr->end_address);
        return -ENOMEM;
    mrmrr->base = rmrr->base_address;
    mrmrr->end = rmrr->end_address;
    list_add_tail(&mrmrr->list, &hd->mapped_rmrrs);

    return 0;
}

Но код, который у меня есть, немного отличается, судя по всему, от того, который выполняется у вас, т.к. stacktrace немного другой был бы. Думаю, следует отписать в багтрекер ;)

bff7755a
()
Ответ на: комментарий от bff7755a

там написано было что ошибка в iommu.c:1804 код на глаз вроде такой же, вот мой:

static int rmrr_identity_mapping(struct domain *d,
                                 struct acpi_rmrr_unit *rmrr)
{
    u64 base, end;
    unsigned long base_pfn, end_pfn;
    struct mapped_rmrr *mrmrr;
    struct hvm_iommu *hd = domain_hvm_iommu(d);

    ASSERT(spin_is_locked(&pcidevs_lock));
    ASSERT(rmrr->base_address < rmrr->end_address);

    if ( domain_rmrr_mapped(d, rmrr) )
        return 0;

    base = rmrr->base_address & PAGE_MASK_4K;
    base_pfn = base >> PAGE_SHIFT_4K;
    end = PAGE_ALIGN_4K(rmrr->end_address);
    end_pfn = end >> PAGE_SHIFT_4K;

    while ( base_pfn < end_pfn )
    {
        if ( intel_iommu_map_page(d, base_pfn, base_pfn,
                                  IOMMUF_readable|IOMMUF_writable) )
            return -1;
        base_pfn++;
    }

    mrmrr = xmalloc(struct mapped_rmrr);
    if ( !mrmrr )
        return -ENOMEM;
    mrmrr->base = rmrr->base_address;
    mrmrr->end = rmrr->end_address;
    list_add_tail(&mrmrr->list, &hd->mapped_rmrrs);

    return 0;
}

Могу выложить видео загрузки, там пролетает некие лики, но всё равно очень плохо всё видно.

У меня есть очень жирное подозрение на то что какого-то железячного функционала не хватает. Хочу попробовать какой-нибудь код прогнать который обращается к тем же функциям... Пока не знаю как это проверить(нету времени заниматься, так как знаний которые есть сейчас - слегка маловато для написания)

The_Ketchup ★★
() автор топика
Ответ на: комментарий от The_Ketchup

1804:

    ASSERT(rmrr->base_address < rmrr->end_address);

На сколько я понимаю, и обычное (не xen) ядро должно так же обнаруживать rmrr при загрузке ? Если так, то при выводе dmesg я должен увидеть некий вывод типа:

76	Boot Message Sample
77	-------------------
78	
79	Something like this gets printed indicating presence of DMAR tables
80	in ACPI.
81	
82	ACPI: DMAR (v001 A M I  OEMDMAR  0x00000001 MSFT 0x00000097) @ 0x000000007f5b5ef0
83	
84	When DMAR is being processed and initialized by ACPI, prints DMAR locations
85	and any RMRR's processed.
86	
87	ACPI DMAR:Host address width 36
88	ACPI DMAR:DRHD (flags: 0x00000000)base: 0x00000000fed90000
89	ACPI DMAR:DRHD (flags: 0x00000000)base: 0x00000000fed91000
90	ACPI DMAR:DRHD (flags: 0x00000001)base: 0x00000000fed93000
91	ACPI DMAR:RMRR base: 0x00000000000ed000 end: 0x00000000000effff
92	ACPI DMAR:RMRR base: 0x000000007f600000 end: 0x000000007fffffff
93	
94	When DMAR is enabled for use, you will notice..

http://www.mjmwired.net/kernel/Documentation/Intel-IOMMU.txt

Но этого нет, может быть дебаг какой-нибудь включить чтобы видно стало, или если не пишет значит железо не умеет ?

The_Ketchup ★★
() автор топика
Ответ на: комментарий от The_Ketchup

Проблема была в том что RMRR возвращались 3 диапазона: два нормальных, а последний start:0 end:0. Соответственно вылетало на ASSERT-е. Cделали в методе для такого случая возврат -1 и всё нормально заработало. HVM заработали.

Ноутбук HP 65530b.

The_Ketchup ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.