Adjust MD_CONTEXT_CPU_MASK to reflect reality, fix some code so it can handle dumps using the old value for MD_CONTEXT_ARM
The value of MD_CONTEXT_CPU_MASK in use assumes that only the lower 6 bits are used for flags, and the upper 26 bits are for the CPU type. However, as of Windows 7 SP1, the 7th bit is being used as a flag (per http://msdn.microsoft.com/en-us/library/hh134238%28v=vs.85%29.aspx and the Windows SDK headers). Adjusting MD_CONTEXT_CPU_MASK works, but unfortunately that masks off the existing value of MD_CONTEXT_ARM. This patch also changes the value of MD_CONTEXT_ARM and adjusts the minidump context reading machinery to gracefully handle minidumps with the old value. R=mark at http://breakpad.appspot.com/302001 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@831 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
8ade75f955
commit
1a1890a52a
10 changed files with 658 additions and 42 deletions
|
@ -410,6 +410,17 @@ bool MinidumpContext::Read(u_int32_t expected_size) {
|
|||
Swap(&context_flags);
|
||||
|
||||
u_int32_t cpu_type = context_flags & MD_CONTEXT_CPU_MASK;
|
||||
if (cpu_type == 0) {
|
||||
// Unfortunately the flag for MD_CONTEXT_ARM that was taken
|
||||
// from a Windows CE SDK header conflicts in practice with
|
||||
// the CONTEXT_XSTATE flag. MD_CONTEXT_ARM has been renumbered,
|
||||
// but handle dumps with the legacy value gracefully here.
|
||||
if (context_flags & MD_CONTEXT_ARM_OLD) {
|
||||
context_flags |= MD_CONTEXT_ARM;
|
||||
context_flags &= ~MD_CONTEXT_ARM_OLD;
|
||||
cpu_type = MD_CONTEXT_ARM;
|
||||
}
|
||||
}
|
||||
|
||||
// Allocate the context structure for the correct CPU and fill it. The
|
||||
// casts are slightly unorthodox, but it seems better to do that than to
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue