summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/ddb/db_command.c40
-rw-r--r--sys/ddb/ddb.h10
-rw-r--r--sys/ia64/ia64/db_interface.c20
-rw-r--r--sys/ia64/include/db_machdep.h4
4 files changed, 58 insertions, 16 deletions
diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c
index 904b6a6..238a9f9 100644
--- a/sys/ddb/db_command.c
+++ b/sys/ddb/db_command.c
@@ -472,6 +472,25 @@ db_error(s)
* Call random function:
* !expr(arg,arg,arg)
*/
+
+/* The generic implementation supports a maximum of 10 arguments. */
+typedef db_expr_t __db_f(db_expr_t, db_expr_t, db_expr_t, db_expr_t,
+ db_expr_t, db_expr_t, db_expr_t, db_expr_t, db_expr_t, db_expr_t);
+
+static __inline int
+db_fncall_generic(db_expr_t addr, db_expr_t *rv, int nargs, db_expr_t args[])
+{
+ __db_f *f = (__db_f *)addr;
+
+ if (nargs > 10) {
+ db_printf("Too many arguments (max 10)\n");
+ return (0);
+ }
+ *rv = (*f)(args[0], args[1], args[2], args[3], args[4], args[5],
+ args[6], args[7], args[8], args[9]);
+ return (1);
+}
+
static void
db_fncall(dummy1, dummy2, dummy3, dummy4)
db_expr_t dummy1;
@@ -480,14 +499,9 @@ db_fncall(dummy1, dummy2, dummy3, dummy4)
char * dummy4;
{
db_expr_t fn_addr;
-#define MAXARGS 11 /* XXX only 10 are passed */
- db_expr_t args[MAXARGS];
+ db_expr_t args[DB_MAXARGS];
int nargs = 0;
db_expr_t retval;
- typedef db_expr_t fcn_10args_t(db_expr_t, db_expr_t, db_expr_t,
- db_expr_t, db_expr_t, db_expr_t, db_expr_t,
- db_expr_t, db_expr_t, db_expr_t);
- fcn_10args_t *func;
int t;
if (!db_expression(&fn_addr)) {
@@ -495,15 +509,14 @@ db_fncall(dummy1, dummy2, dummy3, dummy4)
db_flush_lex();
return;
}
- func = (fcn_10args_t *)fn_addr; /* XXX */
t = db_read_token();
if (t == tLPAREN) {
if (db_expression(&args[0])) {
nargs++;
while ((t = db_read_token()) == tCOMMA) {
- if (nargs == MAXARGS) {
- db_printf("Too many arguments\n");
+ if (nargs == DB_MAXARGS) {
+ db_printf("Too many arguments (max %d)\n", DB_MAXARGS);
db_flush_lex();
return;
}
@@ -524,13 +537,8 @@ db_fncall(dummy1, dummy2, dummy3, dummy4)
}
db_skip_to_eol();
- while (nargs < MAXARGS) {
- args[nargs++] = 0;
- }
-
- retval = (*func)(args[0], args[1], args[2], args[3], args[4],
- args[5], args[6], args[7], args[8], args[9] );
- db_printf("%#lr\n", (long)retval);
+ if (DB_CALL(fn_addr, &retval, nargs, args))
+ db_printf("= %#lr\n", (long)retval);
}
static void
diff --git a/sys/ddb/ddb.h b/sys/ddb/ddb.h
index 3264fff..a9cd0f2 100644
--- a/sys/ddb/ddb.h
+++ b/sys/ddb/ddb.h
@@ -39,6 +39,16 @@
#include <machine/db_machdep.h> /* type definitions */
+#ifndef DB_MAXARGS
+#define DB_MAXARGS 10
+#endif
+
+#ifndef DB_CALL
+#define DB_CALL db_fncall_generic
+#else
+int DB_CALL(db_expr_t, db_expr_t *, int, db_expr_t[]);
+#endif
+
typedef void db_cmdfcn_t(db_expr_t addr, boolean_t have_addr, db_expr_t count,
char *modif);
diff --git a/sys/ia64/ia64/db_interface.c b/sys/ia64/ia64/db_interface.c
index 53897b0..6d8a188 100644
--- a/sys/ia64/ia64/db_interface.c
+++ b/sys/ia64/ia64/db_interface.c
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <machine/db_machdep.h>
#include <machine/frame.h>
+#include <machine/md_var.h>
#include <machine/mutex.h>
#include <machine/setjmp.h>
@@ -443,6 +444,25 @@ out:
return (loc + slot);
}
+typedef db_expr_t __db_f(db_expr_t, db_expr_t, db_expr_t, db_expr_t, db_expr_t,
+ db_expr_t, db_expr_t, db_expr_t);
+
+register uint64_t __db_gp __asm__("gp");
+
+int
+db_fncall_ia64(db_expr_t addr, db_expr_t *rv, int nargs, db_expr_t args[])
+{
+ struct ia64_fdesc fdesc;
+ __db_f *f;
+
+ f = (__db_f *)&fdesc;
+ fdesc.func = addr;
+ fdesc.gp = __db_gp; /* XXX doesn't work for modules. */
+ *rv = (*f)(args[0], args[1], args[2], args[3], args[4], args[5],
+ args[6], args[7]);
+ return (1);
+}
+
void
db_show_mdpcpu(struct pcpu *pc)
{
diff --git a/sys/ia64/include/db_machdep.h b/sys/ia64/include/db_machdep.h
index 5d5c7a5..cbf01a7 100644
--- a/sys/ia64/include/db_machdep.h
+++ b/sys/ia64/include/db_machdep.h
@@ -73,4 +73,8 @@ void db_bkpt_skip(void);
#define branch_taken(ins, pc, regs) pc
+/* Function call support. */
+#define DB_MAXARGS 8 /* Only support arguments in registers. */
+#define DB_CALL db_fncall_ia64
+
#endif /* _MACHINE_DB_MACHDEP_H_ */
OpenPOWER on IntegriCloud