Commit f78541dc authored by Paul Mackerras's avatar Paul Mackerras

powerpc: Merge xmon

The merged version follows the ppc64 version pretty closely mostly,
and in fact ARCH=ppc64 now uses the arch/powerpc/xmon version.
The main difference for ppc64 is that the 'p' command to call
show_state (which was always pretty dodgy) has been replaced by
the ppc32 'p' command, which calls a given procedure (so in fact
the old 'p' command behaviour can be achieved with 'p $show_state').
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent c032524f
...@@ -131,7 +131,7 @@ core-y += arch/powerpc/kernel/ \ ...@@ -131,7 +131,7 @@ core-y += arch/powerpc/kernel/ \
arch/powerpc/sysdev/ \ arch/powerpc/sysdev/ \
arch/powerpc/platforms/ arch/powerpc/platforms/
core-$(CONFIG_MATH_EMULATION) += arch/ppc/math-emu/ core-$(CONFIG_MATH_EMULATION) += arch/ppc/math-emu/
#core-$(CONFIG_XMON) += arch/powerpc/xmon/ core-$(CONFIG_XMON) += arch/powerpc/xmon/
core-$(CONFIG_APUS) += arch/ppc/amiga/ core-$(CONFIG_APUS) += arch/ppc/amiga/
drivers-$(CONFIG_8xx) += arch/ppc/8xx_io/ drivers-$(CONFIG_8xx) += arch/ppc/8xx_io/
drivers-$(CONFIG_4xx) += arch/ppc/4xx_io/ drivers-$(CONFIG_4xx) += arch/ppc/4xx_io/
......
...@@ -271,6 +271,9 @@ __secondary_hold_acknowledge: ...@@ -271,6 +271,9 @@ __secondary_hold_acknowledge:
li r10,MSR_KERNEL & ~(MSR_IR|MSR_DR); /* can take exceptions */ \ li r10,MSR_KERNEL & ~(MSR_IR|MSR_DR); /* can take exceptions */ \
MTMSRD(r10); /* (except for mach check in rtas) */ \ MTMSRD(r10); /* (except for mach check in rtas) */ \
stw r0,GPR0(r11); \ stw r0,GPR0(r11); \
lis r10,0x7265; /* put exception frame marker */ \
addi r10,r10,0x6773; \
stw r10,8(r11); \
SAVE_4GPRS(3, r11); \ SAVE_4GPRS(3, r11); \
SAVE_2GPRS(7, r11) SAVE_2GPRS(7, r11)
......
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
#include <asm/cputable.h> #include <asm/cputable.h>
#include <asm/btext.h> #include <asm/btext.h>
#include <asm/div64.h> #include <asm/div64.h>
#include <asm/xmon.h>
#ifdef CONFIG_8xx #ifdef CONFIG_8xx
#include <asm/commproc.h> #include <asm/commproc.h>
...@@ -238,10 +237,6 @@ EXPORT_SYMBOL(console_drivers); ...@@ -238,10 +237,6 @@ EXPORT_SYMBOL(console_drivers);
EXPORT_SYMBOL(cacheable_memcpy); EXPORT_SYMBOL(cacheable_memcpy);
#endif #endif
#ifdef CONFIG_XMON
EXPORT_SYMBOL(xmon);
EXPORT_SYMBOL(xmon_printf);
#endif
EXPORT_SYMBOL(__up); EXPORT_SYMBOL(__up);
EXPORT_SYMBOL(__down); EXPORT_SYMBOL(__down);
EXPORT_SYMBOL(__down_interruptible); EXPORT_SYMBOL(__down_interruptible);
......
...@@ -302,8 +302,10 @@ void __init setup_arch(char **cmdline_p) ...@@ -302,8 +302,10 @@ void __init setup_arch(char **cmdline_p)
#ifdef CONFIG_XMON #ifdef CONFIG_XMON
xmon_map_scc(); xmon_map_scc();
if (strstr(cmd_line, "xmon")) if (strstr(cmd_line, "xmon")) {
xmon(NULL); xmon_init(1);
debugger(NULL);
}
#endif /* CONFIG_XMON */ #endif /* CONFIG_XMON */
if ( ppc_md.progress ) ppc_md.progress("setup_arch: enter", 0x3eab); if ( ppc_md.progress ) ppc_md.progress("setup_arch: enter", 0x3eab);
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
#include <asm/iSeries/ItLpNaca.h> #include <asm/iSeries/ItLpNaca.h>
#include <asm/firmware.h> #include <asm/firmware.h>
#include <asm/systemcfg.h> #include <asm/systemcfg.h>
#include <asm/xmon.h>
#ifdef DEBUG #ifdef DEBUG
#define DBG(fmt...) udbg_printf(fmt) #define DBG(fmt...) udbg_printf(fmt)
......
...@@ -11,6 +11,8 @@ obj-$(CONFIG_PPC32) += div64.o copy_32.o checksum_32.o ...@@ -11,6 +11,8 @@ obj-$(CONFIG_PPC32) += div64.o copy_32.o checksum_32.o
obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \ obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \
memcpy_64.o usercopy_64.o mem_64.o memcpy_64.o usercopy_64.o mem_64.o
obj-$(CONFIG_PPC_ISERIES) += e2a.o obj-$(CONFIG_PPC_ISERIES) += e2a.o
obj-$(CONFIG_XMON) += sstep.o
ifeq ($(CONFIG_PPC64),y) ifeq ($(CONFIG_PPC64),y)
obj-$(CONFIG_SMP) += locks.o obj-$(CONFIG_SMP) += locks.o
obj-$(CONFIG_DEBUG_KERNEL) += sstep.o obj-$(CONFIG_DEBUG_KERNEL) += sstep.o
......
# Makefile for xmon
ifdef CONFIG_PPC64
EXTRA_CFLAGS += -mno-minimal-toc
endif
obj-$(CONFIG_8xx) += start_8xx.o
obj-$(CONFIG_6xx) += start_32.o
obj-$(CONFIG_4xx) += start_32.o
obj-$(CONFIG_PPC64) += start_64.o
obj-y += xmon.o ppc-dis.o ppc-opc.o subr_prf.o setjmp.o
/*
* Copyright (C) 1996 Paul Mackerras.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* NOTE: assert(sizeof(buf) > 23 * sizeof(long))
*/
#include <asm/processor.h>
#include <asm/ppc_asm.h>
#include <asm/asm-offsets.h>
_GLOBAL(xmon_setjmp)
mflr r0
STL r0,0(r3)
STL r1,SZL(r3)
STL r2,2*SZL(r3)
mfcr r0
STL r0,3*SZL(r3)
STL r13,4*SZL(r3)
STL r14,5*SZL(r3)
STL r15,6*SZL(r3)
STL r16,7*SZL(r3)
STL r17,8*SZL(r3)
STL r18,9*SZL(r3)
STL r19,10*SZL(r3)
STL r20,11*SZL(r3)
STL r21,12*SZL(r3)
STL r22,13*SZL(r3)
STL r23,14*SZL(r3)
STL r24,15*SZL(r3)
STL r25,16*SZL(r3)
STL r26,17*SZL(r3)
STL r27,18*SZL(r3)
STL r28,19*SZL(r3)
STL r29,20*SZL(r3)
STL r30,21*SZL(r3)
STL r31,22*SZL(r3)
li r3,0
blr
_GLOBAL(xmon_longjmp)
CMPI r4,0
bne 1f
li r4,1
1: LDL r13,4*SZL(r3)
LDL r14,5*SZL(r3)
LDL r15,6*SZL(r3)
LDL r16,7*SZL(r3)
LDL r17,8*SZL(r3)
LDL r18,9*SZL(r3)
LDL r19,10*SZL(r3)
LDL r20,11*SZL(r3)
LDL r21,12*SZL(r3)
LDL r22,13*SZL(r3)
LDL r23,14*SZL(r3)
LDL r24,15*SZL(r3)
LDL r25,16*SZL(r3)
LDL r26,17*SZL(r3)
LDL r27,18*SZL(r3)
LDL r28,19*SZL(r3)
LDL r29,20*SZL(r3)
LDL r30,21*SZL(r3)
LDL r31,22*SZL(r3)
LDL r0,3*SZL(r3)
mtcrf 0x38,r0
LDL r0,0(r3)
LDL r1,SZL(r3)
LDL r2,2*SZL(r3)
mtlr r0
mr r3,r4
blr
/*
* Grab the register values as they are now.
* This won't do a particularily good job because we really
* want our caller's caller's registers, and our caller has
* already executed its prologue.
* ToDo: We could reach back into the caller's save area to do
* a better job of representing the caller's state (note that
* that will be different for 32-bit and 64-bit, because of the
* different ABIs, though).
*/
_GLOBAL(xmon_save_regs)
STL r0,0*SZL(r3)
STL r2,2*SZL(r3)
STL r3,3*SZL(r3)
STL r4,4*SZL(r3)
STL r5,5*SZL(r3)
STL r6,6*SZL(r3)
STL r7,7*SZL(r3)
STL r8,8*SZL(r3)
STL r9,9*SZL(r3)
STL r10,10*SZL(r3)
STL r11,11*SZL(r3)
STL r12,12*SZL(r3)
STL r13,13*SZL(r3)
STL r14,14*SZL(r3)
STL r15,15*SZL(r3)
STL r16,16*SZL(r3)
STL r17,17*SZL(r3)
STL r18,18*SZL(r3)
STL r19,19*SZL(r3)
STL r20,20*SZL(r3)
STL r21,21*SZL(r3)
STL r22,22*SZL(r3)
STL r23,23*SZL(r3)
STL r24,24*SZL(r3)
STL r25,25*SZL(r3)
STL r26,26*SZL(r3)
STL r27,27*SZL(r3)
STL r28,28*SZL(r3)
STL r29,29*SZL(r3)
STL r30,30*SZL(r3)
STL r31,31*SZL(r3)
/* go up one stack frame for SP */
LDL r4,0(r1)
STL r4,1*SZL(r3)
/* get caller's LR */
LDL r0,LRSAVE(r4)
STL r0,_NIP-STACK_FRAME_OVERHEAD(r3)
STL r0,_LINK-STACK_FRAME_OVERHEAD(r3)
mfmsr r0
STL r0,_MSR-STACK_FRAME_OVERHEAD(r3)
mfctr r0
STL r0,_CTR-STACK_FRAME_OVERHEAD(r3)
mfxer r0
STL r0,_XER-STACK_FRAME_OVERHEAD(r3)
mfcr r0
STL r0,_CCR-STACK_FRAME_OVERHEAD(r3)
li r0,0
STL r0,_TRAP-STACK_FRAME_OVERHEAD(r3)
blr
This diff is collapsed.
/*
* Copyright (C) 1996 Paul Mackerras.
* Copyright (C) 2000 Dan Malek.
* Quick hack of Paul's code to make XMON work on 8xx processors. Lots
* of assumptions, like the SMC1 is used, it has been initialized by the
* loader at some point, and we can just stuff and suck bytes.
* We rely upon the 8xx uart driver to support us, as the interface
* changes between boot up and operational phases of the kernel.
*/
#include <linux/string.h>
#include <asm/machdep.h>
#include <asm/io.h>
#include <asm/page.h>
#include <linux/kernel.h>
#include <asm/8xx_immap.h>
#include <asm/mpc8xx.h>
#include <asm/commproc.h>
extern void xmon_printf(const char *fmt, ...);
extern int xmon_8xx_write(char *str, int nb);
extern int xmon_8xx_read_poll(void);
extern int xmon_8xx_read_char(void);
void prom_drawhex(uint);
void prom_drawstring(const char *str);
static int use_screen = 1; /* default */
#define TB_SPEED 25000000
static inline unsigned int readtb(void)
{
unsigned int ret;
asm volatile("mftb %0" : "=r" (ret) :);
return ret;
}
void buf_access(void)
{
}
void
xmon_map_scc(void)
{
cpmp = (cpm8xx_t *)&(((immap_t *)IMAP_ADDR)->im_cpm);
use_screen = 0;
prom_drawstring("xmon uses serial port\n");
}
static int scc_initialized = 0;
void xmon_init_scc(void);
int
xmon_write(void *handle, void *ptr, int nb)
{
char *p = ptr;
int i, c, ct;
if (!scc_initialized)
xmon_init_scc();
return(xmon_8xx_write(ptr, nb));
}
int xmon_wants_key;
int
xmon_read(void *handle, void *ptr, int nb)
{
char *p = ptr;
int i;
if (!scc_initialized)
xmon_init_scc();
for (i = 0; i < nb; ++i) {
*p++ = xmon_8xx_read_char();
}
return i;
}
int
xmon_read_poll(void)
{
return(xmon_8xx_read_poll());
}
void
xmon_init_scc()
{
scc_initialized = 1;
}
#if 0
extern int (*prom_entry)(void *);
int
xmon_exit(void)
{
struct prom_args {
char *service;
} args;
for (;;) {
args.service = "exit";
(*prom_entry)(&args);
}
}
#endif
void *xmon_stdin;
void *xmon_stdout;
void *xmon_stderr;
void
xmon_init(void)
{
}
int
xmon_putc(int c, void *f)
{
char ch = c;
if (c == '\n')
xmon_putc('\r', f);
return xmon_write(f, &ch, 1) == 1? c: -1;
}
int
xmon_putchar(int c)
{
return xmon_putc(c, xmon_stdout);
}
int
xmon_fputs(char *str, void *f)
{
int n = strlen(str);
return xmon_write(f, str, n) == n? 0: -1;
}
int
xmon_readchar(void)
{
char ch;
for (;;) {
switch (xmon_read(xmon_stdin, &ch, 1)) {
case 1:
return ch;
case -1:
xmon_printf("read(stdin) returned -1\r\n", 0, 0);
return -1;
}
}
}
static char line[256];
static char *lineptr;
static int lineleft;
#if 0
int xmon_expect(const char *str, unsigned int timeout)
{
int c;
unsigned int t0;
timeout *= TB_SPEED;
t0 = readtb();
do {
lineptr = line;
for (;;) {
c = xmon_read_poll();
if (c == -1) {
if (readtb() - t0 > timeout)
return 0;
continue;
}
if (c == '\n')
break;
if (c != '\r' && lineptr < &line[sizeof(line) - 1])
*lineptr++ = c;
}
*lineptr = 0;
} while (strstr(line, str) == NULL);
return 1;
}
#endif
int
xmon_getchar(void)
{
int c;
if (lineleft == 0) {
lineptr = line;
for (;;) {
c = xmon_readchar();
if (c == -1 || c == 4)
break;
if (c == '\r' || c == '\n') {
*lineptr++ = '\n';
xmon_putchar('\n');
break;
}
switch (c) {
case 0177:
case '\b':
if (lineptr > line) {
xmon_putchar('\b');
xmon_putchar(' ');
xmon_putchar('\b');
--lineptr;
}
break;
case 'U' & 0x1F:
while (lineptr > line) {
xmon_putchar('\b');
xmon_putchar(' ');
xmon_putchar('\b');
--lineptr;
}
break;
default:
if (lineptr >= &line[sizeof(line) - 1])
xmon_putchar('\a');
else {
xmon_putchar(c);
*lineptr++ = c;
}
}
}
lineleft = lineptr - line;
lineptr = line;
}
if (lineleft == 0)
return -1;
--lineleft;
return *lineptr++;
}
char *
xmon_fgets(char *str, int nb, void *f)
{
char *p;
int c;
for (p = str; p < str + nb - 1; ) {
c = xmon_getchar();
if (c == -1) {
if (p == str)
return 0;
break;
}
*p++ = c;
if (c == '\n')
break;
}
*p = 0;
return str;
}
void
prom_drawhex(uint val)
{
unsigned char buf[10];
int i;
for (i = 7; i >= 0; i--)
{
buf[i] = "0123456789abcdef"[val & 0x0f];
val >>= 4;
}
buf[8] = '\0';
xmon_fputs(buf, xmon_stdout);
}
void
prom_drawstring(const char *str)
{
xmon_fputs(str, xmon_stdout);
}
...@@ -18,13 +18,13 @@ ...@@ -18,13 +18,13 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/module.h>
#include <stdarg.h> #include <stdarg.h>
#include "nonstdio.h" #include "nonstdio.h"
extern int xmon_write(void *, void *, int); extern int xmon_write(void *, void *, int);
void void xmon_vfprintf(void *f, const char *fmt, va_list ap)
xmon_vfprintf(void *f, const char *fmt, va_list ap)
{ {
static char xmon_buf[2048]; static char xmon_buf[2048];
int n; int n;
...@@ -33,8 +33,7 @@ xmon_vfprintf(void *f, const char *fmt, va_list ap) ...@@ -33,8 +33,7 @@ xmon_vfprintf(void *f, const char *fmt, va_list ap)
xmon_write(f, xmon_buf, n); xmon_write(f, xmon_buf, n);
} }
void void xmon_printf(const char *fmt, ...)
xmon_printf(const char *fmt, ...)
{ {
va_list ap; va_list ap;
...@@ -42,9 +41,9 @@ xmon_printf(const char *fmt, ...) ...@@ -42,9 +41,9 @@ xmon_printf(const char *fmt, ...)
xmon_vfprintf(stdout, fmt, ap); xmon_vfprintf(stdout, fmt, ap);
va_end(ap); va_end(ap);
} }
EXPORT_SYMBOL(xmon_printf);
void void xmon_fprintf(void *f, const char *fmt, ...)
xmon_fprintf(void *f, const char *fmt, ...)
{ {
va_list ap; va_list ap;
......
...@@ -89,7 +89,7 @@ core-y += arch/powerpc/mm/ ...@@ -89,7 +89,7 @@ core-y += arch/powerpc/mm/
core-y += arch/powerpc/sysdev/ core-y += arch/powerpc/sysdev/
core-y += arch/powerpc/platforms/ core-y += arch/powerpc/platforms/
core-y += arch/powerpc/lib/ core-y += arch/powerpc/lib/
core-$(CONFIG_XMON) += arch/ppc64/xmon/ core-$(CONFIG_XMON) += arch/powerpc/xmon/
drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/ drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/
boot := arch/ppc64/boot boot := arch/ppc64/boot
......
# Makefile for xmon
EXTRA_CFLAGS += -mno-minimal-toc
obj-y := start.o xmon.o ppc-dis.o ppc-opc.o subr_prf.o setjmp.o
/*
* Copyright (C) 1996 Paul Mackerras.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* NOTE: assert(sizeof(buf) > 184)
*/
#include <asm/processor.h>
#include <asm/ppc_asm.h>
_GLOBAL(xmon_setjmp)
mflr r0
std r0,0(r3)
std r1,8(r3)
std r2,16(r3)
mfcr r0
std r0,24(r3)
std r13,32(r3)
std r14,40(r3)
std r15,48(r3)
std r16,56(r3)
std r17,64(r3)
std r18,72(r3)
std r19,80(r3)
std r20,88(r3)
std r21,96(r3)
std r22,104(r3)
std r23,112(r3)
std r24,120(r3)
std r25,128(r3)
std r26,136(r3)
std r27,144(r3)
std r28,152(r3)
std r29,160(r3)
std r30,168(r3)
std r31,176(r3)
li r3,0
blr
_GLOBAL(xmon_longjmp)
cmpdi r4,0
bne 1f
li r4,1
1: ld r13,32(r3)
ld r14,40(r3)
ld r15,48(r3)
ld r16,56(r3)
ld r17,64(r3)
ld r18,72(r3)
ld r19,80(r3)
ld r20,88(r3)
ld r21,96(r3)
ld r22,104(r3)
ld r23,112(r3)
ld r24,120(r3)
ld r25,128(r3)
ld r26,136(r3)
ld r27,144(r3)
ld r28,152(r3)
ld r29,160(r3)
ld r30,168(r3)
ld r31,176(r3)
ld r0,24(r3)
mtcrf 56,r0
ld r0,0(r3)
ld r1,8(r3)
ld r2,16(r3)
mtlr r0
mr r3,r4
blr
...@@ -188,6 +188,10 @@ GLUE(.,name): ...@@ -188,6 +188,10 @@ GLUE(.,name):
#define LDL ld #define LDL ld
#define STL std #define STL std
#define CMPI cmpdi #define CMPI cmpdi
#define SZL 8
/* offsets for stack frame layout */
#define LRSAVE 16
#else /* 32-bit */ #else /* 32-bit */
#define LOADADDR(rn,name) \ #define LOADADDR(rn,name) \
...@@ -203,6 +207,10 @@ GLUE(.,name): ...@@ -203,6 +207,10 @@ GLUE(.,name):
#define LDL lwz #define LDL lwz
#define STL stw #define STL stw
#define CMPI cmpwi #define CMPI cmpwi
#define SZL 4
/* offsets for stack frame layout */
#define LRSAVE 4
#endif #endif
......
...@@ -546,6 +546,7 @@ ...@@ -546,6 +546,7 @@
#define __mtmsrd(v, l) asm volatile("mtmsrd %0," __stringify(l) \ #define __mtmsrd(v, l) asm volatile("mtmsrd %0," __stringify(l) \
: : "r" (v)) : : "r" (v))
#define mtmsrd(v) __mtmsrd((v), 0) #define mtmsrd(v) __mtmsrd((v), 0)
#define mtmsr(v) mtmsrd(v)
#else #else
#define mtmsr(v) asm volatile("mtmsr %0" : : "r" (v)) #define mtmsr(v) asm volatile("mtmsr %0" : : "r" (v))
#endif #endif
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
struct pt_regs; struct pt_regs;
extern void xmon(struct pt_regs *excp); extern int xmon(struct pt_regs *excp);
extern void xmon_printf(const char *fmt, ...); extern void xmon_printf(const char *fmt, ...);
extern void xmon_init(int); extern void xmon_init(int);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment