kernel 如何调用uefi的runtime service
来源:互联网 发布:集团管控软件 编辑:程序博客网 时间:2024/06/05 03:35
在drivers/firmware/efi/runtime-wrappers.c 中会建立kernel调用uefi的runtime service
static int __init arm64_enable_runtime_services(void)
{
/* Set up runtime services function pointers */
efi_native_runtime_setup();
set_bit(EFI_RUNTIME_SERVICES, &efi.flags);
}
early_initcall(arm64_enable_runtime_services);
可见是通过early_initcall自动调用arm64_enable_runtime_services
void efi_native_runtime_setup(void)
{
efi.get_time = virt_efi_get_time;
efi.set_time = virt_efi_set_time;
efi.get_wakeup_time = virt_efi_get_wakeup_time;
efi.set_wakeup_time = virt_efi_set_wakeup_time;
efi.get_variable = virt_efi_get_variable;
efi.get_next_variable = virt_efi_get_next_variable;
}
我们以virt_efi_get_time为例
static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
{
unsigned long flags;
efi_status_t status;
spin_lock_irqsave(&rtc_lock, flags);
spin_lock(&efi_runtime_lock);
status = efi_call_virt(get_time, tm, tc);
spin_unlock(&efi_runtime_lock);
spin_unlock_irqrestore(&rtc_lock, flags);
return status;
}
efi_call_virt 定义如下:
#define efi_call_virt(f, ...) \
({ \
efi_##f##_t *__f; \
efi_status_t __s; \
\
kernel_neon_begin(); \
efi_virtmap_load(); \
__f = efi.systab->runtime->f; \
__s = __f(__VA_ARGS__); \
efi_virtmap_unload(); \
kernel_neon_end(); \
__s; \
})
替换掉宏定义最终还是调用efi.systab->runtime->get_time(tm,tc)
static int __init arm64_enable_runtime_services(void)
{
/* Set up runtime services function pointers */
efi_native_runtime_setup();
set_bit(EFI_RUNTIME_SERVICES, &efi.flags);
}
early_initcall(arm64_enable_runtime_services);
可见是通过early_initcall自动调用arm64_enable_runtime_services
void efi_native_runtime_setup(void)
{
efi.get_time = virt_efi_get_time;
efi.set_time = virt_efi_set_time;
efi.get_wakeup_time = virt_efi_get_wakeup_time;
efi.set_wakeup_time = virt_efi_set_wakeup_time;
efi.get_variable = virt_efi_get_variable;
efi.get_next_variable = virt_efi_get_next_variable;
}
我们以virt_efi_get_time为例
static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
{
unsigned long flags;
efi_status_t status;
spin_lock_irqsave(&rtc_lock, flags);
spin_lock(&efi_runtime_lock);
status = efi_call_virt(get_time, tm, tc);
spin_unlock(&efi_runtime_lock);
spin_unlock_irqrestore(&rtc_lock, flags);
return status;
}
efi_call_virt 定义如下:
#define efi_call_virt(f, ...) \
({ \
efi_##f##_t *__f; \
efi_status_t __s; \
\
kernel_neon_begin(); \
efi_virtmap_load(); \
__f = efi.systab->runtime->f; \
__s = __f(__VA_ARGS__); \
efi_virtmap_unload(); \
kernel_neon_end(); \
__s; \
})
替换掉宏定义最终还是调用efi.systab->runtime->get_time(tm,tc)
0 0
- kernel 如何调用uefi的runtime service
- kernel 调用uefi的run time service 关机
- 自己写的tool如何调用bios runtime code
- 如何给MIPS架构的kernel添加系统调用
- Variable Service in UEFI
- uefi 是如何找到grubaa64.efi的
- 如何正确地应用Runtime类调用程序
- 如何正确地应用Runtime类调用程序
- 如何正确地应用Runtime类调用程序
- 如何正确地应用Runtime类调用程序
- 如何正确地应用Runtime类调用程序
- uefi 调用ExitBootServices
- bl31 runtime service的注册和查找
- 如何调用远程web service
- WinForm如何调用Web Service
- 如何调用远程web service
- JavaScript 如何调用 Web Service
- WinForm如何调用Web Service
- WPF制作抖动按钮
- tricks in dnn
- Spark算子选择策略
- mysql 删除
- 多线程之Master-Worker工作模式学习
- kernel 如何调用uefi的runtime service
- thinkphp 开发 App 接口的方法步骤
- java多线程的实现
- LeetCode 56. Merge Intervals
- 今天感觉萌萌哒~
- Android各种loading的效果
- C# 操纵xml
- 网络 网络层(Network)
- curl_init 模仿文件上传