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
25volatile 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
53int 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
62int 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 */
78char *codePCCache, *codeLRCache;
79
80void 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
93int 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