1800b99b8Sopenharmony_ci/*
2800b99b8Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3800b99b8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4800b99b8Sopenharmony_ci * you may not use this file except in compliance with the License.
5800b99b8Sopenharmony_ci * You may obtain a copy of the License at
6800b99b8Sopenharmony_ci *
7800b99b8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8800b99b8Sopenharmony_ci *
9800b99b8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10800b99b8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11800b99b8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12800b99b8Sopenharmony_ci * See the License for the specific language governing permissions and
13800b99b8Sopenharmony_ci * limitations under the License.
14800b99b8Sopenharmony_ci */
15800b99b8Sopenharmony_ci
16800b99b8Sopenharmony_ci#include "dfx_crasher.h"
17800b99b8Sopenharmony_ci
18800b99b8Sopenharmony_ci#include <pthread.h>
19800b99b8Sopenharmony_ci#include <signal.h>
20800b99b8Sopenharmony_ci#include <sys/mman.h>
21800b99b8Sopenharmony_ci#include <sys/prctl.h>
22800b99b8Sopenharmony_ci#include <sys/resource.h>
23800b99b8Sopenharmony_ci#include <unistd.h>
24800b99b8Sopenharmony_ci#include "errno.h"
25800b99b8Sopenharmony_ci#include "hilog/log.h"
26800b99b8Sopenharmony_ci#include "inttypes.h"
27800b99b8Sopenharmony_ci#include "stdio.h"
28800b99b8Sopenharmony_ci#include "stdlib.h"
29800b99b8Sopenharmony_ci#include "string.h"
30800b99b8Sopenharmony_ci#include "strings.h"
31800b99b8Sopenharmony_ci#include "dfx_define.h"
32800b99b8Sopenharmony_ci
33800b99b8Sopenharmony_ci#ifdef LOG_DOMAIN
34800b99b8Sopenharmony_ci#undef LOG_DOMAIN
35800b99b8Sopenharmony_ci#define LOG_DOMAIN 0xD002D11
36800b99b8Sopenharmony_ci#endif
37800b99b8Sopenharmony_ci
38800b99b8Sopenharmony_ci#ifdef LOG_TAG
39800b99b8Sopenharmony_ci#undef LOG_TAG
40800b99b8Sopenharmony_ci#define LOG_TAG "Unwind"
41800b99b8Sopenharmony_ci#endif
42800b99b8Sopenharmony_ci
43800b99b8Sopenharmony_cistatic const int ARG1024 = 1024;
44800b99b8Sopenharmony_cistatic const int ARG128 = 128;
45800b99b8Sopenharmony_ci
46800b99b8Sopenharmony_ciNOINLINE int TriggerTrapException(void)
47800b99b8Sopenharmony_ci{
48800b99b8Sopenharmony_ci#ifndef __x86_64__
49800b99b8Sopenharmony_ci    __asm__ volatile(".inst 0xde01");
50800b99b8Sopenharmony_ci#endif
51800b99b8Sopenharmony_ci    return 0;
52800b99b8Sopenharmony_ci}
53800b99b8Sopenharmony_ci
54800b99b8Sopenharmony_ciNOINLINE int RaiseAbort(void)
55800b99b8Sopenharmony_ci{
56800b99b8Sopenharmony_ci    HILOG_FATAL(LOG_CORE, "Test Trigger ABORT!");
57800b99b8Sopenharmony_ci    int ret = raise(SIGABRT);
58800b99b8Sopenharmony_ci    if (ret != 0) {
59800b99b8Sopenharmony_ci        printf("raise failed!");
60800b99b8Sopenharmony_ci    }
61800b99b8Sopenharmony_ci    return 0;
62800b99b8Sopenharmony_ci}
63800b99b8Sopenharmony_ciNOINLINE int Abort(void)
64800b99b8Sopenharmony_ci{
65800b99b8Sopenharmony_ci    HILOG_FATAL(LOG_CORE, "Test Trigger ABORT!");
66800b99b8Sopenharmony_ci    abort();
67800b99b8Sopenharmony_ci    return 0;
68800b99b8Sopenharmony_ci}
69800b99b8Sopenharmony_ci
70800b99b8Sopenharmony_ciNOINLINE int RaiseBusError(void)
71800b99b8Sopenharmony_ci{
72800b99b8Sopenharmony_ci    int ret = raise(SIGBUS);
73800b99b8Sopenharmony_ci    if (ret != 0) {
74800b99b8Sopenharmony_ci        printf("remove failed!");
75800b99b8Sopenharmony_ci    }
76800b99b8Sopenharmony_ci    return 0;
77800b99b8Sopenharmony_ci}
78800b99b8Sopenharmony_ci
79800b99b8Sopenharmony_ciNOINLINE int RaiseFloatingPointException(void)
80800b99b8Sopenharmony_ci{
81800b99b8Sopenharmony_ci    int ret = raise(SIGFPE);
82800b99b8Sopenharmony_ci    if (ret != 0) {
83800b99b8Sopenharmony_ci        printf("remove failed!");
84800b99b8Sopenharmony_ci    }
85800b99b8Sopenharmony_ci    return 0;
86800b99b8Sopenharmony_ci}
87800b99b8Sopenharmony_ci
88800b99b8Sopenharmony_ciNOINLINE int RaiseIllegalInstructionException(void)
89800b99b8Sopenharmony_ci{
90800b99b8Sopenharmony_ci    int ret = raise(SIGILL);
91800b99b8Sopenharmony_ci    if (ret != 0) {
92800b99b8Sopenharmony_ci        printf("ramove failed!");
93800b99b8Sopenharmony_ci    }
94800b99b8Sopenharmony_ci    return 0;
95800b99b8Sopenharmony_ci}
96800b99b8Sopenharmony_ci
97800b99b8Sopenharmony_ciNOINLINE int IllegalInstructionException(void)
98800b99b8Sopenharmony_ci{
99800b99b8Sopenharmony_ci#if defined(__aarch64__)
100800b99b8Sopenharmony_ci    __asm__ volatile(".word 0\n");
101800b99b8Sopenharmony_ci#elif defined(__arm__)
102800b99b8Sopenharmony_ci    __asm__ volatile(".word 0xe7f0def0\n");
103800b99b8Sopenharmony_ci#elif defined(__x86_64__)
104800b99b8Sopenharmony_ci    __asm__ volatile("ud2\n");
105800b99b8Sopenharmony_ci#else
106800b99b8Sopenharmony_ci#error
107800b99b8Sopenharmony_ci#endif
108800b99b8Sopenharmony_ci    return 0;
109800b99b8Sopenharmony_ci}
110800b99b8Sopenharmony_ci
111800b99b8Sopenharmony_ciNOINLINE int RaiseSegmentFaultException(void)
112800b99b8Sopenharmony_ci{
113800b99b8Sopenharmony_ci    printf("call RaiseSegmentFaultException \n");
114800b99b8Sopenharmony_ci    int ret = raise(SIGSEGV);
115800b99b8Sopenharmony_ci    if (ret != 0) {
116800b99b8Sopenharmony_ci        printf("remove failed!");
117800b99b8Sopenharmony_ci    }
118800b99b8Sopenharmony_ci    return 0;
119800b99b8Sopenharmony_ci}
120800b99b8Sopenharmony_ci
121800b99b8Sopenharmony_ciNOINLINE int SegmentFaultException(void)
122800b99b8Sopenharmony_ci{
123800b99b8Sopenharmony_ci    volatile char *ptr = NULL;
124800b99b8Sopenharmony_ci    *ptr;
125800b99b8Sopenharmony_ci
126800b99b8Sopenharmony_ci    return 0;
127800b99b8Sopenharmony_ci}
128800b99b8Sopenharmony_ci
129800b99b8Sopenharmony_ciNOINLINE int RaiseTrapException(void)
130800b99b8Sopenharmony_ci{
131800b99b8Sopenharmony_ci    int ret = raise(SIGTRAP);
132800b99b8Sopenharmony_ci    if (ret != 0) {
133800b99b8Sopenharmony_ci        printf("remove failed!");
134800b99b8Sopenharmony_ci    }
135800b99b8Sopenharmony_ci    return 0;
136800b99b8Sopenharmony_ci}
137800b99b8Sopenharmony_ci
138800b99b8Sopenharmony_ciNOINLINE int TrapException(void)
139800b99b8Sopenharmony_ci{
140800b99b8Sopenharmony_ci    return 0;
141800b99b8Sopenharmony_ci}
142800b99b8Sopenharmony_ci
143800b99b8Sopenharmony_ciNOINLINE int MaxStackDepth(void)
144800b99b8Sopenharmony_ci{
145800b99b8Sopenharmony_ci    return TestFunc1();
146800b99b8Sopenharmony_ci}
147800b99b8Sopenharmony_ci
148800b99b8Sopenharmony_ciNOINLINE int MaxMethodNameTest12345678901234567890123456789012345678901234567890ABC(void)
149800b99b8Sopenharmony_ci{
150800b99b8Sopenharmony_ci    printf("call MaxMethodNameTest12345678901234567890123456789012345678901234567890ABC \n");
151800b99b8Sopenharmony_ci    int ret = raise(SIGSEGV);
152800b99b8Sopenharmony_ci    if (ret != 0) {
153800b99b8Sopenharmony_ci        printf("remove failed!");
154800b99b8Sopenharmony_ci    }
155800b99b8Sopenharmony_ci    return 0;
156800b99b8Sopenharmony_ci}
157800b99b8Sopenharmony_ci
158800b99b8Sopenharmony_ciNOINLINE int StackOverflow(void)
159800b99b8Sopenharmony_ci{
160800b99b8Sopenharmony_ci    printf("call StackOverflow\n");
161800b99b8Sopenharmony_ci
162800b99b8Sopenharmony_ci    // for stack overflow test
163800b99b8Sopenharmony_ci    char a[1024][1024][1024] = { { {'1'} } };
164800b99b8Sopenharmony_ci    char b[1024][1024][1024] = { { {'1'} } };
165800b99b8Sopenharmony_ci    char c[1024][1024][1024] = { { {'1'} } };
166800b99b8Sopenharmony_ci    char d[1024][1024][1024] = { { {'1'} } };
167800b99b8Sopenharmony_ci    printf("a[0][0] is %s\n", a[0][0]);
168800b99b8Sopenharmony_ci    printf("b[0][0] is %s\n", b[0][0]);
169800b99b8Sopenharmony_ci    printf("c[0][0] is %s\n", c[0][0]);
170800b99b8Sopenharmony_ci    printf("d[0][0] is %s\n", d[0][0]);
171800b99b8Sopenharmony_ci
172800b99b8Sopenharmony_ci    return 0;
173800b99b8Sopenharmony_ci}
174800b99b8Sopenharmony_ci
175800b99b8Sopenharmony_ciNOINLINE int Oom(void)
176800b99b8Sopenharmony_ci{
177800b99b8Sopenharmony_ci    struct rlimit oldRlimit;
178800b99b8Sopenharmony_ci    if (getrlimit(RLIMIT_AS, &oldRlimit) != 0) {
179800b99b8Sopenharmony_ci        printf("getrlimit failed\n");
180800b99b8Sopenharmony_ci        raise(SIGINT);
181800b99b8Sopenharmony_ci    }
182800b99b8Sopenharmony_ci    printf("old rlimit, cur:0x%016" PRIx64 " max:0x%016" PRIx64 "\n",
183800b99b8Sopenharmony_ci        (uint64_t)oldRlimit.rlim_cur, (uint64_t)oldRlimit.rlim_max);
184800b99b8Sopenharmony_ci
185800b99b8Sopenharmony_ci    struct rlimit rlim = {
186800b99b8Sopenharmony_ci        .rlim_cur = (ARG128 - 1) * ARG1024 * ARG1024,
187800b99b8Sopenharmony_ci        .rlim_max = (ARG128 - 1) * ARG1024 * ARG1024,
188800b99b8Sopenharmony_ci    };
189800b99b8Sopenharmony_ci
190800b99b8Sopenharmony_ci    if (setrlimit(RLIMIT_AS, &rlim) != 0) {
191800b99b8Sopenharmony_ci        printf("setrlimit failed\n");
192800b99b8Sopenharmony_ci        raise(SIGINT);
193800b99b8Sopenharmony_ci    }
194800b99b8Sopenharmony_ci    char* bufferArray[ARG128];
195800b99b8Sopenharmony_ci    for (int i = 0; i < ARG128; i++) {
196800b99b8Sopenharmony_ci        char* buf = (char*)mmap(NULL, (ARG1024 * ARG1024), PROT_READ | PROT_WRITE,
197800b99b8Sopenharmony_ci                                MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
198800b99b8Sopenharmony_ci        if (buf == (char*)MAP_FAILED) {
199800b99b8Sopenharmony_ci            printf("malloc return null\n");
200800b99b8Sopenharmony_ci            if (setrlimit(RLIMIT_AS, &oldRlimit) != 0) {
201800b99b8Sopenharmony_ci                printf("restore rlimit failed\n");
202800b99b8Sopenharmony_ci            }
203800b99b8Sopenharmony_ci            printf("restore rlimit ok\n");
204800b99b8Sopenharmony_ci            abort();
205800b99b8Sopenharmony_ci        }
206800b99b8Sopenharmony_ci        bufferArray[i] = buf;
207800b99b8Sopenharmony_ci    }
208800b99b8Sopenharmony_ci    for (int i = 0; i < ARG128; i++) {
209800b99b8Sopenharmony_ci        printf("0x%x", *(bufferArray[i] + 1));
210800b99b8Sopenharmony_ci    }
211800b99b8Sopenharmony_ci
212800b99b8Sopenharmony_ci    return 0;
213800b99b8Sopenharmony_ci}
214800b99b8Sopenharmony_ci
215800b99b8Sopenharmony_cistatic NOINLINE int ProgramCounterZero(void)
216800b99b8Sopenharmony_ci{
217800b99b8Sopenharmony_ci    printf("test PCZero");
218800b99b8Sopenharmony_ci#if defined(__arm__)
219800b99b8Sopenharmony_ci    __asm__ volatile (
220800b99b8Sopenharmony_ci        "mov r0, #0x00\n mov lr, pc\n bx r0\n"
221800b99b8Sopenharmony_ci    );
222800b99b8Sopenharmony_ci#elif defined(__aarch64__)
223800b99b8Sopenharmony_ci    __asm__ volatile (
224800b99b8Sopenharmony_ci        "movz x0, #0x0\n"
225800b99b8Sopenharmony_ci        "adr x30, .\n"
226800b99b8Sopenharmony_ci        "br x0\n"
227800b99b8Sopenharmony_ci    );
228800b99b8Sopenharmony_ci#endif
229800b99b8Sopenharmony_ci    return 0;
230800b99b8Sopenharmony_ci}
231800b99b8Sopenharmony_ci
232800b99b8Sopenharmony_ciNOINLINE int MultiThreadCrash(void)
233800b99b8Sopenharmony_ci{
234800b99b8Sopenharmony_ci    printf("test MultiThreadCrash");
235800b99b8Sopenharmony_ci
236800b99b8Sopenharmony_ci    pthread_t t[2];
237800b99b8Sopenharmony_ci    int threadID[2] = {1, 2};
238800b99b8Sopenharmony_ci    pthread_create(&t[0], NULL, SleepThread, &threadID[0]);
239800b99b8Sopenharmony_ci    pthread_create(&t[1], NULL, SleepThread, &threadID[1]);
240800b99b8Sopenharmony_ci    pthread_detach(t[0]);
241800b99b8Sopenharmony_ci    pthread_detach(t[1]);
242800b99b8Sopenharmony_ci    sleep(1);
243800b99b8Sopenharmony_ci
244800b99b8Sopenharmony_ci    int ret = raise(SIGSEGV);
245800b99b8Sopenharmony_ci    if (ret != 0) {
246800b99b8Sopenharmony_ci        printf("remove failed!");
247800b99b8Sopenharmony_ci    }
248800b99b8Sopenharmony_ci
249800b99b8Sopenharmony_ci    return 0;
250800b99b8Sopenharmony_ci}
251800b99b8Sopenharmony_ci
252800b99b8Sopenharmony_ciNOINLINE int StackOver64(void)
253800b99b8Sopenharmony_ci{
254800b99b8Sopenharmony_ci    printf("test StackOver64");
255800b99b8Sopenharmony_ci
256800b99b8Sopenharmony_ci    return TestFunc1();
257800b99b8Sopenharmony_ci}
258800b99b8Sopenharmony_ci
259800b99b8Sopenharmony_civoid *SleepThread(void *argv)
260800b99b8Sopenharmony_ci{
261800b99b8Sopenharmony_ci    int threadID = *(int*)argv;
262800b99b8Sopenharmony_ci    printf("create MultiThread %d", threadID);
263800b99b8Sopenharmony_ci
264800b99b8Sopenharmony_ci    int sleepTime = 10;
265800b99b8Sopenharmony_ci    sleep(sleepTime);
266800b99b8Sopenharmony_ci
267800b99b8Sopenharmony_ci    return 0;
268800b99b8Sopenharmony_ci}
269800b99b8Sopenharmony_ci
270800b99b8Sopenharmony_ciNOINLINE int StackTop(void)
271800b99b8Sopenharmony_ci{
272800b99b8Sopenharmony_ci    printf("test StackTop\n");
273800b99b8Sopenharmony_ci    register void* stackTop;
274800b99b8Sopenharmony_ci#if defined(__arm__)
275800b99b8Sopenharmony_ci    __asm__ volatile ("mov %0, sp":"=r"(stackTop)::);
276800b99b8Sopenharmony_ci    printf("crasher_c: stack top is = %08x\n", (unsigned int)stackTop);
277800b99b8Sopenharmony_ci#elif defined(__aarch64__)
278800b99b8Sopenharmony_ci    __asm__ volatile ("mov %0, sp":"=r"(stackTop)::);
279800b99b8Sopenharmony_ci    printf("crasher_c: stack top is = %16llx\n", (unsigned long long)stackTop);
280800b99b8Sopenharmony_ci#else
281800b99b8Sopenharmony_ci    return 0;
282800b99b8Sopenharmony_ci#endif
283800b99b8Sopenharmony_ci
284800b99b8Sopenharmony_ci    FILE *fp = NULL;
285800b99b8Sopenharmony_ci    fp = fopen("/data/sp", "w");
286800b99b8Sopenharmony_ci    if (fp == NULL) {
287800b99b8Sopenharmony_ci        printf("Open /data/sp failed, errno(%d)\n", errno);
288800b99b8Sopenharmony_ci        return 0;
289800b99b8Sopenharmony_ci    }
290800b99b8Sopenharmony_ci
291800b99b8Sopenharmony_ci    int ret = 0; // for fixing compile error on x64
292800b99b8Sopenharmony_ci#if defined(__arm__)
293800b99b8Sopenharmony_ci    ret = fprintf(fp, "%08x", (unsigned int)stackTop);
294800b99b8Sopenharmony_ci#elif defined(__aarch64__)
295800b99b8Sopenharmony_ci    ret = fprintf(fp, "%16llx", (unsigned long long)stackTop);
296800b99b8Sopenharmony_ci#endif
297800b99b8Sopenharmony_ci    if (ret == EOF) {
298800b99b8Sopenharmony_ci        printf("error!");
299800b99b8Sopenharmony_ci    }
300800b99b8Sopenharmony_ci    ret = fclose(fp);
301800b99b8Sopenharmony_ci    if (ret == EOF) {
302800b99b8Sopenharmony_ci        printf("close error!");
303800b99b8Sopenharmony_ci    }
304800b99b8Sopenharmony_ci
305800b99b8Sopenharmony_ci#if defined(__arm__)
306800b99b8Sopenharmony_ci    __asm__ volatile ("mov r1, #0\nldr r2, [r1]\n");
307800b99b8Sopenharmony_ci#elif defined(__aarch64__)
308800b99b8Sopenharmony_ci    __asm__ volatile ("mov x1, #0\nldr x2, [x1]\n");
309800b99b8Sopenharmony_ci#endif
310800b99b8Sopenharmony_ci    return ret;
311800b99b8Sopenharmony_ci}
312800b99b8Sopenharmony_ci
313800b99b8Sopenharmony_civoid PrintUsage(void)
314800b99b8Sopenharmony_ci{
315800b99b8Sopenharmony_ci    printf("  usage: crasher CMD\n");
316800b99b8Sopenharmony_ci    printf("\n");
317800b99b8Sopenharmony_ci    printf("  where CMD support:\n");
318800b99b8Sopenharmony_ci    printf("  SIGFPE                raise a SIGFPE\n");
319800b99b8Sopenharmony_ci    printf("  SIGILL                raise a SIGILL\n");
320800b99b8Sopenharmony_ci    printf("  SIGSEGV               raise a SIGSEGV\n");
321800b99b8Sopenharmony_ci    printf("  SIGTRAP               raise a SIGTRAP\n");
322800b99b8Sopenharmony_ci    printf("  SIGABRT               raise a SIGABRT\n");
323800b99b8Sopenharmony_ci    printf("  SIGBUS                raise a SIGBUS\n");
324800b99b8Sopenharmony_ci
325800b99b8Sopenharmony_ci    printf("  triSIGILL             trigger a SIGILL\n");
326800b99b8Sopenharmony_ci    printf("  triSIGSEGV            trigger a SIGSEGV\n");
327800b99b8Sopenharmony_ci    printf("  triSIGTRAP            trigger a SIGTRAP\n");
328800b99b8Sopenharmony_ci    printf("  triSIGABRT            trigger a SIGABRT\n");
329800b99b8Sopenharmony_ci
330800b99b8Sopenharmony_ci    printf("  Loop                  trigger a ForeverLoop\n");
331800b99b8Sopenharmony_ci    printf("  MaxStack              trigger SIGSEGV after 64 function call\n");
332800b99b8Sopenharmony_ci    printf("  MaxMethod             trigger SIGSEGV after call a function with longer name\n");
333800b99b8Sopenharmony_ci    printf("  OOM                   trigger out of memory\n");
334800b99b8Sopenharmony_ci    printf("  STACKOF               trigger a stack overflow\n");
335800b99b8Sopenharmony_ci    printf("  PCZero                trigger pc = 0\n");
336800b99b8Sopenharmony_ci    printf("  MTCrash               trigger crash with multi-thread\n");
337800b99b8Sopenharmony_ci    printf("  StackOver64           trigger SIGSEGV after 70 function call\n");
338800b99b8Sopenharmony_ci    printf("  StackTop              trigger SIGSEGV to make sure stack top\n");
339800b99b8Sopenharmony_ci    printf("  if you want the command execute in a sub thread\n");
340800b99b8Sopenharmony_ci    printf("  add thread Prefix, e.g crasher thread-SIGFPE\n");
341800b99b8Sopenharmony_ci    printf("\n");
342800b99b8Sopenharmony_ci}
343800b99b8Sopenharmony_ci
344800b99b8Sopenharmony_civoid *DoCrashInThread(void *inputArg)
345800b99b8Sopenharmony_ci{
346800b99b8Sopenharmony_ci    prctl(PR_SET_NAME, "SubTestThread");
347800b99b8Sopenharmony_ci    const char *arg = (const char *)(inputArg);
348800b99b8Sopenharmony_ci    return (void *)((uint64_t)(ParseAndDoCrash(arg)));
349800b99b8Sopenharmony_ci}
350800b99b8Sopenharmony_ci
351800b99b8Sopenharmony_ciuint64_t DoActionOnSubThread(const char *arg)
352800b99b8Sopenharmony_ci{
353800b99b8Sopenharmony_ci    pthread_t t;
354800b99b8Sopenharmony_ci    pthread_create(&t, NULL, DoCrashInThread, (char *)(arg));
355800b99b8Sopenharmony_ci    void *result = NULL;
356800b99b8Sopenharmony_ci    pthread_join(t, &result);
357800b99b8Sopenharmony_ci    return (uint64_t)(result);
358800b99b8Sopenharmony_ci}
359800b99b8Sopenharmony_ci
360800b99b8Sopenharmony_ciuint64_t ParseAndDoCrash(const char *arg)
361800b99b8Sopenharmony_ci{
362800b99b8Sopenharmony_ci    // Prefix
363800b99b8Sopenharmony_ci    if (!strncmp(arg, "thread-", strlen("thread-"))) {
364800b99b8Sopenharmony_ci        return DoActionOnSubThread(arg + strlen("thread-"));
365800b99b8Sopenharmony_ci    }
366800b99b8Sopenharmony_ci
367800b99b8Sopenharmony_ci    // Action
368800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "SIGFPE")) {
369800b99b8Sopenharmony_ci        return RaiseFloatingPointException();
370800b99b8Sopenharmony_ci    }
371800b99b8Sopenharmony_ci
372800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "SIGILL")) {
373800b99b8Sopenharmony_ci        return RaiseIllegalInstructionException();
374800b99b8Sopenharmony_ci    }
375800b99b8Sopenharmony_ci
376800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "triSIGILL")) {
377800b99b8Sopenharmony_ci        return IllegalInstructionException();
378800b99b8Sopenharmony_ci    }
379800b99b8Sopenharmony_ci
380800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "SIGSEGV")) {
381800b99b8Sopenharmony_ci        return RaiseSegmentFaultException();
382800b99b8Sopenharmony_ci    }
383800b99b8Sopenharmony_ci
384800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "SIGTRAP")) {
385800b99b8Sopenharmony_ci        return RaiseTrapException();
386800b99b8Sopenharmony_ci    }
387800b99b8Sopenharmony_ci
388800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "SIGABRT")) {
389800b99b8Sopenharmony_ci        return RaiseAbort();
390800b99b8Sopenharmony_ci    }
391800b99b8Sopenharmony_ci
392800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "triSIGABRT")) {
393800b99b8Sopenharmony_ci        return Abort();
394800b99b8Sopenharmony_ci    }
395800b99b8Sopenharmony_ci
396800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "triSIGSEGV")) {
397800b99b8Sopenharmony_ci        return SegmentFaultException();
398800b99b8Sopenharmony_ci    }
399800b99b8Sopenharmony_ci
400800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "SIGBUS")) {
401800b99b8Sopenharmony_ci        return RaiseBusError();
402800b99b8Sopenharmony_ci    }
403800b99b8Sopenharmony_ci
404800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "triSIGTRAP")) {
405800b99b8Sopenharmony_ci        return TriggerTrapException();
406800b99b8Sopenharmony_ci    }
407800b99b8Sopenharmony_ci
408800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "Loop")) {
409800b99b8Sopenharmony_ci        int i = 0;
410800b99b8Sopenharmony_ci        while (1) {
411800b99b8Sopenharmony_ci            usleep(10000); // 10000:sleep 0.01 second
412800b99b8Sopenharmony_ci            i++;
413800b99b8Sopenharmony_ci        }
414800b99b8Sopenharmony_ci    }
415800b99b8Sopenharmony_ci
416800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "MaxStack")) {
417800b99b8Sopenharmony_ci        return MaxStackDepth();
418800b99b8Sopenharmony_ci    }
419800b99b8Sopenharmony_ci
420800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "MaxMethod")) {
421800b99b8Sopenharmony_ci        return MaxMethodNameTest12345678901234567890123456789012345678901234567890ABC();
422800b99b8Sopenharmony_ci    }
423800b99b8Sopenharmony_ci
424800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "STACKOF")) {
425800b99b8Sopenharmony_ci        return StackOverflow();
426800b99b8Sopenharmony_ci    }
427800b99b8Sopenharmony_ci
428800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "OOM")) {
429800b99b8Sopenharmony_ci        return Oom();
430800b99b8Sopenharmony_ci    }
431800b99b8Sopenharmony_ci
432800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "PCZero")) {
433800b99b8Sopenharmony_ci        return ProgramCounterZero();
434800b99b8Sopenharmony_ci    }
435800b99b8Sopenharmony_ci
436800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "MTCrash")) {
437800b99b8Sopenharmony_ci        return MultiThreadCrash();
438800b99b8Sopenharmony_ci    }
439800b99b8Sopenharmony_ci
440800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "StackOver64")) {
441800b99b8Sopenharmony_ci        return StackOver64();
442800b99b8Sopenharmony_ci    }
443800b99b8Sopenharmony_ci
444800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "StackTop")) {
445800b99b8Sopenharmony_ci        return StackTop();
446800b99b8Sopenharmony_ci    }
447800b99b8Sopenharmony_ci
448800b99b8Sopenharmony_ci    if (!strcasecmp(arg, "CrashTest")) {
449800b99b8Sopenharmony_ci        return CrashTest();
450800b99b8Sopenharmony_ci    }
451800b99b8Sopenharmony_ci
452800b99b8Sopenharmony_ci    return 0;
453800b99b8Sopenharmony_ci}
454800b99b8Sopenharmony_ci
455800b99b8Sopenharmony_ciNOINLINE int TestFunc70(void)
456800b99b8Sopenharmony_ci{
457800b99b8Sopenharmony_ci    int ret = raise(SIGSEGV);
458800b99b8Sopenharmony_ci    if (ret != 0) {
459800b99b8Sopenharmony_ci        printf("raise failed!");
460800b99b8Sopenharmony_ci    }
461800b99b8Sopenharmony_ci    return 0;
462800b99b8Sopenharmony_ci}
463800b99b8Sopenharmony_ci
464800b99b8Sopenharmony_ciNOINLINE int CrashTest(void)
465800b99b8Sopenharmony_ci{
466800b99b8Sopenharmony_ci    int sleepTime = 3;
467800b99b8Sopenharmony_ci    sleep(sleepTime);
468800b99b8Sopenharmony_ci    int ret = raise(SIGSEGV);
469800b99b8Sopenharmony_ci    if (ret != 0) {
470800b99b8Sopenharmony_ci        printf("raise failed!");
471800b99b8Sopenharmony_ci    }
472800b99b8Sopenharmony_ci    return 0;
473800b99b8Sopenharmony_ci}
474800b99b8Sopenharmony_ci
475800b99b8Sopenharmony_ciint main(int argc, char *argv[])
476800b99b8Sopenharmony_ci{
477800b99b8Sopenharmony_ci    PrintUsage();
478800b99b8Sopenharmony_ci    if (argc <= 1) {
479800b99b8Sopenharmony_ci        printf("wrong usage!");
480800b99b8Sopenharmony_ci        PrintUsage();
481800b99b8Sopenharmony_ci        return 0;
482800b99b8Sopenharmony_ci    }
483800b99b8Sopenharmony_ci
484800b99b8Sopenharmony_ci    printf("ParseAndDoCrash done: %" PRIu64 "!\n", ParseAndDoCrash(argv[1]));
485800b99b8Sopenharmony_ci    return 0;
486800b99b8Sopenharmony_ci}
487800b99b8Sopenharmony_ci
488800b99b8Sopenharmony_ci// auto gen function
489800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(0, 1)
490800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(1, 2)
491800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(2, 3)
492800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(3, 4)
493800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(4, 5)
494800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(5, 6)
495800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(6, 7)
496800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(7, 8)
497800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(8, 9)
498800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(9, 10)
499800b99b8Sopenharmony_ci
500800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(10, 11)
501800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(11, 12)
502800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(12, 13)
503800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(13, 14)
504800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(14, 15)
505800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(15, 16)
506800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(16, 17)
507800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(17, 18)
508800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(18, 19)
509800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(19, 20)
510800b99b8Sopenharmony_ci
511800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(20, 21)
512800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(21, 22)
513800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(22, 23)
514800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(23, 24)
515800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(24, 25)
516800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(25, 26)
517800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(26, 27)
518800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(27, 28)
519800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(28, 29)
520800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(29, 30)
521800b99b8Sopenharmony_ci
522800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(30, 31)
523800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(31, 32)
524800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(32, 33)
525800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(33, 34)
526800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(34, 35)
527800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(35, 36)
528800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(36, 37)
529800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(37, 38)
530800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(38, 39)
531800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(39, 40)
532800b99b8Sopenharmony_ci
533800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(40, 41)
534800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(41, 42)
535800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(42, 43)
536800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(43, 44)
537800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(44, 45)
538800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(45, 46)
539800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(46, 47)
540800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(47, 48)
541800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(48, 49)
542800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(49, 50)
543800b99b8Sopenharmony_ci
544800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(50, 51)
545800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(51, 52)
546800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(52, 53)
547800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(53, 54)
548800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(54, 55)
549800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(55, 56)
550800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(56, 57)
551800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(57, 58)
552800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(58, 59)
553800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(59, 60)
554800b99b8Sopenharmony_ci
555800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(60, 61)
556800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(61, 62)
557800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(62, 63)
558800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(63, 64)
559800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(64, 65)
560800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(65, 66)
561800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(66, 67)
562800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(67, 68)
563800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(68, 69)
564800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(69, 70)
565