Приложение QEMU UEFI последовательно возвращает неверные параметры для SetTimer - PullRequest
0 голосов
/ 22 марта 2019

Я запускаю классический пример установки таймера для приложения uefi, которое работает на qemu. Код, который я использую:

#include <efi.h>
#include <efilib.h>
#include <eficon.h>

#define second 10000000
EFI_STATUS
EFIAPI
efi_main (EFI_HANDLE img, EFI_SYSTEM_TABLE *sys) {
  EFI_EVENT timer_event;
  EFI_STATUS stat;
  InitializeLib(img, sys);
  // This succeeds, though I've tried with EVT_TIMER and EFI_EVENT_TIMER
  stat = sys->
           BootServices->CreateEvent(EVT_TIMER, TPL_APPLICATION, NULL, 
                                      NULL, &timer_event);
  // This returns 2 == invalid parameter, however I want SetTimer to 
  // return 0 == success
  stat = sys->
            BootServices->SetTimer(timer_event, TimerRelative, 10000);
  if (stat == EFI_INVALID_PARAMETER) Print(L"This always prints :(");
  while(1){}
  return EFI_SUCCESS;
}

Команда, которую я запускаю, такая:

qemu-system-x86_64 -smp 3 -rtc clock=host -nographic -enable-kvm -m 4096 -cpu host -usb -device usb-kbd -drive if=pflash,format=raw,readonly,file=/usr/share/edk2.git/ovmf-x64/OVMF-pure-efi.fd -drive file=$BASE_DIR/qos.img,index=0,format=raw

После прочтения спецификаций, ссылок на источник и пример edk2 я не уверен, что может быть причиной этой проблемы, но похоже, что я здесь поступаю правильно. Есть ли что-то странное в моей настройке? Я сократил код до самой простой вещи здесь. Может быть, есть ошибка?

1 Ответ

0 голосов
/ 23 марта 2019

NotifyTpl = TPL_APPLICATION не имеет смысла в CreateEvent(). Вам нужно использовать как минимум TPL_CALLBACK. Пожалуйста, обратитесь к "Таблице 23. Ограничения TPL" в спецификации UEFI-2.7 , которая включает "Уровни уведомления о событиях> TPL_APPLICATION".

...