| /* |
| * linux/arch/m68k/tools/amiga/dmesg.c -- Retrieve the kernel messages stored |
| * in Chip RAM with the kernel command |
| * line option `debug=mem'. |
| * |
| * © Copyright 1996 by Geert Uytterhoeven <geert@linux-m68k.org> |
| * |
| * |
| * Usage: |
| * |
| * dmesg |
| * dmesg <CHIPMEM_END> |
| * |
| * |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file COPYING in the main directory of the Linux |
| * distribution for more details. |
| */ |
| |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| |
| |
| #define CHIPMEM_START 0x00000000 |
| #define CHIPMEM_END 0x00200000 /* overridden by argv[1] */ |
| |
| #define SAVEKMSG_MAGIC1 0x53415645 /* 'SAVE' */ |
| #define SAVEKMSG_MAGIC2 0x4B4D5347 /* 'KMSG' */ |
| |
| struct savekmsg { |
| u_long magic1; /* SAVEKMSG_MAGIC1 */ |
| u_long magic2; /* SAVEKMSG_MAGIC2 */ |
| u_long magicptr; /* address of magic1 */ |
| u_long size; |
| char data[]; |
| }; |
| |
| |
| int main(int argc, char *argv[]) |
| { |
| u_long start = CHIPMEM_START, end = CHIPMEM_END, p; |
| int found = 0; |
| struct savekmsg *m = NULL; |
| |
| if (argc >= 2) |
| end = strtoul(argv[1], NULL, 0); |
| printf("Searching for SAVEKMSG magic...\n"); |
| for (p = start; p <= end-sizeof(struct savekmsg); p += 4) { |
| m = (struct savekmsg *)p; |
| if ((m->magic1 == SAVEKMSG_MAGIC1) && (m->magic2 == SAVEKMSG_MAGIC2) && |
| (m->magicptr == p)) { |
| found = 1; |
| break; |
| } |
| } |
| if (!found) |
| printf("Not found\n"); |
| else { |
| printf("Found %ld bytes at 0x%08lx\n", m->size, (u_long)&m->data); |
| puts(">>>>>>>>>>>>>>>>>>>>"); |
| fflush(stdout); |
| write(1, &m->data, m->size); |
| fflush(stdout); |
| puts("<<<<<<<<<<<<<<<<<<<<"); |
| } |
| return(0); |
| } |