/* * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. * * This document is the property of Apple Computer, Inc. * It is considered confidential and proprietary. * * This document may not be reproduced or transmitted in any form, * in whole or in part, without the express written permission of * Apple Computer, Inc. */ #include #include #include #include #if defined(WITH_MENU) && WITH_MENU /* "md", "mdh", "mdb" */ int do_memdump(int argc, struct cmd_arg *args) { addr_t address; size_t count; int width; size_t i; /* default dump values */ static addr_t last_address = 0; static size_t last_count = 0x100; address = last_address; count = last_count; if (!strcmp(args[0].str, "md")) { width = 32; } else if (!strcmp(args[0].str, "mdh")) { width = 16; } else { width = 8; } if (argc >= 2) address = args[1].u; if (argc >= 3) count = args[2].u; // printf("dumping memory at 0x%x, len 0x%x, width %d\n", address, count, width); i = 0; while (i < count) { if ((i % 16) == 0) { if (i != 0) puts("\n"); printf("%p: ", (void *)(address + i)); } switch (width) { case 32: printf("%08x ", *(uint32_t *)(address + i)); if ( 4 == (i & 0xf)) printf(" "); i += 4; break; case 16: printf("%04x ", *(uint16_t *)(address + i)); if ( 6 == (i & 0xf)) printf(" "); i += 2; break; case 8: printf("%02x ", *(uint8_t *)(address + i)); if ( 7 == (i & 0xf)) printf(" "); i += 1; break; } } puts("\n"); /* save the values so we can continue next time */ last_count = count; last_address = address + count; return 0; } MENU_COMMAND_DEBUG(md, do_memdump, "memory display - 32bit", NULL); MENU_COMMAND_DEBUG(mdh, do_memdump, "memory display - 16bit", NULL); MENU_COMMAND_DEBUG(mdb, do_memdump, "memory display - 8bit", NULL); /* "mw", "mwh", "mwb", "mws" */ int do_memwrite(int argc, struct cmd_arg *args) { static addr_t last_address = ~0UL; addr_t address; size_t length; uint32_t data; const char *buffer; int width; switch (argc) { case 2: if (~0UL == last_address) { printf("%s - need an address\n", args[0].str); return -1; } address = last_address; data = args[1].u; buffer = args[1].str; break; case 3: address = args[1].u; last_address = address; data = args[2].u; buffer = args[2].str; break; default: printf("%s [
] \n", args[0].str); return -1; } if (!strcmp(args[0].str, "mw")) { width = 32; length = 4; } else if (!strcmp(args[0].str, "mwh")) { width = 16; length = 2; } else if (!strcmp(args[0].str, "mwb")) { width = 8; length = 1; } else { width = 255; length = strlen(buffer) + 1; } // printf("writing memory at 0x%x, data 0x%x\n", address, data); switch (width) { case 32: *(uint32_t *)address = data; break; case 16: *(uint16_t *)address = data; break; case 8: *(uint8_t *)address = data; break; case 255: strlcpy((char *)address, buffer, length); break; } return 0; } MENU_COMMAND_DEBUG(mw, do_memwrite, "memory write - 32bit", NULL); MENU_COMMAND_DEBUG(mwh, do_memwrite, "memory write - 16bit", NULL); MENU_COMMAND_DEBUG(mwb, do_memwrite, "memory write - 8bit", NULL); MENU_COMMAND_DEBUG(mws, do_memwrite, "memory write - string", NULL); int do_panic(int argc, struct cmd_arg *args) { panic("command prompt"); } MENU_COMMAND_DEBUG(panic, do_panic, "...", NULL); int do_hang(int argc, struct cmd_arg *args) { for (;;) ; return(0); } MENU_COMMAND_DEBUG(hang, do_hang, "spin forever, hanging the system", NULL); #endif