OLD | NEW |
1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 * Use of this source code is governed by a BSD-style license that can be | 2 * Use of this source code is governed by a BSD-style license that can be |
3 * found in the LICENSE file. | 3 * found in the LICENSE file. |
4 * | 4 * |
5 * Functions for querying, manipulating and locking rollback indices | 5 * Functions for querying, manipulating and locking rollback indices |
6 * stored in the TPM NVRAM. | 6 * stored in the TPM NVRAM. |
7 */ | 7 */ |
8 | 8 |
9 #ifndef VBOOT_REFERENCE_ROLLBACK_INDEX_H_ | 9 #ifndef VBOOT_REFERENCE_ROLLBACK_INDEX_H_ |
10 #define VBOOT_REFERENCE_ROLLBACK_INDEX_H_ | 10 #define VBOOT_REFERENCE_ROLLBACK_INDEX_H_ |
11 | 11 |
12 #include "sysincludes.h" | 12 #include "sysincludes.h" |
13 | 13 |
14 /* TODO: global variables won't work in the boot stub, since it runs | |
15 directly out of ROM. */ | |
16 extern uint16_t g_firmware_key_version; | |
17 extern uint16_t g_firmware_version; | |
18 extern uint16_t g_kernel_key_version; | |
19 extern uint16_t g_kernel_version; | |
20 | |
21 /* Rollback version types. */ | 14 /* Rollback version types. */ |
22 #define FIRMWARE_VERSIONS 0 | 15 #define FIRMWARE_VERSIONS 0 |
23 #define KERNEL_VERSIONS 1 | 16 #define KERNEL_VERSIONS 1 |
24 | 17 |
25 /* Initialization mode */ | 18 /* Initialization mode */ |
26 #define RO_RECOVERY_MODE 0 | 19 #define RO_RECOVERY_MODE 0 |
27 #define RO_NORMAL_MODE 1 | 20 #define RO_NORMAL_MODE 1 |
28 #define RW_NORMAL_MODE 2 | 21 #define RW_NORMAL_MODE 2 |
29 | 22 |
30 /* TPM NVRAM location indices. */ | 23 /* TPM NVRAM location indices. */ |
31 #define FIRMWARE_VERSIONS_NV_INDEX 0x1001 | 24 #define FIRMWARE_VERSIONS_NV_INDEX 0x1001 |
32 #define KERNEL_VERSIONS_NV_INDEX 0x1002 | 25 #define KERNEL_VERSIONS_NV_INDEX 0x1002 |
33 #define TPM_IS_INITIALIZED_NV_INDEX 0x1003 | 26 #define TPM_IS_INITIALIZED_NV_INDEX 0x1003 |
34 #define KERNEL_VERSIONS_BACKUP_NV_INDEX 0x1004 | 27 #define KERNEL_VERSIONS_BACKUP_NV_INDEX 0x1004 |
35 #define KERNEL_MUST_USE_BACKUP_NV_INDEX 0x1005 | 28 #define KERNEL_MUST_USE_BACKUP_NV_INDEX 0x1005 |
36 #define DEVELOPER_MODE_NV_INDEX 0x1006 | 29 #define DEVELOPER_MODE_NV_INDEX 0x1006 |
37 | 30 |
38 /* Unique ID to detect kernel space redefinition */ | 31 /* Unique ID to detect kernel space redefinition */ |
39 #define KERNEL_SPACE_UID "GRWL" /* unique ID with secret meaning */ | 32 #define KERNEL_SPACE_UID "GRWL" /* unique ID with secret meaning */ |
40 #define KERNEL_SPACE_UID_SIZE (sizeof(KERNEL_SPACE_UID) - 1) | 33 #define KERNEL_SPACE_UID_SIZE (sizeof(KERNEL_SPACE_UID) - 1) |
41 #define KERNEL_SPACE_INIT_DATA ((uint8_t*) "\0\0\0\0" KERNEL_SPACE_UID) | 34 #define KERNEL_SPACE_INIT_DATA ((uint8_t*) "\0\0\0\0" KERNEL_SPACE_UID) |
42 #define KERNEL_SPACE_SIZE (sizeof(uint32_t) + KERNEL_SPACE_UID_SIZE) | 35 #define KERNEL_SPACE_SIZE (sizeof(uint32_t) + KERNEL_SPACE_UID_SIZE) |
43 | 36 |
44 /* All functions return TPM_SUCCESS (zero) if successful, non-zero if error */ | 37 /* All functions return TPM_SUCCESS (zero) if successful, non-zero if error */ |
45 | 38 |
46 | |
47 /* | 39 /* |
48 | 40 |
49 Call from LoadFirmware() | 41 Call from LoadFirmware() |
50 Normal or developer mode (not recovery) | 42 Normal or developer mode (not recovery) |
51 Wants firmware versions | 43 Wants firmware versions |
52 Must send in developer flag | 44 Must send in developer flag |
53 | 45 |
54 RollbackFirmwareSetup(IN devmode, OUT firmware versions) | 46 RollbackFirmwareSetup(IN devmode) |
| 47 (maybe) RollbackFirmwareRead() |
55 (maybe) RollbackFirmwareWrite() | 48 (maybe) RollbackFirmwareWrite() |
56 RollbackFirmwareLock() | 49 RollbackFirmwareLock() |
57 | 50 |
58 Call from LoadKernel() | 51 Call from LoadKernel() |
59 | 52 |
60 RollbackKernelRecovery(IN devmode) | 53 RollbackKernelRecovery(IN devmode) |
61 (implies LockFirmwareVersions() inside the setup) | 54 (implies LockFirmwareVersions() inside the setup) |
62 | 55 |
63 RollbackKernelRead(OUT kernel versions) | 56 RollbackKernelRead(OUT kernel versions) |
64 (maybe) RollbackKernelWrite() | 57 (maybe) RollbackKernelWrite() |
65 RollbackKernelLock() | 58 RollbackKernelLock() |
66 | 59 |
67 Any mode | 60 Any mode |
68 If recovery mode, this is the first time we've been called | 61 If recovery mode, this is the first time we've been called |
69 Must send in developer flag | 62 Must send in developer flag |
70 If not recovery mode, wants kernel versions | 63 If not recovery mode, wants kernel versions |
71 Must send in developer and recovery flags | 64 Must send in developer and recovery flags |
72 */ | 65 */ |
73 | 66 |
74 /* These functions are callable from LoadFirmware(). They cannot use | 67 /* These functions are callable from LoadFirmware(). They cannot use |
75 * global variables. */ | 68 * global variables. */ |
| 69 |
76 /* Setup must be called. Pass developer_mode=nonzero if in developer | 70 /* Setup must be called. Pass developer_mode=nonzero if in developer |
77 * mode. */ | 71 * mode. */ |
78 uint32_t RollbackFirmwareSetup(int developer_mode, | 72 uint32_t RollbackFirmwareSetup(int developer_mode); |
79 uint16_t* key_version, uint16_t* version); | 73 /* Read and Write may be called after Setup. */ |
| 74 uint32_t RollbackFirmwareRead(uint16_t* key_version, uint16_t* version); |
80 /* Write may be called if the versions change */ | 75 /* Write may be called if the versions change */ |
81 uint32_t RollbackFirmwareWrite(uint16_t key_version, uint16_t version); | 76 uint32_t RollbackFirmwareWrite(uint16_t key_version, uint16_t version); |
| 77 |
82 /* Lock must be called */ | 78 /* Lock must be called */ |
83 uint32_t RollbackFirmwareLock(void); | 79 uint32_t RollbackFirmwareLock(void); |
84 | 80 |
85 /* These functions are callable from LoadKernel(). They may use global | 81 /* These functions are callable from LoadKernel(). They may use global |
86 * variables. */ | 82 * variables. */ |
| 83 |
87 /* Recovery may be called. If it is, this is the first time a | 84 /* Recovery may be called. If it is, this is the first time a |
88 * rollback function has been called this boot, so it needs to know if | 85 * rollback function has been called this boot, so it needs to know if |
89 * we're in developer mode. Pass developer_mode=nonzero if in developer | 86 * we're in developer mode. Pass developer_mode=nonzero if in developer |
90 * mode. */ | 87 * mode. */ |
91 uint32_t RollbackKernelRecovery(int developer_mode); | 88 uint32_t RollbackKernelRecovery(int developer_mode); |
| 89 |
92 /* Read and write may be called if not in developer mode. If called in | 90 /* Read and write may be called if not in developer mode. If called in |
93 * recovery mode, these are ignored and/or return 0 versions. */ | 91 * recovery mode, the effect is undefined. */ |
94 uint32_t RollbackKernelRead(uint16_t* key_version, uint16_t* version); | 92 uint32_t RollbackKernelRead(uint16_t* key_version, uint16_t* version); |
95 uint32_t RollbackKernelWrite(uint16_t key_version, uint16_t version); | 93 uint32_t RollbackKernelWrite(uint16_t key_version, uint16_t version); |
| 94 |
96 /* Lock must be called. Internally, it's ignored in recovery mode. */ | 95 /* Lock must be called. Internally, it's ignored in recovery mode. */ |
97 uint32_t RollbackKernelLock(void); | 96 uint32_t RollbackKernelLock(void); |
98 | 97 |
99 | |
100 /* SetupTPM is called on boot and on starting the RW firmware, passing the | |
101 * appripriate MODE and DEVELOPER_FLAG parameters. MODE can be one of | |
102 * RO_RECOVERY_MODE, RO_NORMAL_MODE, RW_NORMAL_MODE. DEVELOPER_FLAG is 1 when | |
103 * the developer switch is ON, 0 otherwise. | |
104 * | |
105 * If SetupTPM returns TPM_SUCCESS, the caller may proceed. If it returns | |
106 * TPM_E_MUST_REBOOT, the caller must reboot in the current mode. For all | |
107 * other return values, the caller must reboot in recovery mode. | |
108 * | |
109 * This function has many side effects on the TPM state. In particular, when | |
110 * called with mode = RECOVERY_MODE, it locks the firmware versions before | |
111 * returning. In all other cases, the caller is responsible for locking the | |
112 * firmware versions once it decides it doesn't need to update them. | |
113 */ | |
114 uint32_t SetupTPM(int mode, int developer_flag); | |
115 uint32_t GetStoredVersions(int type, uint16_t* key_version, uint16_t* version); | |
116 uint32_t WriteStoredVersions(int type, uint16_t key_version, uint16_t version); | |
117 uint32_t LockFirmwareVersions(void); | |
118 uint32_t LockKernelVersionsByLockingPP(void); | |
119 | |
120 #endif /* VBOOT_REFERENCE_ROLLBACK_INDEX_H_ */ | 98 #endif /* VBOOT_REFERENCE_ROLLBACK_INDEX_H_ */ |
OLD | NEW |