arm32 kernel source restructure

- Renamed files with previous revision history maintained
  - Minor changes for restructure.
This commit is contained in:
mark 1997-10-14 09:01:37 +00:00
parent dfbda96da0
commit 1f128863e3
6 changed files with 689 additions and 20 deletions

View File

@ -0,0 +1,7 @@
Use of any of this code is deprecated. It is not currently used unless the
KSHELL option is used in a config file.
It is on my removal list but as not yet gone as I am always reluctant to
junk old code.
--mark

View File

@ -1,4 +1,4 @@
/* $NetBSD: kshell_debug.c,v 1.6 1997/10/06 01:12:01 mark Exp $ */
/* $NetBSD: kshell_debug.c,v 1.7 1997/10/14 09:01:38 mark Exp $ */
/*
* Copyright (c) 1994 Melvin Tang-Richardson (Nut)
@ -52,7 +52,6 @@
#include <vm/vm.h>
#include <vm/vm_kern.h>
#ifdef KSHELL
int
debug_count_processes_on_q(queue)
int queue;
@ -248,6 +247,5 @@ debug_show_pmap(pmap)
}
(void)splx(s);
}
#endif /* KSHELL */
/* End of debug.c */
/* End of kshell_debug.c */

View File

@ -1,4 +1,4 @@
/* $NetBSD: kshell_disassem.c,v 1.5 1996/10/13 03:06:07 christos Exp $ */
/* $NetBSD: kshell_disassem.c,v 1.6 1997/10/14 09:01:40 mark Exp $ */
/*
* Copyright (c) 1994 Mark Brinicombe.
@ -36,28 +36,247 @@
*
* RiscBSD kernel project
*
* shell_disassem.c
* disassem.c
*
* Debug / Monitor shell disassembler
* Debug / Monitor disassembler
*
* Created : 09/10/94
*/
/*
* The disassembler now duplicates a lot of code with the debugger.
* The main reason there are two is that this one has extra interactive
* support for following branches durinhg disassembly and this one uses
* printf() with the one in db_disassem.c uses db_printf().
*/
/* Special compilation symbols
*
* DISASSEM_COLOUR - Use colour in dissassembly
*/
/*#define DISASSEM_COLOUR */
/* Include standard header files */
#include <sys/param.h>
#include <sys/systm.h>
#include <dev/cons.h>
/* Local header files */
#include <machine/katelib.h>
typedef u_int (*instruction_decoder) (u_int addr, u_int word);
typedef struct _opcodes {
u_int mask;
u_int pattern;
u_int colour;
instruction_decoder decoder;
} opcodes_struct;
static u_int instruction_swi __P((u_int addr, u_int word));
static u_int instruction_branch __P((u_int addr, u_int word));
static u_int instruction_mul __P((u_int addr, u_int word));
static u_int instruction_mla __P((u_int addr, u_int word));
static u_int instruction_ldrstr __P((u_int addr, u_int word));
static u_int instruction_ldmstm __P((u_int addr, u_int word));
static u_int instruction_dataproc __P((u_int addr, u_int word));
static u_int instruction_swap __P((u_int addr, u_int word));
static u_int instruction_mrs __P((u_int addr, u_int word));
static u_int instruction_msr __P((u_int addr, u_int word));
static u_int instruction_msrf __P((u_int addr, u_int word));
static u_int instruction_mrcmcr __P((u_int addr, u_int word));
static u_int instruction_cdp __P((u_int addr, u_int word));
static u_int instruction_cdt __P((u_int addr, u_int word));
static u_int instruction_fpabinop __P((u_int addr, u_int word));
static u_int instruction_fpaunop __P((u_int addr, u_int word));
static u_int instruction_ldfstf __P((u_int addr, u_int word));
/* Declare global variables */
opcodes_struct opcodes[] = {
{ 0x0f000000, 0x0f000000, 7, instruction_swi },
{ 0x0e000000, 0x0a000000, 7, instruction_branch },
{ 0x0fe000f0, 0x00000090, 7, instruction_mul },
{ 0x0fe000f0, 0x00200090, 7, instruction_mla },
{ 0x0e000000, 0x04000000, 7, instruction_ldrstr },
{ 0x0c000010, 0x04000000, 7, instruction_ldrstr },
{ 0x0e000000, 0x08000000, 6, instruction_ldmstm },
{ 0x0FB00FF0, 0x01000090, 7, instruction_swap },
{ 0x0FBF0FFF, 0x010F0000, 1, instruction_mrs },
{ 0x0DBFFFF0, 0x0129F000, 1, instruction_msr },
{ 0x0DBFFFF0, 0x0128F000, 1, instruction_msrf },
{ 0x0C000000, 0x00000000, 7, instruction_dataproc },
{ 0x0F008F10, 0x0E000100, 3, instruction_fpabinop },
{ 0x0F008F10, 0x0E008100, 3, instruction_fpaunop },
{ 0x0E000F00, 0x0C000100, 3, instruction_ldfstf },
{ 0x0F000010, 0x0E000010, 2, instruction_mrcmcr },
{ 0x0F000010, 0x0E000000, 2, instruction_cdp },
{ 0x0E000000, 0x0C000000, 2, instruction_cdt },
{ 0x00000000, 0x00000000, 0, NULL }
};
char *opcode_conditions[] = {
"EQ",
"NE",
"CS",
"CC",
"MI",
"PL",
"VS",
"VC",
"HI",
"LS",
"GE",
"LT",
"GT",
"LE",
"",
"NV"
};
char *opcode_data_procs[] = {
"AND",
"EOR",
"SUB",
"RSB",
"ADD",
"ADC",
"SBC",
"RSC",
"TST",
"TEQ",
"CMP",
"CMN",
"ORR",
"MOV",
"BIC",
"MVN"
};
char *opcode_shifts[] = {
"LSL",
"LSR",
"ASR",
"ROR"
};
char *opcode_block_transfers[] = {
"DA",
"IA",
"DB",
"IB"
};
char *opcode_stack_block_transfers[] = {
"FA",
"EA",
"FD",
"FA"
};
char *opcode_fpabinops[] = {
"ADF",
"MUF",
"SUF",
"RSF",
"DVF",
"RDF",
"POW",
"RPW",
"RMF",
"FML",
"FDV",
"FRD",
"POL",
"???",
"???",
"???",
"???"
};
char *opcode_fpaunops[] = {
"MVF",
"MNF",
"ABS",
"RND",
"SQT",
"LOG",
"LGN",
"EXP",
"SIN",
"COS",
"TAN",
"ASN",
"ACS",
"ATN",
"???",
"???",
"???"
};
char *opcode_fpaconstants[] = {
"0.0",
"1.0",
"2.0",
"3.0",
"4.0",
"5.0",
"0.5",
"10.0"
};
char *opcode_fpa_rounding[] = {
"",
"P",
"M",
"Z"
};
char *opcode_fpa_precision[] = {
"S",
"D",
"E",
"P"
};
#define opcode_condition(x) opcode_conditions[x >> 28]
#define opcode_s(x) ((x & 0x00100000) ? "S" : "")
#define opcode_b(x) ((x & 0x00400000) ? "B" : "")
#define opcode_t(x) ((x & 0x01200000) == 0x00200000 ? "T" : "")
#define opcode_dataproc(x) opcode_data_procs[(x >> 21) & 0x0f]
#define opcode_shift(x) opcode_shifts[(x >> 5) & 3]
#define opcode_blktrans(x) opcode_block_transfers[(x >> 23) & 3]
#define opcode_stkblktrans(x) opcode_stack_block_transfers[(x >> 23) & 3]
#define opcode_fpabinop(x) opcode_fpabinops[(x >> 20) & 0x0f]
#define opcode_fpaunop(x) opcode_fpaunops[(x >> 20) & 0x0f]
#define opcode_fpaimm(x) opcode_fpaconstants[x & 0x07]
#define opcode_fparnd(x) opcode_fpa_rounding[(x >> 5) & 0x03]
#define opcode_fpaprec(x) opcode_fpa_precision[(((x >> 18) & 2)|(x >> 7)) & 3]
/* Declare external variables */
extern caddr_t shell_ident;
int readhex __P((char *buf));
/* Local function prototypes */
u_int disassemble __P((u_char *));
u_int do_disassemble __P((u_char *));
int readhex __P((char *buf));
u_int disassemble __P((u_char *addr));
static u_int do_disassemble __P((u_char *));
/* Now for the main code */
@ -85,7 +304,7 @@ shell_disassem(argc, argv)
}
u_int
static u_int
do_disassemble(addr)
u_char *addr;
{
@ -183,4 +402,449 @@ do_disassemble(addr)
return(quit);
}
/* End of shell_disassem.c */
static void
printascii(byte)
int byte;
{
byte &= 0x7f;
if (byte < 0x20)
#ifdef DISASSEM_COLOUR
printf("\x1b[31m%c\x1b[0m", byte + '@');
#else
printf("%c", byte + '@');
#endif
else if (byte == 0x7f)
#ifdef DISASSEM_COLOUR
printf("\x1b[31m?\x1b[0m");
#else
printf("?");
#endif
else
printf("%c", byte);
}
u_int
disassemble(addr)
u_char *addr;
{
int loop;
u_int word;
u_int result = 0;
printf("%08x : ", (u_int)addr);
word = *((u_int *)addr);
for (loop = 0; loop < 4; ++loop)
printascii(addr[loop]);
printf(" : %08x : ", word);
loop = 0;
while (opcodes[loop].mask != 0) {
if ((word & opcodes[loop].mask) == opcodes[loop].pattern) {
#ifdef DISASSEM_COLOUR
printf("\x1b[3%dm", opcodes[loop].colour);
#endif
result = (*opcodes[loop].decoder)((u_int )addr, word);
#ifdef DISASSEM_COLOUR
printf("\x1b[0m");
#endif
break;
}
++loop;
}
if (opcodes[loop].mask == 0)
printf("Undefined instruction");
printf("\n\r");
return(result);
}
static u_int
instruction_swi(addr, word)
u_int addr;
u_int word;
{
printf("SWI%s\t0x%08x", opcode_condition(word), (word & 0x00ffffff));
return(addr);
}
static u_int
instruction_branch(addr, word)
u_int addr;
u_int word;
{
u_int branch;
branch = ((word << 2) & 0x03ffffff);
if (branch & 0x02000000)
branch |= 0xfc000000;
branch += addr + 8;
if (word & 0x01000000)
printf("BL%s\t0x%08x", opcode_condition(word), branch);
else
printf("B%s\t0x%08x", opcode_condition(word), branch);
return(branch);
}
static u_int
instruction_mul(addr, word)
u_int addr;
u_int word;
{
printf("MUL%s%s\t", opcode_condition(word), opcode_s(word));
printf("r%d, r%d, r%d", (word >> 16) & 0x0f, word & 0x0f,
(word >> 8) & 0x0f);
return(addr);
}
static u_int
instruction_mla(addr, word)
u_int addr;
u_int word;
{
printf("MLA%s%s\t", opcode_condition(word), opcode_s(word));
printf("r%d, r%d, r%d, r%d", (word >> 16) & 0x0f, word & 0x0f,
(word >> 8) & 0x0f, (word >> 12) & 0x0f);
return(addr);
}
static void
register_shift(word)
u_int word;
{
printf("r%d", (word & 0x0f));
if ((word & 0x00000ff0) == 0)
;
else if ((word & 0x00000ff0) == 0x00000060)
printf(", RRX");
else {
if (word & 0x10)
printf(", %s r%d", opcode_shift(word), (word >> 8) & 0x0f);
else
printf(", %s #%d", opcode_shift(word), (word >> 7) & 0x1f);
}
}
static u_int
instruction_ldrstr(addr, word)
u_int addr;
u_int word;
{
printf("%s%s%s%s\t", (word & 0x00100000) ? "LDR" : "STR",
opcode_condition(word), opcode_b(word), opcode_t(word));
printf("r%d, ", (word >> 12) & 0x0f);
if (((word >> 16) & 0x0f) == 16)
{
/* u_int location;
location = addr + 8;
addr = */
}
else
{
printf("[r%d", (word >> 16) & 0x0f);
printf("%s, ", (word & (1 << 24)) ? "" : "]");
if (!(word & 0x00800000))
printf("-");
if (word & (1 << 25))
register_shift(word);
else
printf("#0x%04x", word & 0xfff);
if (word & (1 << 24))
printf("]");
if (word & (1 << 21))
printf("!");
}
return(addr);
}
static u_int
instruction_ldmstm(addr, word)
u_int addr;
u_int word;
{
int loop;
int start;
printf("%s%s%s\t", (word & 0x00100000) ? "LDM" : "STM",
opcode_condition(word), opcode_blktrans(word));
printf("r%d", (word >> 16) & 0x0f);
if (word & (1 << 21))
printf("!");
printf(", {");
start = -1;
for (loop = 0; loop < 17; ++loop)
{
if (start != -1)
{
if (!(word & (1 << loop)) || loop == 16)
{
if (start == loop - 1)
printf("r%d, ", start);
else
printf("r%d-r%d, ", start, loop - 1);
start = -1;
}
}
else
{
if (word & (1 << loop))
start = loop;
}
}
printf("\x7f\x7f}");
if (word & (1 << 22))
printf("^");
return(addr);
}
static u_int
instruction_dataproc(addr, word)
u_int addr;
u_int word;
{
if ((word & 0x01800000) == 0x01000000)
word = word & ~(1<<20);
printf("%s%s%s\t", opcode_dataproc(word), opcode_condition(word),
opcode_s(word));
if ((word & 0x01800000) != 0x01000000)
printf("r%d, ", (word >> 12) & 0x0f);
if ((word & 0x01a00000) != 0x01a00000)
printf("r%d, ", (word >> 16) & 0x0f);
if (word & 0x02000000)
{
printf("#&%08x", (word & 0xff) << (((word >> 7) & 0x1e)));
}
else
{
register_shift(word);
}
return(addr);
}
static u_int
instruction_swap(addr, word)
u_int addr;
u_int word;
{
printf("SWP%s%s\t", opcode_condition(word), opcode_b(word));
printf("r%d, r%d, [r%d]", (word >> 12) & 0x0f, (word & 0x0f),
(word >> 16) & 0x0f);
return(addr);
}
static u_int
instruction_mrs(addr, word)
u_int addr;
u_int word;
{
printf("MRS%s\tr%d, ", opcode_condition(word), (word >> 12) & 0x0f);
printf("%s", (word & 0x00400000) ? "SPSR" : "CPSR");
return(addr);
}
static u_int
instruction_msr(addr, word)
u_int addr;
u_int word;
{
printf("MSR%s\t", opcode_condition(word));
printf("%s, r%d", (word & 0x00400000) ? "SPSR" : "CPSR", word & 0x0f);
return(addr);
}
static u_int
instruction_msrf(addr, word)
u_int addr;
u_int word;
{
printf("MSR%s\t", opcode_condition(word));
printf("%s_flg, ", (word & 0x00400000) ? "SPSR" : "CPSR");
if (word & 0x02000000)
printf("#0x%08x", (word & 0xff) << (32 - ((word >> 7) & 0x1e)));
else
printf("r%d", word &0x0f);
return(addr);
}
static u_int
instruction_mrcmcr(addr, word)
u_int addr;
u_int word;
{
printf("%s%s\t", (word & (1 << 20)) ? "MRC" : "MCR",
opcode_condition(word));
printf("CP #%d, %d, ", (word >> 8) & 0x0f, (word >> 21) & 0x07);
printf("r%d, cr%d, cr%d", (word >> 12) & 0x0f, (word >> 16) & 0x0f,
word & 0x0f);
if (((word >> 5) & 0x07) != 0)
printf(", %d", (word >> 5) & 0x07);
return(addr);
}
static u_int
instruction_cdp(addr, word)
u_int addr;
u_int word;
{
printf("CDP%s\t", opcode_condition(word));
printf("CP #%d, %d, ", (word >> 8) & 0x0f, (word >> 20) & 0x0f);
printf("cr%d, cr%d, cr%d", (word >> 12) & 0x0f, (word >> 16) & 0x0f,
word & 0x0f);
printf(", %d", (word >> 5) & 0x07);
return(addr);
}
static u_int
instruction_cdt(addr, word)
u_int addr;
u_int word;
{
printf("%s%s%s\t", (word & (1 << 20)) ? "LDC" : "STC",
opcode_condition(word), (word & (1 << 22)) ? "L" : "");
printf("CP #%d, cr%d, ", (word >> 8) & 0x0f, (word >> 12) & 0x0f);
printf("[r%d", (word >> 16) & 0x0f);
printf("%s, ", (word & (1 << 24)) ? "" : "]");
if (!(word & (1 << 23)))
printf("-");
printf("#0x%02x", word & 0xff);
if (word & (1 << 24))
printf("]");
if (word & (1 << 21))
printf("!");
return(addr);
}
static u_int
instruction_fpabinop(addr, word)
u_int addr;
u_int word;
{
printf("%s%s%s%s\t", opcode_fpabinop(word), opcode_condition(word),
opcode_fpaprec(word), opcode_fparnd(word));
printf("f%d, f%d, ", (word >> 12) & 0x07, (word >> 16) & 0x07);
if (word & (1 << 3))
printf("#%s", opcode_fpaimm(word));
else
printf("f%d", word & 0x07);
return(addr);
}
static u_int
instruction_fpaunop(addr, word)
u_int addr;
u_int word;
{
printf("%s%s%s%s\t", opcode_fpaunop(word), opcode_condition(word),
opcode_fpaprec(word), opcode_fparnd(word));
printf("f%d, ", (word >> 12) & 0x07);
if (word & (1 << 3))
printf("#%s", opcode_fpaimm(word));
else
printf("f%d", word & 0x07);
return(addr);
}
static u_int
instruction_ldfstf(addr, word)
u_int addr;
u_int word;
{
printf("%s%s%s\t", (word & (1 << 20)) ? "LDF" : "STF",
opcode_condition(word), (word & (1 << 22)) ? "L" : "");
printf("f%d, [r%d", (word >> 12) & 0x07, (word >> 16) & 0x0f);
printf("%s, ", (word & (1 << 24)) ? "" : "]");
if (!(word & (1 << 23)))
printf("-");
printf("#0x%03x", (word & 0xff) << 2);
if (word & (1 << 24))
printf("]");
if (word & (1 << 21))
printf("!");
return(addr);
}
/* End of kshell_disassem.c */

View File

@ -1,4 +1,4 @@
/* $NetBSD: kshell_dumphex.c,v 1.4 1996/10/13 03:06:06 christos Exp $ */
/* $NetBSD: kshell_dumphex.c,v 1.5 1997/10/14 09:01:41 mark Exp $ */
/*
* Copyright (c) 1994 Mark Brinicombe.
@ -130,4 +130,4 @@ dumpw(addr, count)
}
}
/* End of dumphex.c */
/* End of kshell_dumphex.c */

View File

@ -1,4 +1,4 @@
/* $NetBSD: kshell_input.c,v 1.5 1996/10/13 03:06:07 christos Exp $ */
/* $NetBSD: kshell_input.c,v 1.6 1997/10/14 09:01:42 mark Exp $ */
/*
* Copyright (c) 1994 Mark Brinicombe.
@ -295,4 +295,4 @@ deleteline(loop, entered)
}
}
/* End of shell_input.c */
/* End of kshell_input.c */

View File

@ -1,4 +1,4 @@
/* $NetBSD: kshell_shell.c,v 1.11 1996/10/17 02:43:38 mark Exp $ */
/* $NetBSD: kshell_shell.c,v 1.12 1997/10/14 09:01:43 mark Exp $ */
/*
* Copyright (c) 1994-1996 Mark Brinicombe.
@ -517,7 +517,7 @@ shell_wakeup(argc, argv)
/* shell - a crude shell */
int
shell()
kshell()
{
int quit = 0;
char buffer[200];
@ -691,4 +691,4 @@ shell()
return(0);
}
/* End of shell_shell.c */
/* End of kshell_shell.c */