/*设置TPM命令格式*/

ssize_t tpm_getcap(struct device *dev, __be32 subcap_id, cap_t *cap,

const char *desc)

{

struct tpm_cmd_t tpm_cmd;

int rc;

struct tpm_chip *chip = dev_get_drvdata(dev);

tpm_cmd.header.in = tpm_getcap_header;

if (subcap_id == CAP_VERSION_1_1 || subcap_id == CAP_VERSION_1_2) {

tpm_cmd.params.getcap_in.cap = subcap_id;

/*subcap field not necessary */

tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(0);

tpm_cmd.header.in.length -= cpu_to_be32(sizeof(__be32));

} else {

if (subcap_id == TPM_CAP_FLAG_PERM ||

subcap_id == TPM_CAP_FLAG_VOL)

tpm_cmd.params.getcap_in.cap = TPM_CAP_FLAG;

else

tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;

tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);

tpm_cmd.params.getcap_in.subcap = subcap_id;

}

rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, desc);

if (!rc)

*cap = tpm_cmd.params.getcap_out.cap;

return rc;

}

/*TPM设备自检,成功返回0*/

static int tpm_continue_selftest(struct tpm_chip *chip)

{

int rc;

struct tpm_cmd_t cmd;

cmd.header.in = continue_selftest_header;

rc = transmit_cmd(chip, &cmd, CONTINUE_SELFTEST_RESULT_SIZE,

"continue selftest");

return rc;

}

/*返回tpm设备的序号,对应/dev/tpm#中#的值*/

static struct tpm_chip *tpm_chip_find_get(int chip_num)

{

struct tpm_chip *pos, *chip = NULL;

rcu_read_lock();

list_for_each_entry_rcu(pos, &tpm_chip_list, list) {

if (chip_num != TPM_ANY_NUM && chip_num != pos->dev_num)

continue;

if (try_module_get(pos->dev->driver->owner)) {

chip = pos;

break;

}

}

rcu_read_unlock();

return chip;

}

/*读取TPM设备中平台配置寄存器中的数据*/

static int __tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf)

{

int rc;

struct tpm_cmd_t cmd;

cmd.header.in = pcrread_header;

cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx);

rc = transmit_cmd(chip, &cmd, READ_PCR_RESULT_SIZE,

"attempting to read a pcr value");

if (rc == 0)

memcpy(res_buf, cmd.params.pcrread_out.pcr_result,

TPM_DIGEST_SIZE);

return rc;

}

/*读取TPM设备中平台配置寄存器中的数据,对__tpm_pcr_read()函数的进一步封装*/

int tpm_pcr_read(u32 chip_num, int pcr_idx, u8 *res_buf)

{

struct tpm_chip *chip;

int rc;

/*获取tpm设备序号*/

chip = tpm_chip_find_get(chip_num);

if (chip == NULL)

return -ENODEV;

/*读取pcr中的数据*/

rc = __tpm_pcr_read(chip, pcr_idx, res_buf);

tpm_chip_put(chip);

return rc;

}

/*扩充、更新平台配置寄存器pcr中的数据*/

int tpm_pcr_extend(u32 chip_num, int pcr_idx, const u8 *hash)

{

struct tpm_cmd_t cmd;

int rc;

struct tpm_chip *chip;

chip = tpm_chip_find_get(chip_num);

if (chip == NULL)

return -ENODEV;

cmd.header.in = pcrextend_header;

cmd.params.pcrextend_in.pcr_idx = cpu_to_be32(pcr_idx);

memcpy(cmd.params.pcrextend_in.hash, hash, TPM_DIGEST_SIZE);

rc = transmit_cmd(chip, &cmd, EXTEND_PCR_RESULT_SIZE,

"attempting extend a PCR value");

tpm_chip_put(chip);

return rc;

}

/*12.www.qixoo.qixoo.com/在接受下次命令前,TPM设备状态自检。当检测状态成功可以接受命令时,返回0*/

int tpm_do_selftest(struct tpm_chip *chip)

{

int rc;

unsigned int loops;

unsigned int delay_msec = 1000;

unsigned long duration;

struct tpm_cmd_t cmd;

duration = tpm_calc_ordinal_duration(chip, TPM_ORD_CONTINUE_SELFTEST);

loops = jiffies_to_msecs(duration) / delay_msec;

rc = tpm_continue_selftest(chip);

/*在挂起或恢复期间,没有TPM设备驱动,可能失败返回10 (BAD_ORDINAL)或者28 (FAILEDSELFTEST)*/

if (rc)

return rc;

do {

/* 尝试读取pcr中的数据 */

cmd.header.in = pcrread_header;

cmd.params.pcrread_in.pcr_idx = cpu_to_be32(0);

rc = tpm_transmit(chip, (u8 *) &cmd, READ_PCR_RESULT_SIZE);

if (rc < TPM_HEADER_SIZE)

return -EFAULT;

rc = be32_to_cpu(cmd.header.out.return_code);

if (rc == TPM_ERR_DISABLED || rc == TPM_ERR_DEACTIVATED) {

dev_info(chip->dev, "TPM is disabled/deactivated (0x%X)\n", rc);

/*TPM状态是disabled 或 deactivated,TPM设备驱动可以继续运行,TPM设备可以接受处理命令*/

return 0;

}

if (rc != TPM_WARN_DOING_SELFTEST)

return rc;

msleep(delay_msec);

} while (--loops > 0);

return rc;

}

/*显示设定的TPM设备执行命令的时间*/

ssize_t tpm_show_durations(struct device *dev, struct device_attribute *attr,

char *buf)

{

struct tpm_chip *chip = dev_get_drvdata(dev);

if (chip->vendor.duration[TPM_LONG] == 0)

return 0;

return sprintf(buf, "%d %d %d [%s]\n",

jiffies_to_usecs(chip->vendor.duration[TPM_SHORT]),

jiffies_to_usecs(chip->vendor.duration[TPM_MEDIUM]),

jiffies_to_usecs(chip->vendor.duration[TPM_LONG]),

chip->vendor.duration_adjusted

? "adjusted" : "original");

}

/*显示设定的超时时间值*/

ssize_t tpm_show_timeouts(struct device *dev, struct device_attribute *attr,

char *buf)

{

struct tpm_chip *chip = dev_get_drvdata(dev);

return sprintf(buf, "%d %d %d %d [%s]\n",

jiffies_to_usecs(chip->vendor.timeout_a),

jiffies_to_usecs(chip->vendor.timeout_b),

jiffies_to_usecs(chip->vendor.timeout_c),

jiffies_to_usecs(chip->vendor.timeout_d),

chip->vendor.timeout_adjusted

? "adjusted" : "original");

}

/*取消TPM设备操作*/

ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr,

const char *buf, size_t count)

{

struct tpm_chip *chip = dev_get_drvdata(dev);

if (chip == NULL)

return 0;

/*调用tpm_chip结构体中vendor字段指向的tpm_vendor_specific 结构体中的cancel函数成员*/

chip->vendor.cancel(chip);

return count;

}

Linux可信计算机制模块详细分析之核心文件分析(8)tpm.c核心代码注释(中)的更多相关文章

  1. Yii2.0源码分析之——控制器文件分析(Controller.php)创建动作、执行动作

    在Yii中,当请求一个Url的时候,首先在application中获取request信息,然后由request通过urlManager解析出route,再在Module中根据route来创建contr ...

  2. CI核心文件分析之基准测试类 (Benchmark.php)

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * CodeIgniter * * ...

  3. 性能测试分析工具nmon文件分析时报错解决办法

    1.使用nmon analyzer V334.xml分析数据时,如果文件过大,可以修改Analyser页签中的INTERVALS的最大值: 2.查找生成的nmon文件中包含的nan,删掉这些数据(需要 ...

  4. Linux强制访问控制机制模块分析之mls_type.h

    2.4.2 mls_type.h 2.4.2.1文件描述 对于mls_type.h文件,其完整文件名为security/selinux/ss/mls_types.h,该文件定义了MLS策略使用的类型. ...

  5. Linux内核OOM机制的详细分析(转)

    Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...

  6. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  7. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  8. linux 时钟源初步分析linux kernel 时钟框架详细介绍

    初步概念: 看datasheet的关于时钟与定时器的部分, FCLK供给cpu, HCLK供给AHB总线设备(存储器控制器,中断控制器.LCD控制器.DMA.USB主机控制器等), PCLK供给APB ...

  9. 【原创】Linux信号量机制分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

随机推荐

  1. centos 域名硬解析(linux)

    centos做硬解析跟Windows一样修改一个文件. 具体文件为:/etc/hosts.修改命令: vi /etc/hosts 格式个Windows也一样的.

  2. eclipse启动tomcat无法访问

    eclipse启动tomcat无法访问 症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080/不能访问,且报404错误.同时其他项目页面也不能 ...

  3. JS实现文字截取(雾)

    今天在跳板群那里看到一个神奇的样式,效果: 感觉十分神奇,因为一开始以为他是只有一个P元素包着文字然后最后一个自动截取文字,而且最后一行还可以提前截取???这怎么做到的,然后想了一下css怎么做,好像 ...

  4. 数据可视化案例 | 如何打造数据中心APP产品

    意识到数据探索带来的无尽信息,越来越多的企业开始建立自有的数据分析平台,打造数据化产品,实现数据可视化. 在零售商超行业,沃尔玛"啤酒与尿布"的故事已不再是传奇.无论是大数据还是小 ...

  5. Android Studio使用时源码到处报红色警告,运行时又没错

    转载地址:http://www.07net01.com/program/2016/04/1452749.html [摘要:正在AS上开辟时,碰到那个题目,翻开全部的Java源文件,右边一起标赤色,找没 ...

  6. Android 开源库和项目 2

    1.带尾巴的RecyclerViewPager 特点:1.像viewPager一样滑动一次就滑动一页 2.像画廊gallery一样,滑动一次可以滑动很多页 3.竖向滑动 4.支持点击事件,没有错乱   ...

  7. 超简单,spring boot 添加mybatis

    看了很多人写的博客,要么太复杂,要么没有添加xml的方式,自己亲自配置了一下,供各位参考. 项目截图 1.添加pom文件 <!-- 设置mybatis --> <dependency ...

  8. 个人作业-week2:关于微软必应词典的案例分析

    第一部分 调研,评测 评测基于微软必应词典Android5.2.2客户端,手机型号为MI NOTE LTE,Android版本为6.0.1. 软件bug:关于这方面,其实有一些疑问.因为相对于市面上其 ...

  9. Oracle的SQL基础

    1.了解SQL的种类 (1)DDL 数据定义语言:定义数据库中数据要如何存储的,包括对数据库对象的创建(create)修改(alter)删除(drop)的操作,这些对象主要有数据库,数据表,视图,索引 ...

  10. Redis 与 数据库处理数据的两种模式

    Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...