kernel 如何调用uefi的runtime service

在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)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值