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