This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RFA: Make --memory-info work for MIPS simulators
- From: Nick Clifton <nickc at redhat dot com>
- To: ths at mips dot com, ths at networkno dot de
- Cc: gdb-patches at sourceware dot org
- Date: Fri, 10 Aug 2007 11:38:10 +0100
- Subject: RFA: Make --memory-info work for MIPS simulators
Hi Thiemo,
The --memory-info command line switch (and its alias --info-memory)
do not work for the MIPS simulator because the memory regions are
not set up until after the command line has been parsed. The
attached patch fixes this by delaying the processing of
--memory-info until after the regions have been initialized.
The patch does have one slightly dubious component - it removes the
mips specific command line options table from the linked list of
options tables once the command line has been processed. It does
this so that the real handler for --memory-info can be called via
the sim_do_commandf() function. I think that this is safe, since
there is no longer any need to process mips specific command line
switches.
Before the patch:
% mips64vrel-elf-run --memory-info a.out
Memory maps:
After the patch:
% mips64vrel-elf-run --memory-info a.out
Memory maps:
memory region 0x7fff8000,0x8000
memory alias 0xa0000000@0x1,0x20000000%0x800000,0x80000000@0x1
May I apply this patch please ?
Cheers
Nick
PS. The sim/MAINTAINERS file has your email address as
<ths@networkno.de>, judging from the ChangeLog though, I guessed that
this was incorrect.
sim/mips/ChangeLog
2007-08-10 Nick Clifton <nickc@redhat.com>
* interp.c (options enum): Add OPTION_INFO_MEMORY.
(display_mem_info): New static variable.
(mips_option_handler): Handle OPTION_INFO_MEMORY.
(mips_options): Add info-memory and memory-info.
(sim_open): After processing the command line and board
specification, check display_mem_info. If it is set then
call the real handler for the --memory-info command line
switch.
Index: sim/mips/interp.c
===================================================================
RCS file: /cvs/src/src/sim/mips/interp.c,v
retrieving revision 1.23
diff -c -3 -p -r1.23 interp.c
*** sim/mips/interp.c 19 Feb 2007 17:46:53 -0000 1.23
--- sim/mips/interp.c 10 Aug 2007 10:29:49 -0000
*************** enum {
*** 180,188 ****
--- 180,190 ----
OPTION_DINERO_TRACE = OPTION_START,
OPTION_DINERO_FILE,
OPTION_FIRMWARE,
+ OPTION_INFO_MEMORY,
OPTION_BOARD
};
+ static int display_mem_info = 0;
static SIM_RC
mips_option_handler (sd, cpu, opt, arg, is_command)
*************** Re-compile simulator with \"-DTRACE\" to
*** 259,264 ****
--- 261,270 ----
}
return SIM_RC_OK;
}
+
+ case OPTION_INFO_MEMORY:
+ display_mem_info = 1;
+ break;
}
return SIM_RC_OK;
*************** static const OPTION mips_options[] =
*** 290,295 ****
--- 296,315 ----
, "Customize simulation for a particular board.", mips_option_handler },
+ /* These next two options have the same names as ones found in the
+ memory_options[] array in common/sim-memopt.c. This is because
+ the intention is to provide an alternative handler for those two
+ options. We need an alternative handler because the memory
+ regions are not set up until after the command line arguments
+ have been parsed, and so we cannot display the memory info whilst
+ processing the command line. There is a hack in sim_open to
+ remove these handlers when we want the real --memory-info option
+ to work. */
+ { { "info-memory", no_argument, NULL, OPTION_INFO_MEMORY },
+ '\0', NULL, "List configured memory regions", mips_option_handler },
+ { { "memory-info", no_argument, NULL, OPTION_INFO_MEMORY },
+ '\0', NULL, NULL, mips_option_handler },
+
{ {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL }
};
*************** sim_open (kind, cb, abfd, argv)
*** 587,592 ****
--- 607,637 ----
}
#endif
+ if (display_mem_info)
+ {
+ struct option_list * ol;
+ struct option_list * prev;
+
+ /* This is a hack. We want to execute the real --memory-info command
+ line switch which is handled in common/sim-memopts.c, not the
+ override we have defined in this file. So we remove the
+ mips_options array from the state options list. This is safe
+ because we have now processed all of the command line. */
+ for (ol = STATE_OPTIONS (sd), prev = NULL;
+ ol != NULL;
+ prev = ol, ol = ol->next)
+ if (ol->options == mips_options)
+ break;
+
+ SIM_ASSERT (ol != NULL);
+
+ if (prev == NULL)
+ STATE_OPTIONS (sd) = ol->next;
+ else
+ prev->next = ol->next;
+
+ sim_do_commandf (sd, "memory-info");
+ }
/* check for/establish the a reference program image */
if (sim_analyze_program (sd,