Home | History | Annotate | Download | only in gdbjithelper
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <unistd.h>
     18 #include <stdio.h>
     19 #include <malloc.h>
     20 #include <string.h>
     21 
     22 /* Currently debuggerd dumps 20 words each around PC and LR */
     23 #define NUM_DUMPED_WORDS 20
     24 
     25 volatile int done;
     26 
     27 /*
     28  * See README.txt for detailed steps.
     29  *
     30  * If you see a native crash in the bugreport and the PC/LR are
     31  * pointing to the code cache address range, copy them into the following
     32  * arrays.
     33  *
     34  *        #00  pc 463ba204
     35  *        #01  lr 463ba1c9  <unknown>
     36  *
     37  * code around pc:
     38  * 463ba1e4 4300e119 4284aa7a f927f7b7 40112268
     39  * 463ba1f4 419da7f8 00002000 01000100 00080000
     40  * 463ba204 4191debc 01010000 4284aa74 68b00054
     41  * 463ba214 045cf205 cc016468 0718f2a5 d0102800
     42  * 463ba224 4c13c701 a20aa108 efb0f775 e008e010
     43  *
     44  * code around lr:
     45  * 463ba1a8 42e19e58 f2050050 cc01045c 0718f2a5
     46  * 463ba1b8 d00f2800 4c13c701 a20aa108 efe4f775
     47  * 463ba1c8 e007e010 29006bf8 6e77dc01 a10347b8
     48  * 463ba1d8 ef60f775 6db1480b 1c2d4788 4300e119
     49  * 463ba1e8 4284aa7a f927f7b7 40112268 419da7f8
     50  *
     51  */
     52 
     53 int codePC[] = {
     54     // Sample content
     55     0x4300e119, 0x4284aa7a, 0xf927f7b7, 0x40112268,
     56     0x419da7f8, 0x00002000, 0x01000100, 0x00080000,
     57     0x4191debc, 0x01010000, 0x4284aa74, 0x68b00054,
     58     0x045cf205, 0xcc016468, 0x0718f2a5, 0xd0102800,
     59     0x4c13c701, 0xa20aa108, 0xefb0f775, 0xe008e010,
     60 };
     61 
     62 int codeLR[] = {
     63     // Sample content
     64     0x42e19e58, 0xf2050050, 0xcc01045c, 0x0718f2a5,
     65     0xd00f2800, 0x4c13c701, 0xa20aa108, 0xefe4f775,
     66     0xe007e010, 0x29006bf8, 0x6e77dc01, 0xa10347b8,
     67     0xef60f775, 0x6db1480b, 0x1c2d4788, 0x4300e119,
     68     0x4284aa7a, 0xf927f7b7, 0x40112268, 0x419da7f8,
     69 };
     70 
     71 /* For example: 463ba1e4 & 0xfff */
     72 #define START_PC_PAGE_OFFSET 0x1e4
     73 
     74 /* For example: 463ba1a8 & 0xfff */
     75 #define START_LR_PAGE_OFFSET 0x1a8
     76 
     77 /* Each points to a two-page buffer */
     78 char *codePCCache, *codeLRCache;
     79 
     80 void dumpCode(int *pc, int *lr)
     81 {
     82     unsigned int i;
     83 
     84     for (i = 0; i < NUM_DUMPED_WORDS; i++) {
     85         printf("%p codePC[%d]: %#010x\n", pc + i, i, pc[i]);
     86     }
     87 
     88     for (i = 0; i < NUM_DUMPED_WORDS; i++) {
     89         printf("%p codeLR[%d]: %#010x\n", lr + i, i, lr[i]);
     90     }
     91 }
     92 
     93 int main()
     94 {
     95     codePCCache = memalign(4096, 8192);
     96     codeLRCache = memalign(4096, 8192);
     97 
     98     memcpy(codePCCache + START_PC_PAGE_OFFSET, codePC, 4 * NUM_DUMPED_WORDS);
     99     memcpy(codeLRCache + START_LR_PAGE_OFFSET, codeLR, 4 * NUM_DUMPED_WORDS);
    100 
    101     dumpCode((int *) (codePCCache + START_PC_PAGE_OFFSET),
    102              (int *) (codeLRCache + START_LR_PAGE_OFFSET));
    103 
    104     while (!done) {
    105         sleep(1000);
    106     }
    107     return 0;
    108 }
    109