Home | History | Annotate | Line # | Download | only in boot
      1  1.11  dholland /*	$NetBSD: monitor.c,v 1.11 2016/06/11 06:28:49 dholland Exp $	*/
      2   1.1  sakamoto 
      3   1.1  sakamoto /*-
      4   1.1  sakamoto  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
      5   1.1  sakamoto  * All rights reserved.
      6   1.1  sakamoto  *
      7   1.1  sakamoto  * This code is derived from software contributed to The NetBSD Foundation
      8   1.1  sakamoto  * by Kazuki Sakamoto.
      9   1.1  sakamoto  *
     10   1.1  sakamoto  * Redistribution and use in source and binary forms, with or without
     11   1.1  sakamoto  * modification, are permitted provided that the following conditions
     12   1.1  sakamoto  * are met:
     13   1.1  sakamoto  * 1. Redistributions of source code must retain the above copyright
     14   1.1  sakamoto  *    notice, this list of conditions and the following disclaimer.
     15   1.1  sakamoto  * 2. Redistributions in binary form must reproduce the above copyright
     16   1.1  sakamoto  *    notice, this list of conditions and the following disclaimer in the
     17   1.1  sakamoto  *    documentation and/or other materials provided with the distribution.
     18   1.1  sakamoto  *
     19   1.1  sakamoto  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20   1.1  sakamoto  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21   1.1  sakamoto  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22   1.1  sakamoto  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23   1.1  sakamoto  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24   1.1  sakamoto  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25   1.1  sakamoto  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26   1.1  sakamoto  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27   1.1  sakamoto  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28   1.1  sakamoto  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29   1.1  sakamoto  * POSSIBILITY OF SUCH DAMAGE.
     30   1.1  sakamoto  */
     31   1.1  sakamoto 
     32   1.5  junyoung #include <lib/libsa/stand.h>
     33   1.9  kiyohara #include <lib/libkern/libkern.h>
     34   1.9  kiyohara 
     35   1.9  kiyohara #include "boot.h"
     36   1.1  sakamoto 
     37   1.1  sakamoto extern int errno;
     38   1.1  sakamoto extern char *name;
     39   1.1  sakamoto 
     40   1.4  junyoung void db_cmd_dump(int, char **);
     41   1.4  junyoung void db_cmd_get(int, char **);
     42   1.4  junyoung void db_cmd_mf(int, char **);
     43   1.4  junyoung void db_cmd_mt(int, char **);
     44   1.4  junyoung void db_cmd_put(int, char **);
     45   1.4  junyoung void db_cmd_help(int, char **);
     46   1.3  sakamoto 
     47  1.10       phx uint32_t db_atob(char *);
     48   1.1  sakamoto 
     49   1.1  sakamoto struct {
     50   1.1  sakamoto 	char *name;
     51   1.1  sakamoto 	void (*fcn)(int, char **);
     52   1.1  sakamoto } db_cmd[] = {
     53   1.1  sakamoto 	{ "dump",	db_cmd_dump },
     54   1.1  sakamoto 	{ "get",	db_cmd_get },
     55   1.1  sakamoto 	{ "mf",		db_cmd_mf },
     56   1.1  sakamoto 	{ "mt",		db_cmd_mt },
     57   1.1  sakamoto 	{ "put",	db_cmd_put },
     58   1.1  sakamoto 	{ "help",	db_cmd_help },
     59   1.1  sakamoto 	{ NULL,		NULL },
     60   1.1  sakamoto };
     61   1.1  sakamoto 
     62   1.1  sakamoto int
     63   1.4  junyoung db_monitor(void)
     64   1.1  sakamoto {
     65   1.1  sakamoto 	int tmp;
     66   1.1  sakamoto 	int argc, flag;
     67   1.1  sakamoto 	char *p, *argv[16];
     68   1.1  sakamoto 	char line[1024];
     69   1.1  sakamoto 
     70   1.4  junyoung 	while (1) {
     71   1.1  sakamoto 		printf("db> ");
     72  1.11  dholland 		kgets(line, sizeof(line));
     73   1.1  sakamoto 
     74   1.1  sakamoto 		flag = 0;
     75   1.4  junyoung 		for (p = line, argc = 0; *p != '\0'; p++) {
     76   1.1  sakamoto 			if (*p != ' ' && *p != '\t') {
     77   1.1  sakamoto 				if (!flag) {
     78   1.1  sakamoto 					flag++;
     79   1.1  sakamoto 					argv[argc++] = p;
     80   1.1  sakamoto 				}
     81   1.1  sakamoto 			} else {
     82   1.1  sakamoto 				if (flag) {
     83   1.1  sakamoto 					*p = '\0';
     84   1.1  sakamoto 					flag = 0;
     85   1.1  sakamoto 				}
     86   1.1  sakamoto 			}
     87   1.1  sakamoto 		}
     88   1.1  sakamoto 
     89   1.1  sakamoto 		if (argc == 0)
     90   1.1  sakamoto 			continue;
     91   1.1  sakamoto 
     92   1.1  sakamoto 		tmp = 0;
     93   1.1  sakamoto 		while (db_cmd[tmp].name != NULL) {
     94   1.1  sakamoto 			if (!strcmp("continue", argv[0]))
     95   1.1  sakamoto 				return 0;
     96   1.1  sakamoto 			if (!strcmp(db_cmd[tmp].name, argv[0])) {
     97   1.1  sakamoto 				(db_cmd[tmp].fcn)(argc, argv);
     98   1.1  sakamoto 				break;
     99   1.1  sakamoto 			}
    100   1.1  sakamoto 			tmp++;
    101   1.1  sakamoto 		}
    102   1.1  sakamoto 		if (db_cmd[tmp].name == NULL)
    103   1.1  sakamoto 			db_cmd_help(argc, argv);
    104   1.1  sakamoto 	}
    105   1.1  sakamoto 	return 0;
    106   1.1  sakamoto }
    107   1.1  sakamoto 
    108  1.10       phx uint32_t
    109   1.4  junyoung db_atob(char *p)
    110   1.1  sakamoto {
    111  1.10       phx 	uint32_t b = 0;
    112  1.10       phx 	int width, tmp, exp, x = 0;
    113   1.4  junyoung 
    114   1.1  sakamoto 	if (p[1] == 'x') {
    115   1.1  sakamoto 		p += 2;
    116   1.1  sakamoto 		x = 1;
    117   1.1  sakamoto 	}
    118   1.1  sakamoto 	width = strlen(p);
    119   1.4  junyoung 	while (width--) {
    120   1.1  sakamoto 		exp = 1;
    121   1.1  sakamoto 		for (tmp = 1; tmp <= width; tmp++)
    122   1.1  sakamoto 			exp *= (x ? 16 : 10);
    123   1.1  sakamoto 		if (*p >= '0' && *p <= '9') {
    124   1.1  sakamoto 			tmp = *p - '0';
    125   1.1  sakamoto 		} else {
    126   1.1  sakamoto 			tmp = *p - 'a' + 10;
    127   1.1  sakamoto 		}
    128   1.1  sakamoto 		b += tmp * exp;
    129   1.1  sakamoto 		p++;
    130   1.1  sakamoto 	}
    131   1.1  sakamoto 	return b;
    132   1.1  sakamoto }
    133   1.1  sakamoto 
    134   1.1  sakamoto void
    135   1.4  junyoung db_cmd_dump(int argc, char **argv)
    136   1.1  sakamoto {
    137   1.1  sakamoto 	char *p, *r, *pp;
    138  1.10       phx 	int mode, size, i;
    139  1.10       phx 	uint32_t add;
    140   1.1  sakamoto 
    141   1.1  sakamoto 	switch (argc) {
    142   1.1  sakamoto 	case 4:
    143   1.1  sakamoto 		r = argv[1];
    144   1.1  sakamoto 		switch (r[1]) {
    145   1.1  sakamoto 		case 'b':
    146   1.1  sakamoto 			mode = 1;
    147   1.1  sakamoto 			break;
    148   1.1  sakamoto 		case 'h':
    149   1.1  sakamoto 			mode = 2;
    150   1.1  sakamoto 			break;
    151   1.1  sakamoto 		case 'w':
    152   1.1  sakamoto 			mode = 4;
    153   1.1  sakamoto 			break;
    154   1.1  sakamoto 		default:
    155   1.1  sakamoto 			goto out;
    156   1.1  sakamoto 		}
    157   1.1  sakamoto 		p = argv[2];
    158   1.1  sakamoto 		pp = argv[3];
    159   1.1  sakamoto 		break;
    160   1.1  sakamoto 	case 3:
    161   1.1  sakamoto 		mode = 4;
    162   1.1  sakamoto 		p = argv[1];
    163   1.1  sakamoto 		pp = argv[2];
    164   1.1  sakamoto 		break;
    165   1.1  sakamoto 	default:
    166   1.1  sakamoto 		goto out;
    167   1.1  sakamoto 	}
    168   1.1  sakamoto 
    169   1.1  sakamoto 	add = db_atob(p);
    170   1.1  sakamoto 	size = db_atob(pp);
    171   1.1  sakamoto 	i = 0;
    172   1.1  sakamoto 	for (; size > 0;) {
    173   1.1  sakamoto 		if (!i)
    174   1.1  sakamoto 			printf("\n0x%x:", add);
    175   1.1  sakamoto 		switch (mode) {
    176   1.1  sakamoto 		case 1:
    177  1.10       phx 			printf(" %x", *(uint8_t *)add);
    178   1.1  sakamoto 			add += 1;
    179   1.1  sakamoto 			size -= 1;
    180   1.1  sakamoto 			if (++i == 16)
    181   1.1  sakamoto 				i = 0;
    182   1.1  sakamoto 			break;
    183   1.1  sakamoto 		case 2:
    184  1.10       phx 			printf(" %x", *(uint16_t *)add);
    185   1.1  sakamoto 			add += 2;
    186   1.1  sakamoto 			size -= 2;
    187   1.1  sakamoto 			if (++i == 8)
    188   1.1  sakamoto 				i = 0;
    189   1.1  sakamoto 			break;
    190   1.1  sakamoto 		case 4:
    191  1.10       phx 			printf(" %x", *(uint32_t *)add);
    192   1.1  sakamoto 			add += 4;
    193   1.1  sakamoto 			size -= 4;
    194   1.1  sakamoto 			if (++i == 4)
    195   1.1  sakamoto 				i = 0;
    196   1.1  sakamoto 			break;
    197   1.1  sakamoto 		}
    198   1.1  sakamoto 	}
    199   1.1  sakamoto 	printf("\n");
    200   1.1  sakamoto 	return;
    201   1.1  sakamoto 
    202   1.4  junyoung out:
    203   1.1  sakamoto 	printf("dump [-b][-h][-w] address size\n");
    204   1.1  sakamoto 	return;
    205   1.1  sakamoto }
    206   1.1  sakamoto 
    207   1.1  sakamoto void
    208   1.4  junyoung db_cmd_get(int argc, char **argv)
    209   1.1  sakamoto {
    210   1.1  sakamoto 	char *p, *r;
    211  1.10       phx 	uint32_t add;
    212  1.10       phx 	int mode;
    213   1.1  sakamoto 
    214   1.1  sakamoto 	switch (argc) {
    215   1.1  sakamoto 	case 3:
    216   1.1  sakamoto 		r = argv[1];
    217   1.1  sakamoto 		switch (r[1]) {
    218   1.1  sakamoto 		case 'b':
    219   1.1  sakamoto 			mode = 1;
    220   1.1  sakamoto 			break;
    221   1.1  sakamoto 		case 'h':
    222   1.1  sakamoto 			mode = 2;
    223   1.1  sakamoto 			break;
    224   1.1  sakamoto 		case 'w':
    225   1.1  sakamoto 			mode = 4;
    226   1.1  sakamoto 			break;
    227   1.1  sakamoto 		default:
    228   1.1  sakamoto 			goto out;
    229   1.1  sakamoto 		}
    230   1.1  sakamoto 		p = argv[2];
    231   1.1  sakamoto 		break;
    232   1.1  sakamoto 	case 2:
    233   1.1  sakamoto 		mode = 4;
    234   1.1  sakamoto 		p = argv[1];
    235   1.1  sakamoto 		break;
    236   1.1  sakamoto 	default:
    237   1.1  sakamoto 		goto out;
    238   1.1  sakamoto 	}
    239   1.1  sakamoto 
    240   1.1  sakamoto 	add = db_atob(p);
    241   1.1  sakamoto 	printf("0x%x: ", add);
    242   1.1  sakamoto 	switch (mode) {
    243   1.1  sakamoto 	case 1:
    244  1.10       phx 		printf("0x%x", *(uint8_t *)add);
    245   1.1  sakamoto 		break;
    246   1.1  sakamoto 	case 2:
    247  1.10       phx 		printf("0x%x", *(uint16_t *)add);
    248   1.1  sakamoto 		break;
    249   1.1  sakamoto 	case 4:
    250  1.10       phx 		printf("0x%x", *(uint32_t *)add);
    251   1.1  sakamoto 		break;
    252   1.1  sakamoto 	}
    253   1.1  sakamoto 	printf("\n");
    254   1.1  sakamoto 	return;
    255   1.1  sakamoto 
    256   1.4  junyoung out:
    257   1.1  sakamoto 	printf("get [-b][-h][-w] address\n");
    258   1.1  sakamoto 	return;
    259   1.1  sakamoto }
    260   1.1  sakamoto 
    261   1.1  sakamoto void
    262   1.4  junyoung db_cmd_put(int argc, char **argv)
    263   1.1  sakamoto {
    264   1.1  sakamoto 	char *p, *r, *pp;
    265  1.10       phx 	uint32_t add, data;
    266  1.10       phx 	int mode;
    267   1.1  sakamoto 
    268   1.1  sakamoto 	switch (argc) {
    269   1.1  sakamoto 	case 4:
    270   1.1  sakamoto 		r = argv[1];
    271   1.1  sakamoto 		switch (r[1]) {
    272   1.1  sakamoto 		case 'b':
    273   1.1  sakamoto 			mode = 1;
    274   1.1  sakamoto 			break;
    275   1.1  sakamoto 		case 'h':
    276   1.1  sakamoto 			mode = 2;
    277   1.1  sakamoto 			break;
    278   1.1  sakamoto 		case 'w':
    279   1.1  sakamoto 			mode = 4;
    280   1.1  sakamoto 			break;
    281   1.1  sakamoto 		default:
    282   1.1  sakamoto 			goto out;
    283   1.1  sakamoto 		}
    284   1.1  sakamoto 		p = argv[2];
    285   1.1  sakamoto 		pp = argv[3];
    286   1.1  sakamoto 		break;
    287   1.1  sakamoto 	case 3:
    288   1.1  sakamoto 		mode = 4;
    289   1.1  sakamoto 		p = argv[1];
    290   1.1  sakamoto 		pp = argv[2];
    291   1.1  sakamoto 		break;
    292   1.1  sakamoto 	default:
    293   1.1  sakamoto 		goto out;
    294   1.1  sakamoto 	}
    295   1.1  sakamoto 
    296   1.1  sakamoto 	add = db_atob(p);
    297   1.1  sakamoto 	data = db_atob(pp);
    298   1.1  sakamoto 	printf("0x%x: 0x%x", add, data);
    299   1.1  sakamoto 	switch (mode) {
    300   1.1  sakamoto 	case 1:
    301  1.10       phx 		*(uint8_t *)add = data;
    302   1.1  sakamoto 		break;
    303   1.1  sakamoto 	case 2:
    304  1.10       phx 		*(uint16_t *)add = data;
    305   1.1  sakamoto 		break;
    306   1.1  sakamoto 	case 4:
    307  1.10       phx 		*(uint32_t *)add = data;
    308   1.1  sakamoto 		break;
    309   1.1  sakamoto 	}
    310   1.1  sakamoto 	printf("\n");
    311   1.1  sakamoto 	return;
    312   1.1  sakamoto 
    313   1.4  junyoung out:
    314   1.1  sakamoto 	printf("put [-b][-h][-w] address data\n");
    315   1.1  sakamoto 	return;
    316   1.1  sakamoto }
    317   1.1  sakamoto 
    318   1.1  sakamoto #define STR(x) #x
    319   1.1  sakamoto 
    320   1.1  sakamoto #define	FUNC(x) \
    321  1.10       phx uint32_t mf ## x(void); \
    322  1.10       phx void mt ## x(uint32_t); \
    323  1.10       phx uint32_t mf ## x() { \
    324  1.10       phx 	uint32_t tmp; \
    325   1.7     perry 	__asm volatile (STR(mf ## x %0) : STR(=r)(tmp)); \
    326   1.1  sakamoto 	return (tmp); \
    327   1.1  sakamoto } \
    328  1.10       phx void mt ## x(uint32_t data) \
    329   1.1  sakamoto { \
    330   1.7     perry 	__asm volatile (STR(mt ## x %0) :: STR(r)(data)); \
    331   1.1  sakamoto } \
    332   1.1  sakamoto 
    333   1.1  sakamoto #define DEF(x) \
    334   1.1  sakamoto 	{ #x, mf ## x, mt ## x }
    335   1.1  sakamoto 
    336   1.9  kiyohara FUNC(msr)
    337   1.1  sakamoto 
    338   1.1  sakamoto struct {
    339   1.1  sakamoto 	char *op;
    340  1.10       phx 	uint32_t (*mf)(void);
    341  1.10       phx 	void (*mt)(uint32_t);
    342   1.1  sakamoto } mreg [] = {
    343   1.1  sakamoto 	DEF(msr),
    344   1.1  sakamoto 	{ NULL, NULL, NULL },
    345   1.1  sakamoto };
    346   1.1  sakamoto 
    347   1.1  sakamoto void
    348   1.4  junyoung db_cmd_mf(int argc, char **argv)
    349   1.1  sakamoto {
    350   1.1  sakamoto 	int i = 0;
    351   1.1  sakamoto 
    352   1.1  sakamoto 	if (argc != 2) {
    353   1.1  sakamoto 		printf("mf register\nregister:");
    354   1.1  sakamoto 		while (mreg[i].op != NULL)
    355   1.1  sakamoto 			printf(" %s", mreg[i++].op);
    356   1.1  sakamoto 		printf("\n");
    357   1.1  sakamoto 		return;
    358   1.1  sakamoto 	}
    359   1.1  sakamoto 
    360   1.1  sakamoto 	while (mreg[i].op != NULL) {
    361   1.1  sakamoto 		if (!strcmp(mreg[i].op, argv[1])) {
    362   1.1  sakamoto 			printf(" 0x%x\n", (mreg[i].mf)());
    363   1.1  sakamoto 			break;
    364   1.1  sakamoto 		}
    365   1.1  sakamoto 		i++;
    366   1.1  sakamoto 	}
    367   1.1  sakamoto }
    368   1.1  sakamoto 
    369   1.1  sakamoto void
    370   1.4  junyoung db_cmd_mt(int argc, char **argv)
    371   1.1  sakamoto {
    372   1.1  sakamoto 	int i = 0;
    373   1.1  sakamoto 
    374   1.1  sakamoto 	if (argc != 3) {
    375   1.1  sakamoto 		printf("mt register data\nregister:");
    376   1.1  sakamoto 		while (mreg[i].op != NULL)
    377   1.1  sakamoto 			printf(" %s", mreg[i++].op);
    378   1.1  sakamoto 		printf("\n");
    379   1.1  sakamoto 		return;
    380   1.1  sakamoto 	}
    381   1.1  sakamoto 
    382   1.1  sakamoto 	while (mreg[i].op != NULL) {
    383   1.1  sakamoto 		if (!strcmp(mreg[i].op, argv[1])) {
    384  1.10       phx 			(mreg[i].mt)(db_atob(argv[2]));
    385   1.1  sakamoto 			printf(" 0x%x\n", db_atob(argv[2]));
    386   1.1  sakamoto 			break;
    387   1.1  sakamoto 		}
    388   1.1  sakamoto 		i++;
    389   1.1  sakamoto 	}
    390   1.1  sakamoto }
    391   1.1  sakamoto 
    392   1.1  sakamoto void
    393   1.4  junyoung db_cmd_help(int argc, char **argv)
    394   1.1  sakamoto {
    395   1.1  sakamoto 	int i = 0;
    396   1.1  sakamoto 
    397   1.1  sakamoto 	while (db_cmd[i].name != NULL)
    398   1.1  sakamoto 		printf("%s, ", db_cmd[i++].name);
    399   1.1  sakamoto 	printf("\n");
    400   1.1  sakamoto }
    401