199730Sbenno/*	$FreeBSD$ */
299730Sbenno/*	$NetBSD: db_interface.c,v 1.20 2002/05/13 20:30:09 matt Exp $ */
399730Sbenno/*	$OpenBSD: db_interface.c,v 1.2 1996/12/28 06:21:50 rahnds Exp $	*/
499730Sbenno
599730Sbenno
699730Sbenno#include <sys/param.h>
799730Sbenno#include <sys/systm.h>
8104435Sgrehan#include <sys/cons.h>
9132069Sgrehan#include <sys/kdb.h>
10132069Sgrehan#include <sys/ktr.h>
11132069Sgrehan#include <sys/lock.h>
12132069Sgrehan#include <sys/pcpu.h>
13132069Sgrehan#include <sys/proc.h>
14132069Sgrehan#include <sys/smp.h>
1599730Sbenno
16170473Smarcel#include <machine/kdb.h>
17132069Sgrehan#include <machine/md_var.h>
1899730Sbenno
19132069Sgrehan#include <vm/vm.h>
20132069Sgrehan#include <vm/pmap.h>
21132069Sgrehan
2299730Sbenno#include <ddb/ddb.h>
2399730Sbenno#include <ddb/db_sym.h>
2499730Sbenno#include <ddb/db_command.h>
2599730Sbenno#include <ddb/db_access.h>
2699730Sbenno#include <ddb/db_output.h>
2799730Sbenno
2899730Sbenno#include <dev/ofw/openfirm.h>
2999730Sbenno
3099730Sbennoint
31132069Sgrehandb_read_bytes(vm_offset_t addr, size_t size, char *data)
3299730Sbenno{
33132069Sgrehan	jmp_buf jb;
34132069Sgrehan	void *prev_jb;
35132069Sgrehan	char *src;
36132069Sgrehan	int ret;
3799730Sbenno
38132069Sgrehan	prev_jb = kdb_jmpbuf(jb);
39132069Sgrehan	ret = setjmp(jb);
40132069Sgrehan	if (ret == 0) {
41132069Sgrehan		src = (char *)addr;
4299730Sbenno
43132069Sgrehan		if (size == 4)
44132069Sgrehan			*((int *)data) = *((int *)src);
45132069Sgrehan		else if (size == 2)
46132069Sgrehan			*((short *)data) = *((short *)src);
47132069Sgrehan		else
48132069Sgrehan			while (size-- > 0)
49132069Sgrehan				*data++ = *src++;
5099730Sbenno	}
51132069Sgrehan	(void)kdb_jmpbuf(prev_jb);
52132069Sgrehan	return (ret);
5399730Sbenno}
5499730Sbenno
55132069Sgrehanint
56132069Sgrehandb_write_bytes(vm_offset_t addr, size_t size, char *data)
5799730Sbenno{
58132069Sgrehan	jmp_buf jb;
59132069Sgrehan	void *prev_jb;
60132069Sgrehan	char *dst;
61170473Smarcel	size_t cnt;
62132069Sgrehan	int ret;
6399730Sbenno
64132069Sgrehan	prev_jb = kdb_jmpbuf(jb);
65132069Sgrehan	ret = setjmp(jb);
66132069Sgrehan	if (ret == 0) {
67132069Sgrehan		dst = (char *)addr;
68170473Smarcel		cnt = size;
6999730Sbenno
70170473Smarcel		while (cnt-- > 0)
71170473Smarcel			*dst++ = *data++;
72170473Smarcel		kdb_cpu_sync_icache((void *)addr, size);
7399730Sbenno	}
74132069Sgrehan	(void)kdb_jmpbuf(prev_jb);
75132069Sgrehan	return (ret);
7699730Sbenno}
7799730Sbenno
78132069Sgrehanvoid
79132069Sgrehandb_show_mdpcpu(struct pcpu *pc)
8099730Sbenno{
81182487Smarcel
82209975Snwhitehorn	db_printf("PPC: hwref   = %#zx\n", pc->pc_hwref);
83182487Smarcel	db_printf("PPC: ipimask = %#x\n", pc->pc_ipimask);
84182487Smarcel	db_printf("PPC: pir     = %#x\n", pc->pc_pir);
8599730Sbenno}
86