Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: src/trusted/debug_stub/target.cc

Issue 10896004: Don't modify memory access right when changing data in debug stub. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 6
7 #include <string.h> 7 #include <string.h>
8 #include <stdlib.h> 8 #include <stdlib.h>
9 #include <stdio.h> 9 #include <stdio.h>
10 10
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 if (itr != breakMap_.end()) return false; 90 if (itr != breakMap_.end()) return false;
91 91
92 uint8_t *data = new uint8_t[bp->size_]; 92 uint8_t *data = new uint8_t[bp->size_];
93 if (NULL == data) return false; 93 if (NULL == data) return false;
94 94
95 // Copy the old code from here 95 // Copy the old code from here
96 if (IPlatform::GetMemory(address, bp->size_, data) == false) { 96 if (IPlatform::GetMemory(address, bp->size_, data) == false) {
97 delete[] data; 97 delete[] data;
98 return false; 98 return false;
99 } 99 }
100 if (IPlatform::SetMemory(address, bp->size_, bp->code_) == false) { 100 if (IPlatform::SetMemory(nap_, address, bp->size_, bp->code_) == false) {
101 delete[] data; 101 delete[] data;
102 return false; 102 return false;
103 } 103 }
104 104
105 breakMap_[address] = data; 105 breakMap_[address] = data;
106 return true; 106 return true;
107 } 107 }
108 108
109 bool Target::RemoveTemporaryBreakpoints(IThread *thread) { 109 bool Target::RemoveTemporaryBreakpoints(IThread *thread) {
110 const Abi::BPDef *bp_def = abi_->GetBreakpointDef(); 110 const Abi::BPDef *bp_def = abi_->GetBreakpointDef();
111 uintptr_t prog_ctr = thread->GetContext()->prog_ctr; 111 uintptr_t prog_ctr = thread->GetContext()->prog_ctr;
112 112
113 // If this ABI does not support breakpoints then fail. 113 // If this ABI does not support breakpoints then fail.
114 if (!bp_def) { 114 if (!bp_def) {
115 return false; 115 return false;
116 } 116 }
117 117
118 // Iterate through the map, removing breakpoints 118 // Iterate through the map, removing breakpoints
119 while (!breakMap_.empty()) { 119 while (!breakMap_.empty()) {
120 // Copy the key/value locally 120 // Copy the key/value locally
121 BreakMap_t::iterator cur = breakMap_.begin(); 121 BreakMap_t::iterator cur = breakMap_.begin();
122 uint64_t addr = cur->first; 122 uint64_t addr = cur->first;
123 uint8_t *data = cur->second; 123 uint8_t *data = cur->second;
124 124
125 // Then remove it from the map 125 // Then remove it from the map
126 breakMap_.erase(cur); 126 breakMap_.erase(cur);
127 127
128 // Copy back the old code, and free the data 128 // Copy back the old code, and free the data
129 if (!IPlatform::SetMemory(addr, bp_def->size_, data)) 129 if (!IPlatform::SetMemory(nap_, addr, bp_def->size_, data))
130 NaClLog(LOG_ERROR, "Failed to undo breakpoint.\n"); 130 NaClLog(LOG_ERROR, "Failed to undo breakpoint.\n");
131 delete[] data; 131 delete[] data;
132 132
133 uintptr_t sys_prog_ctr; 133 uintptr_t sys_prog_ctr;
134 if (NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86 && NACL_BUILD_SUBARCH == 32) { 134 if (NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86 && NACL_BUILD_SUBARCH == 32) {
135 sys_prog_ctr = NaClUserToSysAddr(nap_, prog_ctr); 135 sys_prog_ctr = NaClUserToSysAddr(nap_, prog_ctr);
136 } else { 136 } else {
137 sys_prog_ctr = prog_ctr; 137 sys_prog_ctr = prog_ctr;
138 } 138 }
139 // If we hit the breakpoint, ensure that it is reported as SIGTRAP 139 // If we hit the breakpoint, ensure that it is reported as SIGTRAP
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 uint64_t sys_addr = UserToSysAddr(user_addr); 483 uint64_t sys_addr = UserToSysAddr(user_addr);
484 if (sys_addr == kNaClBadAddress) { 484 if (sys_addr == kNaClBadAddress) {
485 err = FAILED; 485 err = FAILED;
486 break; 486 break;
487 } 487 }
488 488
489 len = static_cast<uint32_t>(wlen); 489 len = static_cast<uint32_t>(wlen);
490 uint8_t *block = new uint8_t[len]; 490 uint8_t *block = new uint8_t[len];
491 pktIn->GetBlock(block, len); 491 pktIn->GetBlock(block, len);
492 492
493 if (!port::IPlatform::SetMemory(sys_addr, len, block)) { 493 if (!port::IPlatform::SetMemory(nap_, sys_addr, len, block)) {
494 err = FAILED; 494 err = FAILED;
495 break; 495 break;
496 } 496 }
497 497
498 pktOut->AddString("OK"); 498 pktOut->AddString("OK");
499 break; 499 break;
500 } 500 }
501 501
502 case 'q': { 502 case 'q': {
503 string tmp; 503 string tmp;
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 IThread* Target::GetThread(uint32_t id) { 758 IThread* Target::GetThread(uint32_t id) {
759 ThreadMap_t::const_iterator itr; 759 ThreadMap_t::const_iterator itr;
760 itr = threads_.find(id); 760 itr = threads_.find(id);
761 if (itr != threads_.end()) return itr->second; 761 if (itr != threads_.end()) return itr->second;
762 762
763 return NULL; 763 return NULL;
764 } 764 }
765 765
766 766
767 } // namespace gdb_rsp 767 } // namespace gdb_rsp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698