116aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin/*
216aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin * Copyright 2014 The Android Open Source Project
316aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin *
416aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin * Licensed under the Apache License, Version 2.0 (the "License");
516aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin * you may not use this file except in compliance with the License.
616aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin * You may obtain a copy of the License at
716aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin *
816aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin *      http://www.apache.org/licenses/LICENSE-2.0
916aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin *
1016aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin * Unless required by applicable law or agreed to in writing, software
1116aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin * distributed under the License is distributed on an "AS IS" BASIS,
1216aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1316aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin * See the License for the specific language governing permissions and
1416aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin * limitations under the License.
1516aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin */
1616aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin
1716aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin#include <dumpstate.h>
18d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin#include <errno.h>
19d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin#include <fcntl.h>
20d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin#include <stdlib.h>
21d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin#include <stdio.h>
22d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin
23d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjinstatic const char base64[] =
24d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
25d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjinstatic const char pad64 = '=';
26d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin
27d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjinstatic void base64_output3(const unsigned char *src, int len)
28d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin{
29d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    printf("%c", base64[src[0] >> 2]);
30d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    printf("%c", base64[((src[0] & 0x03) << 4) | (src[1] >> 4)]);
31d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    if (len == 1) {
32d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        printf("==");
33d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        return;
34d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    }
35d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    printf("%c", base64[((src[1] & 0x0F) << 2) | (src[2] >> 6)]);
36d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    if (len == 2) {
37d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        printf("=");
38d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        return;
39d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    }
40d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    printf("%c", base64[src[2] & 0x3F]);
41d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin}
42d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin
43d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjinstatic void fugu_dump_base64(const char *path)
44d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin{
45d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin
46d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    printf("------ (%s) ------\n", path);
47d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    int fd = open(path, O_RDONLY | O_CLOEXEC | O_NOFOLLOW);
48d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    if (fd < 0) {
49d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        printf("*** %s: %s\n\n", path, strerror(errno));
50d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        return;
51d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    }
52d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin
53d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    /* buffer size multiple of 3 for ease of use */
54d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    unsigned char buffer[1200];
55d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    int left = 0;
56d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    int count = 0;
57d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    for (;;) {
58d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        int ret = read(fd, &buffer[left], sizeof(buffer) - left);
59d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        if (ret <= 0) {
60d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin            break;
61d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        }
62d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        left += ret;
63d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        int ofs = 0;
64d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        while (left > 2) {
65d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin            base64_output3(&buffer[ofs], 3);
66d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin            left -= 3;
67d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin            ofs += 3;
68d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin            count += 4;
69d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin            if (count > 72) {
70d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin                printf("\n");
71d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin                count = 0;
72d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin            }
73d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        }
74d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        if (left) {
75d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin            memmove(buffer, &buffer[ofs], left);
76d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        }
77d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    }
78d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    close(fd);
79d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin
80d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    if (!left) {
81d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        printf("\n------ end ------\n");
82d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        return;
83d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    }
84d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin
85d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    /* finish padding */
86d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    count = left;
87d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    while (count < 3) {
88d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin        buffer[count++] = 0;
89d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    }
90d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    base64_output3(buffer, left);
91d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin
92d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    printf("\n------ end ------\n");
93d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin}
9416aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin
9516aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjinvoid dumpstate_board()
9616aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin{
9716aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin    dump_file("INTERRUPTS", "/proc/interrupts");
9816aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin    dump_file("last ipanic_console", "/data/dontpanic/ipanic_console");
9916aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin    dump_file("last ipanic_threads", "/data/dontpanic/ipanic_threads");
100d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    fugu_dump_base64("/dev/snd_atvr_mSBC");
101d78e01fd056ec085850d0f54059bf2733be4f838Patrick Tjin    fugu_dump_base64("/dev/snd_atvr_pcm");
10216aebd4948cc6a7fabb8ee7e10e8038387c69195Patrick Tjin};
103