OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 { | 232 { |
233 CPUContextX86_64 cpu_context_x86_64 = {}; | 233 CPUContextX86_64 cpu_context_x86_64 = {}; |
234 internal::InitializeCPUContextX86_64(&cpu_context_x86_64, | 234 internal::InitializeCPUContextX86_64(&cpu_context_x86_64, |
235 THREAD_STATE_NONE, | 235 THREAD_STATE_NONE, |
236 NULL, | 236 NULL, |
237 0, | 237 0, |
238 &x86_thread_state64, | 238 &x86_thread_state64, |
239 &x86_float_state64, | 239 &x86_float_state64, |
240 &x86_debug_state64); | 240 &x86_debug_state64); |
241 EXPECT_EQ(10u, cpu_context_x86_64.rax); | 241 EXPECT_EQ(10u, cpu_context_x86_64.rax); |
242 EXPECT_EQ(11u, cpu_context_x86_64.fxsave64.ftw); | 242 EXPECT_EQ(11u, cpu_context_x86_64.fxsave.ftw); |
243 EXPECT_EQ(12u, cpu_context_x86_64.dr0); | 243 EXPECT_EQ(12u, cpu_context_x86_64.dr0); |
244 } | 244 } |
245 | 245 |
246 // Supply context in a CPU-specific “flavor” parameter expected to be used | 246 // Supply context in a CPU-specific “flavor” parameter expected to be used |
247 // instead of the supplied thread, float, or debug state parameters. Do this | 247 // instead of the supplied thread, float, or debug state parameters. Do this |
248 // once for each of the three valid flavors. This simulates how | 248 // once for each of the three valid flavors. This simulates how |
249 // InitializeCPUContextX86_64() might be used to initialize the context in an | 249 // InitializeCPUContextX86_64() might be used to initialize the context in an |
250 // exception handler, where the exception handler may have received the | 250 // exception handler, where the exception handler may have received the |
251 // “flavor” parameter and this context should be used to initialize the | 251 // “flavor” parameter and this context should be used to initialize the |
252 // CPUContextX86_64. | 252 // CPUContextX86_64. |
253 | 253 |
254 { | 254 { |
255 x86_thread_state64_t alt_x86_thread_state64 = {}; | 255 x86_thread_state64_t alt_x86_thread_state64 = {}; |
256 alt_x86_thread_state64.__rax = 13; | 256 alt_x86_thread_state64.__rax = 13; |
257 | 257 |
258 CPUContextX86_64 cpu_context_x86_64 = {}; | 258 CPUContextX86_64 cpu_context_x86_64 = {}; |
259 internal::InitializeCPUContextX86_64( | 259 internal::InitializeCPUContextX86_64( |
260 &cpu_context_x86_64, | 260 &cpu_context_x86_64, |
261 x86_THREAD_STATE64, | 261 x86_THREAD_STATE64, |
262 reinterpret_cast<natural_t*>(&alt_x86_thread_state64), | 262 reinterpret_cast<natural_t*>(&alt_x86_thread_state64), |
263 x86_THREAD_STATE64_COUNT, | 263 x86_THREAD_STATE64_COUNT, |
264 &x86_thread_state64, | 264 &x86_thread_state64, |
265 &x86_float_state64, | 265 &x86_float_state64, |
266 &x86_debug_state64); | 266 &x86_debug_state64); |
267 EXPECT_EQ(13u, cpu_context_x86_64.rax); | 267 EXPECT_EQ(13u, cpu_context_x86_64.rax); |
268 EXPECT_EQ(11u, cpu_context_x86_64.fxsave64.ftw); | 268 EXPECT_EQ(11u, cpu_context_x86_64.fxsave.ftw); |
269 EXPECT_EQ(12u, cpu_context_x86_64.dr0); | 269 EXPECT_EQ(12u, cpu_context_x86_64.dr0); |
270 } | 270 } |
271 | 271 |
272 { | 272 { |
273 x86_float_state64_t alt_x86_float_state64 = {}; | 273 x86_float_state64_t alt_x86_float_state64 = {}; |
274 alt_x86_float_state64.__fpu_ftw = 14; | 274 alt_x86_float_state64.__fpu_ftw = 14; |
275 | 275 |
276 CPUContextX86_64 cpu_context_x86_64 = {}; | 276 CPUContextX86_64 cpu_context_x86_64 = {}; |
277 internal::InitializeCPUContextX86_64( | 277 internal::InitializeCPUContextX86_64( |
278 &cpu_context_x86_64, | 278 &cpu_context_x86_64, |
279 x86_FLOAT_STATE64, | 279 x86_FLOAT_STATE64, |
280 reinterpret_cast<natural_t*>(&alt_x86_float_state64), | 280 reinterpret_cast<natural_t*>(&alt_x86_float_state64), |
281 x86_FLOAT_STATE64_COUNT, | 281 x86_FLOAT_STATE64_COUNT, |
282 &x86_thread_state64, | 282 &x86_thread_state64, |
283 &x86_float_state64, | 283 &x86_float_state64, |
284 &x86_debug_state64); | 284 &x86_debug_state64); |
285 EXPECT_EQ(10u, cpu_context_x86_64.rax); | 285 EXPECT_EQ(10u, cpu_context_x86_64.rax); |
286 EXPECT_EQ(14u, cpu_context_x86_64.fxsave64.ftw); | 286 EXPECT_EQ(14u, cpu_context_x86_64.fxsave.ftw); |
287 EXPECT_EQ(12u, cpu_context_x86_64.dr0); | 287 EXPECT_EQ(12u, cpu_context_x86_64.dr0); |
288 } | 288 } |
289 | 289 |
290 { | 290 { |
291 x86_debug_state64_t alt_x86_debug_state64 = {}; | 291 x86_debug_state64_t alt_x86_debug_state64 = {}; |
292 alt_x86_debug_state64.__dr0 = 15; | 292 alt_x86_debug_state64.__dr0 = 15; |
293 | 293 |
294 CPUContextX86_64 cpu_context_x86_64 = {}; | 294 CPUContextX86_64 cpu_context_x86_64 = {}; |
295 internal::InitializeCPUContextX86_64( | 295 internal::InitializeCPUContextX86_64( |
296 &cpu_context_x86_64, | 296 &cpu_context_x86_64, |
297 x86_DEBUG_STATE64, | 297 x86_DEBUG_STATE64, |
298 reinterpret_cast<natural_t*>(&alt_x86_debug_state64), | 298 reinterpret_cast<natural_t*>(&alt_x86_debug_state64), |
299 x86_DEBUG_STATE64_COUNT, | 299 x86_DEBUG_STATE64_COUNT, |
300 &x86_thread_state64, | 300 &x86_thread_state64, |
301 &x86_float_state64, | 301 &x86_float_state64, |
302 &x86_debug_state64); | 302 &x86_debug_state64); |
303 EXPECT_EQ(10u, cpu_context_x86_64.rax); | 303 EXPECT_EQ(10u, cpu_context_x86_64.rax); |
304 EXPECT_EQ(11u, cpu_context_x86_64.fxsave64.ftw); | 304 EXPECT_EQ(11u, cpu_context_x86_64.fxsave.ftw); |
305 EXPECT_EQ(15u, cpu_context_x86_64.dr0); | 305 EXPECT_EQ(15u, cpu_context_x86_64.dr0); |
306 } | 306 } |
307 | 307 |
308 // Supply context in a universal “flavor” parameter expected to be used | 308 // Supply context in a universal “flavor” parameter expected to be used |
309 // instead of the supplied thread, float, or debug state parameters. The | 309 // instead of the supplied thread, float, or debug state parameters. The |
310 // universal format allows an exception handler to be registered to receive | 310 // universal format allows an exception handler to be registered to receive |
311 // thread, float, or debug state without having to know in advance whether it | 311 // thread, float, or debug state without having to know in advance whether it |
312 // will be receiving the state from a 32-bit or 64-bit process. For | 312 // will be receiving the state from a 32-bit or 64-bit process. For |
313 // CPUContextX86_64, only the 64-bit form is supported. | 313 // CPUContextX86_64, only the 64-bit form is supported. |
314 | 314 |
315 { | 315 { |
316 x86_thread_state x86_thread_state_3264 = {}; | 316 x86_thread_state x86_thread_state_3264 = {}; |
317 x86_thread_state_3264.tsh.flavor = x86_THREAD_STATE64; | 317 x86_thread_state_3264.tsh.flavor = x86_THREAD_STATE64; |
318 x86_thread_state_3264.tsh.count = x86_THREAD_STATE64_COUNT; | 318 x86_thread_state_3264.tsh.count = x86_THREAD_STATE64_COUNT; |
319 x86_thread_state_3264.uts.ts64.__rax = 16; | 319 x86_thread_state_3264.uts.ts64.__rax = 16; |
320 | 320 |
321 CPUContextX86_64 cpu_context_x86_64 = {}; | 321 CPUContextX86_64 cpu_context_x86_64 = {}; |
322 internal::InitializeCPUContextX86_64( | 322 internal::InitializeCPUContextX86_64( |
323 &cpu_context_x86_64, | 323 &cpu_context_x86_64, |
324 x86_THREAD_STATE, | 324 x86_THREAD_STATE, |
325 reinterpret_cast<natural_t*>(&x86_thread_state_3264), | 325 reinterpret_cast<natural_t*>(&x86_thread_state_3264), |
326 x86_THREAD_STATE_COUNT, | 326 x86_THREAD_STATE_COUNT, |
327 &x86_thread_state64, | 327 &x86_thread_state64, |
328 &x86_float_state64, | 328 &x86_float_state64, |
329 &x86_debug_state64); | 329 &x86_debug_state64); |
330 EXPECT_EQ(16u, cpu_context_x86_64.rax); | 330 EXPECT_EQ(16u, cpu_context_x86_64.rax); |
331 EXPECT_EQ(11u, cpu_context_x86_64.fxsave64.ftw); | 331 EXPECT_EQ(11u, cpu_context_x86_64.fxsave.ftw); |
332 EXPECT_EQ(12u, cpu_context_x86_64.dr0); | 332 EXPECT_EQ(12u, cpu_context_x86_64.dr0); |
333 } | 333 } |
334 | 334 |
335 { | 335 { |
336 x86_float_state x86_float_state_3264 = {}; | 336 x86_float_state x86_float_state_3264 = {}; |
337 x86_float_state_3264.fsh.flavor = x86_FLOAT_STATE64; | 337 x86_float_state_3264.fsh.flavor = x86_FLOAT_STATE64; |
338 x86_float_state_3264.fsh.count = x86_FLOAT_STATE64_COUNT; | 338 x86_float_state_3264.fsh.count = x86_FLOAT_STATE64_COUNT; |
339 x86_float_state_3264.ufs.fs64.__fpu_ftw = 17; | 339 x86_float_state_3264.ufs.fs64.__fpu_ftw = 17; |
340 | 340 |
341 CPUContextX86_64 cpu_context_x86_64 = {}; | 341 CPUContextX86_64 cpu_context_x86_64 = {}; |
342 internal::InitializeCPUContextX86_64( | 342 internal::InitializeCPUContextX86_64( |
343 &cpu_context_x86_64, | 343 &cpu_context_x86_64, |
344 x86_FLOAT_STATE, | 344 x86_FLOAT_STATE, |
345 reinterpret_cast<natural_t*>(&x86_float_state_3264), | 345 reinterpret_cast<natural_t*>(&x86_float_state_3264), |
346 x86_FLOAT_STATE_COUNT, | 346 x86_FLOAT_STATE_COUNT, |
347 &x86_thread_state64, | 347 &x86_thread_state64, |
348 &x86_float_state64, | 348 &x86_float_state64, |
349 &x86_debug_state64); | 349 &x86_debug_state64); |
350 EXPECT_EQ(10u, cpu_context_x86_64.rax); | 350 EXPECT_EQ(10u, cpu_context_x86_64.rax); |
351 EXPECT_EQ(17u, cpu_context_x86_64.fxsave64.ftw); | 351 EXPECT_EQ(17u, cpu_context_x86_64.fxsave.ftw); |
352 EXPECT_EQ(12u, cpu_context_x86_64.dr0); | 352 EXPECT_EQ(12u, cpu_context_x86_64.dr0); |
353 } | 353 } |
354 | 354 |
355 { | 355 { |
356 x86_debug_state x86_debug_state_3264 = {}; | 356 x86_debug_state x86_debug_state_3264 = {}; |
357 x86_debug_state_3264.dsh.flavor = x86_DEBUG_STATE64; | 357 x86_debug_state_3264.dsh.flavor = x86_DEBUG_STATE64; |
358 x86_debug_state_3264.dsh.count = x86_DEBUG_STATE64_COUNT; | 358 x86_debug_state_3264.dsh.count = x86_DEBUG_STATE64_COUNT; |
359 x86_debug_state_3264.uds.ds64.__dr0 = 18; | 359 x86_debug_state_3264.uds.ds64.__dr0 = 18; |
360 | 360 |
361 CPUContextX86_64 cpu_context_x86_64 = {}; | 361 CPUContextX86_64 cpu_context_x86_64 = {}; |
362 internal::InitializeCPUContextX86_64( | 362 internal::InitializeCPUContextX86_64( |
363 &cpu_context_x86_64, | 363 &cpu_context_x86_64, |
364 x86_DEBUG_STATE, | 364 x86_DEBUG_STATE, |
365 reinterpret_cast<natural_t*>(&x86_debug_state_3264), | 365 reinterpret_cast<natural_t*>(&x86_debug_state_3264), |
366 x86_DEBUG_STATE_COUNT, | 366 x86_DEBUG_STATE_COUNT, |
367 &x86_thread_state64, | 367 &x86_thread_state64, |
368 &x86_float_state64, | 368 &x86_float_state64, |
369 &x86_debug_state64); | 369 &x86_debug_state64); |
370 EXPECT_EQ(10u, cpu_context_x86_64.rax); | 370 EXPECT_EQ(10u, cpu_context_x86_64.rax); |
371 EXPECT_EQ(11u, cpu_context_x86_64.fxsave64.ftw); | 371 EXPECT_EQ(11u, cpu_context_x86_64.fxsave.ftw); |
372 EXPECT_EQ(18u, cpu_context_x86_64.dr0); | 372 EXPECT_EQ(18u, cpu_context_x86_64.dr0); |
373 } | 373 } |
374 | 374 |
375 // Supply inappropriate “flavor” contexts to test that | 375 // Supply inappropriate “flavor” contexts to test that |
376 // InitializeCPUContextX86() detects the problem and refuses to use the | 376 // InitializeCPUContextX86() detects the problem and refuses to use the |
377 // supplied “flavor” context, falling back to the thread, float, and debug | 377 // supplied “flavor” context, falling back to the thread, float, and debug |
378 // states. | 378 // states. |
379 | 379 |
380 { | 380 { |
381 x86_thread_state32_t x86_thread_state32 = {}; | 381 x86_thread_state32_t x86_thread_state32 = {}; |
382 | 382 |
383 CPUContextX86_64 cpu_context_x86_64 = {}; | 383 CPUContextX86_64 cpu_context_x86_64 = {}; |
384 internal::InitializeCPUContextX86_64( | 384 internal::InitializeCPUContextX86_64( |
385 &cpu_context_x86_64, | 385 &cpu_context_x86_64, |
386 x86_THREAD_STATE32, | 386 x86_THREAD_STATE32, |
387 reinterpret_cast<natural_t*>(&x86_thread_state32), | 387 reinterpret_cast<natural_t*>(&x86_thread_state32), |
388 x86_THREAD_STATE32_COUNT, | 388 x86_THREAD_STATE32_COUNT, |
389 &x86_thread_state64, | 389 &x86_thread_state64, |
390 &x86_float_state64, | 390 &x86_float_state64, |
391 &x86_debug_state64); | 391 &x86_debug_state64); |
392 EXPECT_EQ(10u, cpu_context_x86_64.rax); | 392 EXPECT_EQ(10u, cpu_context_x86_64.rax); |
393 EXPECT_EQ(11u, cpu_context_x86_64.fxsave64.ftw); | 393 EXPECT_EQ(11u, cpu_context_x86_64.fxsave.ftw); |
394 EXPECT_EQ(12u, cpu_context_x86_64.dr0); | 394 EXPECT_EQ(12u, cpu_context_x86_64.dr0); |
395 } | 395 } |
396 | 396 |
397 { | 397 { |
398 x86_thread_state x86_thread_state_3264 = {}; | 398 x86_thread_state x86_thread_state_3264 = {}; |
399 x86_thread_state_3264.tsh.flavor = x86_THREAD_STATE32; | 399 x86_thread_state_3264.tsh.flavor = x86_THREAD_STATE32; |
400 x86_thread_state_3264.tsh.count = x86_THREAD_STATE32_COUNT; | 400 x86_thread_state_3264.tsh.count = x86_THREAD_STATE32_COUNT; |
401 | 401 |
402 CPUContextX86_64 cpu_context_x86_64 = {}; | 402 CPUContextX86_64 cpu_context_x86_64 = {}; |
403 internal::InitializeCPUContextX86_64( | 403 internal::InitializeCPUContextX86_64( |
404 &cpu_context_x86_64, | 404 &cpu_context_x86_64, |
405 x86_THREAD_STATE, | 405 x86_THREAD_STATE, |
406 reinterpret_cast<natural_t*>(&x86_thread_state_3264), | 406 reinterpret_cast<natural_t*>(&x86_thread_state_3264), |
407 x86_THREAD_STATE_COUNT, | 407 x86_THREAD_STATE_COUNT, |
408 &x86_thread_state64, | 408 &x86_thread_state64, |
409 &x86_float_state64, | 409 &x86_float_state64, |
410 &x86_debug_state64); | 410 &x86_debug_state64); |
411 EXPECT_EQ(10u, cpu_context_x86_64.rax); | 411 EXPECT_EQ(10u, cpu_context_x86_64.rax); |
412 EXPECT_EQ(11u, cpu_context_x86_64.fxsave64.ftw); | 412 EXPECT_EQ(11u, cpu_context_x86_64.fxsave.ftw); |
413 EXPECT_EQ(12u, cpu_context_x86_64.dr0); | 413 EXPECT_EQ(12u, cpu_context_x86_64.dr0); |
414 } | 414 } |
415 } | 415 } |
416 | 416 |
417 #endif | 417 #endif |
418 | 418 |
419 } // namespace | 419 } // namespace |
OLD | NEW |