23
23
#include < android-base/logging.h>
24
24
#include < android-base/properties.h>
25
25
#include < bootloader_message/bootloader_message.h>
26
+ #include < string_view>
26
27
27
28
namespace {
28
29
using ::testing::StartsWith;
29
30
30
- int mtectrl (const char * arg) {
31
+ int mtectrl (std::string_view arg) {
31
32
std::string cmd = " mtectrl -t /data/local/tmp/misc_memtag " ;
32
33
cmd += arg;
33
34
return system (cmd.c_str ());
34
35
}
35
36
37
+ int RunMteCtrl () {
38
+ CHECK (android::base::GetIntProperty (" arm64.memtag.test_bootctl_loaded" , 0 ) == 1 );
39
+ std::string arg = android::base::GetProperty (" arm64.memtag.test_bootctl" , " none" );
40
+ arg += " " ;
41
+ arg += android::base::GetProperty (" arm64.memtag.test_bootctl_override" , " default" );
42
+ return mtectrl (arg);
43
+ }
44
+
45
+ void Boot (misc_memtag_message m) {
46
+ std::string m_str (reinterpret_cast <char *>(&m), sizeof (m));
47
+ android::base::WriteStringToFile (m_str, " /data/local/tmp/misc_memtag" );
48
+ mtectrl (" -s arm64.memtag.test_bootctl -f arm64.memtag.test_bootctl_loaded" );
49
+ // arm64.memtag.test_bootctl got updated, so we trigger ourselves.
50
+ RunMteCtrl ();
51
+ }
52
+
53
+ void Reboot () {
54
+ android::base::SetProperty (" arm64.memtag.test_bootctl" , " INVALID" );
55
+ android::base::SetProperty (" arm64.memtag.test_bootctl_loaded" , " 0" );
56
+ std::string m_str;
57
+ ASSERT_TRUE (android::base::ReadFileToString (" /data/local/tmp/misc_memtag" , &m_str));
58
+ misc_memtag_message m;
59
+ ASSERT_EQ (m_str.size (), sizeof (m));
60
+ memcpy (&m, m_str.c_str (), sizeof (m));
61
+ m.memtag_mode &= ~MISC_MEMTAG_MODE_MEMTAG_ONCE;
62
+ Boot (m);
63
+ }
64
+
65
+ void SetMemtagProp (const std::string& s) {
66
+ android::base::SetProperty (" arm64.memtag.test_bootctl" , s);
67
+ RunMteCtrl ();
68
+ }
69
+
70
+ void SetOverrideProp (const std::string& s) {
71
+ android::base::SetProperty (" arm64.memtag.test_bootctl_override" , s);
72
+ RunMteCtrl ();
73
+ }
74
+
36
75
std::string GetMisc () {
37
76
std::string data;
38
77
CHECK (android::base::ReadFileToString (" /data/local/tmp/misc_memtag" , &data, false ));
@@ -55,6 +94,7 @@ class MteCtrlTest : public ::testing::Test {
55
94
CHECK (ftruncate (fd, sizeof (misc_memtag_message)) != -1 );
56
95
close (fd);
57
96
android::base::SetProperty (" arm64.memtag.test_bootctl" , " INVALID" );
97
+ android::base::SetProperty (" arm64.memtag.test_bootctl_override" , " " );
58
98
android::base::SetProperty (" arm64.memtag.test_bootctl_loaded" , " 0" );
59
99
}
60
100
void TearDown () override {
@@ -68,37 +108,28 @@ TEST_F(MteCtrlTest, invalid) {
68
108
}
69
109
70
110
TEST_F (MteCtrlTest, set_once) {
71
- ASSERT_EQ (mtectrl (" memtag-once" ), 0 );
111
+ Boot ({});
112
+ SetMemtagProp (" memtag-once" );
72
113
EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x02 " ));
73
114
}
74
115
75
116
TEST_F (MteCtrlTest, set_once_kernel) {
76
- ASSERT_EQ (mtectrl (" memtag-once,memtag-kernel" ), 0 );
117
+ Boot ({});
118
+ SetMemtagProp (" memtag-once,memtag-kernel" );
77
119
EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x06 " ));
78
120
}
79
121
80
- TEST_F (MteCtrlTest, set_memtag) {
81
- ASSERT_EQ (mtectrl (" memtag" ), 0 );
82
- EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x01 " ));
83
- }
84
-
85
- TEST_F (MteCtrlTest, set_memtag_force_off) {
86
- ASSERT_EQ (mtectrl (" memtag force_off" ), 0 );
87
- EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x10 " ));
88
- }
89
-
90
122
TEST_F (MteCtrlTest, read_memtag) {
91
- ASSERT_EQ (mtectrl (" memtag" ), 0 );
92
- ASSERT_EQ (mtectrl (" -s arm64.memtag.test_bootctl -f arm64.memtag.test_bootctl_loaded" ), 0 );
123
+ Boot ({});
124
+ SetMemtagProp (" memtag" );
125
+ Reboot ();
93
126
EXPECT_EQ (TestProperty (), " memtag" );
94
127
EXPECT_EQ (TestFlag (), " 1" );
95
128
}
96
129
97
130
TEST_F (MteCtrlTest, read_invalid_memtag_message) {
98
131
misc_memtag_message m = {.version = 1 , .magic = 0xffff , .memtag_mode = MISC_MEMTAG_MODE_MEMTAG};
99
- std::string m_str (reinterpret_cast <char *>(&m), sizeof (m));
100
- android::base::WriteStringToFile (m_str, " /data/local/tmp/misc_memtag" );
101
- ASSERT_EQ (mtectrl (" -s arm64.memtag.test_bootctl -f arm64.memtag.test_bootctl_loaded" ), 0 );
132
+ Boot (m);
102
133
EXPECT_EQ (TestProperty (), " none" );
103
134
EXPECT_EQ (TestFlag (), " 1" );
104
135
}
@@ -107,49 +138,100 @@ TEST_F(MteCtrlTest, read_invalid_memtag_mode) {
107
138
misc_memtag_message m = {.version = MISC_MEMTAG_MESSAGE_VERSION,
108
139
.magic = MISC_MEMTAG_MAGIC_HEADER,
109
140
.memtag_mode = MISC_MEMTAG_MODE_MEMTAG | 1u << 31 };
110
- std::string m_str (reinterpret_cast <char *>(&m), sizeof (m));
111
- android::base::WriteStringToFile (m_str, " /data/local/tmp/misc_memtag" );
112
- ASSERT_NE (mtectrl (" -s arm64.memtag.test_bootctl -f arm64.memtag.test_bootctl_loaded" ), 0 );
141
+ Boot (m);
113
142
EXPECT_EQ (TestProperty (), " memtag" );
114
143
EXPECT_EQ (TestFlag (), " 1" );
115
144
}
116
145
117
- TEST_F (MteCtrlTest, set_read_memtag) {
118
- ASSERT_EQ (mtectrl (" -s arm64.memtag.test_bootctl memtag" ), 0 );
119
- EXPECT_EQ (TestProperty (), " memtag" );
146
+ TEST_F (MteCtrlTest, set_read_force_off) {
147
+ Boot ({});
148
+ SetMemtagProp (" memtag,memtag-once" );
149
+ SetOverrideProp (" force_off" );
150
+ Reboot ();
151
+ EXPECT_EQ (TestProperty (), " memtag-off,forced" );
152
+ SetOverrideProp (" default" );
153
+ Reboot ();
154
+ EXPECT_EQ (TestProperty (), " none" );
120
155
}
121
156
122
- TEST_F (MteCtrlTest, set_read_force_off) {
123
- ASSERT_EQ (mtectrl (" -s arm64.memtag.test_bootctl memtag,memtag-once force_off" ), 0 );
124
- EXPECT_EQ (TestProperty (), " memtag-once,memtag-off" );
157
+ TEST_F (MteCtrlTest, set_read_force_off_already) {
158
+ Boot ({});
159
+ SetMemtagProp (" memtag-off,memtag-once" );
160
+ SetOverrideProp (" force_off" );
161
+ Reboot ();
162
+ EXPECT_EQ (TestProperty (), " memtag-off" );
163
+ SetOverrideProp (" default" );
164
+ Reboot ();
165
+ EXPECT_EQ (TestProperty (), " memtag-off" );
166
+ }
167
+
168
+ TEST_F (MteCtrlTest, set_read_force_on) {
169
+ Boot ({});
170
+ SetMemtagProp (" memtag-once" );
171
+ SetOverrideProp (" force_on" );
172
+ Reboot ();
173
+ EXPECT_EQ (TestProperty (), " memtag,forced" );
174
+ SetOverrideProp (" default" );
175
+ Reboot ();
176
+ EXPECT_EQ (TestProperty (), " none" );
177
+ }
178
+
179
+ TEST_F (MteCtrlTest, set_read_force_on_already) {
180
+ Boot ({});
181
+ SetMemtagProp (" memtag,memtag-once" );
182
+ SetOverrideProp (" force_on" );
183
+ Reboot ();
184
+ EXPECT_EQ (TestProperty (), " memtag" );
185
+ SetOverrideProp (" default" );
186
+ Reboot ();
187
+ EXPECT_EQ (TestProperty (), " memtag" );
125
188
}
126
189
127
190
TEST_F (MteCtrlTest, override ) {
128
- ASSERT_EQ (mtectrl (" memtag" ), 0 );
129
- ASSERT_EQ (mtectrl (" memtag-once" ), 0 );
191
+ Boot ({});
192
+ SetMemtagProp ((" memtag" ));
193
+ SetMemtagProp ((" memtag-once" ));
130
194
EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x02 " ));
131
195
}
132
196
133
197
TEST_F (MteCtrlTest, read_empty) {
134
- ASSERT_EQ ( mtectrl ( " -s arm64.memtag.test_bootctl -f arm64.memtag.test_bootctl_loaded " ), 0 );
198
+ Boot ({} );
135
199
EXPECT_EQ (TestProperty (), " none" );
136
200
EXPECT_EQ (TestFlag (), " 1" );
137
201
}
138
202
139
203
TEST_F (MteCtrlTest, force_off_invalid_mode) {
140
- mtectrl (" -s arm64.memtag.test_bootctl memtag-invalid force_off" );
141
- EXPECT_EQ (TestProperty (), " memtag-off" );
142
- EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x10 " ));
204
+ Boot ({});
205
+ SetMemtagProp (" memtag-invalid" );
206
+ SetOverrideProp (" force_off" );
207
+ EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x30 " ));
208
+ Reboot ();
209
+ EXPECT_EQ (TestProperty (), " memtag-off,forced" );
210
+ SetOverrideProp (" default" );
211
+ Reboot ();
212
+ EXPECT_EQ (TestProperty (), " none" );
143
213
}
144
214
145
215
TEST_F (MteCtrlTest, force_on_invalid_mode) {
146
- mtectrl (" -s arm64.memtag.test_bootctl memtag-invalid force_on" );
147
- EXPECT_EQ (TestProperty (), " memtag" );
148
- EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x01 " ));
216
+ Boot ({});
217
+ SetMemtagProp (" memtag-invalid" );
218
+ SetOverrideProp (" force_on" );
219
+ EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x21 " ));
220
+ Reboot ();
221
+ EXPECT_EQ (TestProperty (), " memtag,forced" );
222
+ SetOverrideProp (" default" );
223
+ Reboot ();
224
+ EXPECT_EQ (TestProperty (), " none" );
149
225
}
150
226
151
227
TEST_F (MteCtrlTest, mode_invalid_override) {
152
- mtectrl (" -s arm64.memtag.test_bootctl memtag force_invalid" );
153
- EXPECT_EQ (TestProperty (), " memtag" );
228
+ Boot ({});
229
+ SetMemtagProp (" memtag" );
230
+ SetOverrideProp (" force_invalid" );
154
231
EXPECT_THAT (GetMisc (), StartsWith (" \x01\x5a\xfe\xfe\x5a\x01 " ));
232
+ Reboot ();
233
+ EXPECT_EQ (TestProperty (), " memtag" );
234
+ SetOverrideProp (" default" );
235
+ Reboot ();
236
+ EXPECT_EQ (TestProperty (), " memtag" );
155
237
}
0 commit comments