1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Copyright (C) 2009 The Android Open Source Project 3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * you may not use this file except in compliance with the License. 6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * You may obtain a copy of the License at 7ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * http://www.apache.org/licenses/LICENSE-2.0 9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Unless required by applicable law or agreed to in writing, software 11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distributed under the License is distributed on an "AS IS" BASIS, 12ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See the License for the specific language governing permissions and 14ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * limitations under the License. 15ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 17ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#include "../../CompilerInternals.h" 18df4daaf8f41e3dcaa8221f54273338160dd43138Dan Bornstein#include "libdex/DexOpcodes.h" 1989efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee#include "ArmLIR.h" 20ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 215d5b94c8d14b166af580d5dd5906db4f9527d6caCarl Shapirostatic const char *shiftNames[4] = { 2214f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee "lsl", 2314f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee "lsr", 2414f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee "asr", 2514f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee "ror"}; 2614f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee 27ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Decode and print a ARM register name */ 2818c990ebab4475335a5b94ac6077d3482b6875b9Ben Chengstatic char * decodeRegList(ArmOpcode opcode, int vector, char *buf) 29ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 30ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int i; 31ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bool printed = false; 32ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buf[0] = 0; 3318c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng for (i = 0; i < 16; i++, vector >>= 1) { 34ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (vector & 0x1) { 3518c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng int regId = i; 3618c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng if (opcode == kThumbPush && i == 8) { 3720d7e6c67af128d5bf7cc003564a8122c4101c84Ben Cheng regId = r14lr; 3818c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng } else if (opcode == kThumbPop && i == 8) { 3920d7e6c67af128d5bf7cc003564a8122c4101c84Ben Cheng regId = r15pc; 4018c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng } 41ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (printed) { 4218c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng sprintf(buf + strlen(buf), ", r%d", regId); 43ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 44ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng printed = true; 4518c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng sprintf(buf, "r%d", regId); 46ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 47ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 48ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 49ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng return buf; 50ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 51ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 527ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbeestatic int expandImmediate(int value) 537ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee{ 547ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee int mode = (value & 0xf00) >> 8; 557ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee u4 bits = value & 0xff; 567ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee switch(mode) { 577ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 0: 587ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return bits; 597ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 1: 607ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return (bits << 16) | bits; 617ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 2: 627ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return (bits << 24) | (bits << 8); 637ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 3: 647ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return (bits << 24) | (bits << 16) | (bits << 8) | bits; 657ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee default: 667ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee break; 677ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee } 687ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee bits = (bits | 0x80) << 24; 697ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return bits >> (((value & 0xf80) >> 7) - 8); 707ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee} 717ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee 72ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 73ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Interpret a format string and build a string no longer than size 74ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See format key in Assemble.c. 75ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 765d5b94c8d14b166af580d5dd5906db4f9527d6caCarl Shapirostatic void buildInsnString(const char *fmt, ArmLIR *lir, char* buf, 77ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng unsigned char *baseAddr, int size) 78ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 79ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int i; 80ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char *bufEnd = &buf[size-1]; 815d5b94c8d14b166af580d5dd5906db4f9527d6caCarl Shapiro const char *fmtEnd = &fmt[strlen(fmt)]; 82ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char tbuf[256]; 835d5b94c8d14b166af580d5dd5906db4f9527d6caCarl Shapiro const char *name; 84ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char nc; 85ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng while (fmt < fmtEnd) { 86ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int operand; 87ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (*fmt == '!') { 88ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng fmt++; 89ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng assert(fmt < fmtEnd); 90ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng nc = *fmt++; 91ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (nc=='!') { 92ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "!"); 93ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 94ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng assert(fmt < fmtEnd); 95270c1d64a192341be842f46734054c692bac061eBill Buzbee assert((unsigned)(nc-'0') < 4); 96ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng operand = lir->operands[nc-'0']; 97ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch(*fmt++) { 9814f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee case 'H': 9914f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee if (operand != 0) { 10014f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee sprintf(tbuf, ", %s %d",shiftNames[operand & 0x3], 10114f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee operand >> 2); 10214f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee } else { 10314f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee strcpy(tbuf,""); 10414f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee } 10514f711ba6ffea52d6000e7d442d01b684bbe7f97buzbee break; 106ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee case 'B': 107ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee switch (operand) { 108ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee case kSY: 109ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee name = "sy"; 110ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee break; 111ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee case kST: 112ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee name = "st"; 113ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee break; 114ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee case kISH: 115ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee name = "ish"; 116ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee break; 117ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee case kISHST: 118ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee name = "ishst"; 119ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee break; 120ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee case kNSH: 121ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee name = "nsh"; 122ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee break; 123ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee case kNSHST: 124ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee name = "shst"; 125ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee break; 126ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee default: 127ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee name = "DecodeError"; 128ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee break; 129ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee } 130ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee strcpy(tbuf, name); 131ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee break; 132a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee case 'b': 133a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf,"0000"); 134a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee for (i=3; i>= 0; i--) { 135a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee tbuf[i] += operand & 1; 136a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee operand >>= 1; 137a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee } 138a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee break; 139270c1d64a192341be842f46734054c692bac061eBill Buzbee case 'n': 140270c1d64a192341be842f46734054c692bac061eBill Buzbee operand = ~expandImmediate(operand); 141291c84f60853d30e1c0d79dd08c5e5164f588e26Dan Bornstein sprintf(tbuf,"%d [%#x]", operand, operand); 142270c1d64a192341be842f46734054c692bac061eBill Buzbee break; 1437ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 'm': 1447ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee operand = expandImmediate(operand); 145291c84f60853d30e1c0d79dd08c5e5164f588e26Dan Bornstein sprintf(tbuf,"%d [%#x]", operand, operand); 1467ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee break; 1479727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee case 's': 1489727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee sprintf(tbuf,"s%d",operand & FP_REG_MASK); 1499727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee break; 1509727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee case 'S': 1519727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee sprintf(tbuf,"d%d",(operand & FP_REG_MASK) >> 1); 1529727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee break; 153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'h': 154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%04x", operand); 155ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1567ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 'M': 157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'd': 158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand); 159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'E': 161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand*4); 162ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'F': 164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand*2); 165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'c': 167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch (operand) { 1681465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmCondEq: 169a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "eq"); 170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1711465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmCondNe: 172a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "ne"); 173ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1741465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmCondLt: 175a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "lt"); 176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1771465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmCondGe: 178a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "ge"); 179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1801465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmCondGt: 181a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "gt"); 182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1831465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmCondLe: 184a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "le"); 185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1861465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmCondCs: 187a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "cs"); 188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1891465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmCondMi: 190a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "mi"); 1917ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee break; 192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, ""); 194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 195ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 196ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 197ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 't': 198cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng sprintf(tbuf,"0x%08x (L%p)", 199ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng (int) baseAddr + lir->generic.offset + 4 + 200cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng (operand << 1), 201cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng lir->generic.target); 202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 203ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'u': { 204ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset_1 = lir->operands[0]; 205ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset_2 = NEXT_LIR(lir)->operands[0]; 206ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng intptr_t target = 207ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((((intptr_t) baseAddr + lir->generic.offset + 4) & 208ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ~3) + (offset_1 << 21 >> 9) + (offset_2 << 1)) & 209ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 0xfffffffc; 210ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf, "%p", (void *) target); 211ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 212ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 213ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Nothing to print for BLX_2 */ 215ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'v': 216ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "see above"); 217ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 218ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'R': 21918c990ebab4475335a5b94ac6077d3482b6875b9Ben Cheng decodeRegList(lir->opcode, operand, tbuf); 220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf,"DecodeError"); 223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 225ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (buf+strlen(tbuf) <= bufEnd) { 226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(buf, tbuf); 227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buf += strlen(tbuf); 228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 233ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *buf++ = *fmt++; 234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (buf == bufEnd) 236ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *buf = 0; 239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 240ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 241d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Chengvoid dvmDumpResourceMask(LIR *lir, u8 mask, const char *prefix) 242d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng{ 243d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng char buf[256]; 244d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng buf[0] = 0; 245d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng ArmLIR *armLIR = (ArmLIR *) lir; 246d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng 247d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng if (mask == ENCODE_ALL) { 248d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng strcpy(buf, "all"); 249d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } else { 250d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng char num[8]; 251d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng int i; 252d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng 253d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng for (i = 0; i < kRegEnd; i++) { 254d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng if (mask & (1ULL << i)) { 255d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng sprintf(num, "%d ", i); 256d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng strcat(buf, num); 257d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } 258d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } 259d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng 260d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng if (mask & ENCODE_CCODE) { 261d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng strcat(buf, "cc "); 262d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } 263d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng if (mask & ENCODE_FP_STATUS) { 264d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng strcat(buf, "fpcc "); 265d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } 2667ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng 2677ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng /* Memory bits */ 268d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng if (armLIR && (mask & ENCODE_DALVIK_REG)) { 269d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng sprintf(buf + strlen(buf), "dr%d%s", armLIR->aliasInfo & 0xffff, 270d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng (armLIR->aliasInfo & 0x80000000) ? "(+1)" : ""); 271d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } 2727ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng if (mask & ENCODE_LITERAL) { 2737ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng strcat(buf, "lit "); 2747ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng } 2757ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng 2767ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng if (mask & ENCODE_HEAP_REF) { 2777ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng strcat(buf, "heap "); 2787ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng } 2797ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng if (mask & ENCODE_MUST_NOT_ALIAS) { 2807ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng strcat(buf, "noalias "); 2817ab74e14ed8dac0e51ce72fc6283ee2f1ffdf087Ben Cheng } 282d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } 283d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng if (buf[0]) { 284062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("%s: %s", prefix, buf); 285d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } 286d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng} 287d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng 288d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng/* 289d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng * Debugging macros 290d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng */ 291d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng#define DUMP_RESOURCE_MASK(X) 292d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng#define DUMP_SSA_REP(X) 293d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng 294ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Pretty-print a LIR instruction */ 295d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Chengvoid dvmDumpLIRInsn(LIR *arg, unsigned char *baseAddr) 296ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 29789efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee ArmLIR *lir = (ArmLIR *) arg; 298ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char buf[256]; 299ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char opName[256]; 300ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset = lir->generic.offset; 301ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int dest = lir->operands[0]; 302d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng const bool dumpNop = false; 303d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng 304ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Handle pseudo-ops individually, and all regular insns as a group */ 3059a1f81699cc05b58378ffb9aadb4e97677943791Dan Bornstein switch(lir->opcode) { 306cec26f6ae3347d5ab3d60de02caca2e47151c6b2Ben Cheng case kArmChainingCellBottom: 307062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- end of chaining cells (0x%04x)", offset); 308cec26f6ae3347d5ab3d60de02caca2e47151c6b2Ben Cheng break; 3091465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmPseudoBarrier: 310062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- BARRIER"); 311dcf3e5d43a1831a166f70cb9e0694cd4b0b356b0Ben Cheng break; 3121465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmPseudoExtended: 313062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- %s", (char *) dest); 3147a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng break; 3151465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmPseudoSSARep: 31660fc806b679a3655c228b4093058c59941a49cfeDan Bornstein DUMP_SSA_REP(LOGD("-------- %s", (char *) dest)); 3174238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng break; 318a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoChainingCellBackwardBranch: 319062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("L%p:", lir); 320062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- chaining cell (backward branch): 0x%04x", dest); 3214238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng break; 322a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoChainingCellNormal: 323062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("L%p:", lir); 324062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- chaining cell (normal): 0x%04x", dest); 325ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 326a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoChainingCellHot: 327062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("L%p:", lir); 328062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- chaining cell (hot): 0x%04x", dest); 329ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 330a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoChainingCellInvokePredicted: 331062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("L%p:", lir); 332062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- chaining cell (predicted): %s%s", 3330451704c192aeaa2a2ff6c9f835afc092ad6b98eBen Cheng dest ? ((Method *) dest)->clazz->descriptor : "", 3340451704c192aeaa2a2ff6c9f835afc092ad6b98eBen Cheng dest ? ((Method *) dest)->name : "N/A"); 33538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng break; 336a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoChainingCellInvokeSingleton: 337062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("L%p:", lir); 338062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- chaining cell (invoke singleton): %s%s/%p", 3390451704c192aeaa2a2ff6c9f835afc092ad6b98eBen Cheng ((Method *)dest)->clazz->descriptor, 340ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->name, 341ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->insns); 342ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 343a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoEntryBlock: 344062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- entry offset: 0x%04x", dest); 34597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao break; 346a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoDalvikByteCodeBoundary: 347062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- dalvik offset: 0x%04x @ %s", dest, 348ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng (char *) lir->operands[1]); 349ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 350a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoExitBlock: 351062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- exit offset: 0x%04x", dest); 3524238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng break; 3531465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmPseudoPseudoAlign4: 354062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("%p (%04x): .align4", baseAddr + offset, offset); 355ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 356a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoPCReconstructionCell: 357062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("L%p:", lir); 358062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x", dest, 359ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng lir->operands[1]); 360ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 361a497359afa1abe4c5780c8799c6fe0edab551c2dBen Cheng case kArmPseudoPCReconstructionBlockLabel: 362ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Do nothing */ 363ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 3641465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmPseudoEHBlockLabel: 365062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("Exception_Handling:"); 366ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 367cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng case kArmPseudoTargetLabel: 3681465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee case kArmPseudoNormalBlockLabel: 369062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("L%p:", lir); 370ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 371ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 372d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng if (lir->flags.isNop && !dumpNop) { 373e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng break; 374e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng } 3759a1f81699cc05b58378ffb9aadb4e97677943791Dan Bornstein buildInsnString(EncodingMap[lir->opcode].name, lir, opName, 376ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng baseAddr, 256); 3779a1f81699cc05b58378ffb9aadb4e97677943791Dan Bornstein buildInsnString(EncodingMap[lir->opcode].fmt, lir, buf, baseAddr, 378ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 256); 379062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("%p (%04x): %-8s%s%s", 380d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng baseAddr + offset, offset, opName, buf, 381d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng lir->flags.isNop ? "(nop)" : ""); 382ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 383ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 384d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng 385d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng if (lir->useMask && (!lir->flags.isNop || dumpNop)) { 386d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng DUMP_RESOURCE_MASK(dvmDumpResourceMask((LIR *) lir, 387d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng lir->useMask, "use")); 388d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } 389d72564ca7aa66c6d95b6ca34299258b65ecfd1cbBen Cheng if (lir->defMask && (!lir->flags.isNop || dumpNop)) { 390d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng DUMP_RESOURCE_MASK(dvmDumpResourceMask((LIR *) lir, 391d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng lir->defMask, "def")); 392d7d426a1d746f70edeaeccf77886f3ad8298e28cBen Cheng } 393ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 394ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 395ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Dump instructions and constant pool contents */ 396ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengvoid dvmCompilerCodegenDump(CompilationUnit *cUnit) 397ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 398062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("Dumping LIR insns"); 399ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LIR *lirInsn; 40089efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee ArmLIR *armLIR; 401ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 402062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("installed code is at %p", cUnit->baseAddr); 403062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("total size is %d bytes", cUnit->totalSize); 404ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (lirInsn = cUnit->firstLIRInsn; lirInsn; lirInsn = lirInsn->next) { 405fc75f3ed87b55d625b6054e18645da5cbdba31c6Carl Shapiro dvmDumpLIRInsn(lirInsn, (unsigned char *) cUnit->baseAddr); 406ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 407385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng for (lirInsn = cUnit->classPointerList; lirInsn; lirInsn = lirInsn->next) { 408385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng armLIR = (ArmLIR *) lirInsn; 409062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("%p (%04x): .class (%s)", 410385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng (char*)cUnit->baseAddr + armLIR->generic.offset, 411385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng armLIR->generic.offset, 412385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng ((CallsiteInfo *) armLIR->operands[0])->classDescriptor); 413385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng } 414385828e36ea70effe9aa18a954d008b1f7dc1d63Ben Cheng for (lirInsn = cUnit->literalList; lirInsn; lirInsn = lirInsn->next) { 41589efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee armLIR = (ArmLIR *) lirInsn; 416062bf509a77fce9dfcb7e7b2e401cf2a124d83d5Steve Block ALOGD("%p (%04x): .word (%#x)", 417dcf3e5d43a1831a166f70cb9e0694cd4b0b356b0Ben Cheng (char*)cUnit->baseAddr + armLIR->generic.offset, 418dcf3e5d43a1831a166f70cb9e0694cd4b0b356b0Ben Cheng armLIR->generic.offset, 419ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng armLIR->operands[0]); 420ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 421ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 42213fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee 42313fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee/* Target-specific cache flushing */ 4240c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chenvoid dvmCompilerCacheFlush(long start, long end, long flags) 42513fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee{ 4260c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen cacheflush(start, end, flags); 42713fbc2e4bfa04cce8e181ac37d7f2b13a54aa037buzbee} 428a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 429a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Target-specific cache clearing */ 430a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmCompilerCacheClear(char *start, size_t size) 431a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 43260497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng /* 43360497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng * de is an invalid opcode for arm. 43460497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng * From gdb disassembly: <UNDEFINED> instruction: 0xdede 43560497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng */ 43660497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng 43760497bbcee68d98b2bdcb3fb64682b00d61b942dBen Cheng memset(start, 0xde, size); 438a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 439