TEE(可信执行环境)驱动程序 API

内核提供了一个 TEE 总线基础设施,其中可信应用程序表示为一个通过通用唯一标识符 (UUID) 标识的设备,客户端驱动程序注册一个支持的设备 UUID 表。

TEE 总线基础设施注册以下 API

match()

遍历客户端驱动程序 UUID 表,以查找与设备 UUID 对应的匹配项。如果找到匹配项,则通过客户端驱动程序注册的相应探测 API 探测此特定设备。每当在 TEE 总线上注册设备或客户端驱动程序时,都会发生此过程。

uevent()

每当在 TEE 总线上注册新设备以自动加载模块化的客户端驱动程序时,都会通知用户空间 (udev)。

TEE 总线设备枚举特定于底层 TEE 实现,因此保留给 TEE 驱动程序提供相应的实现。

然后,TEE 客户端驱动程序可以使用 include/linux/tee_drv.h 中列出的 API 与匹配的可信应用程序进行通信。

TEE 客户端驱动程序示例

假设 TEE 客户端驱动程序需要与 UUID 为 ac6a4085-0e82-4c33-bf98-8eb8e118b6c2 的可信应用程序进行通信,那么驱动程序注册代码段如下所示

static const struct tee_client_device_id client_id_table[] = {
        {UUID_INIT(0xac6a4085, 0x0e82, 0x4c33,
                   0xbf, 0x98, 0x8e, 0xb8, 0xe1, 0x18, 0xb6, 0xc2)},
        {}
};

MODULE_DEVICE_TABLE(tee, client_id_table);

static struct tee_client_driver client_driver = {
        .id_table       = client_id_table,
        .driver         = {
                .name           = DRIVER_NAME,
                .bus            = &tee_bus_type,
                .probe          = client_probe,
                .remove         = client_remove,
        },
};

static int __init client_init(void)
{
        return driver_register(&client_driver.driver);
}

static void __exit client_exit(void)
{
        driver_unregister(&client_driver.driver);
}

module_init(client_init);
module_exit(client_exit);