1 <!-- Copyright (C) 2003 Red Hat, Inc. -->
2 <!-- This material may be distributed only subject to the terms -->
3 <!-- and conditions set forth in the Open Publication License, v1.0 -->
4 <!-- or later (the latest version is presently available at -->
5 <!-- http://www.opencontent.org/openpub/). -->
6 <!-- Distribution of the work or derivative of the work in any -->
7 <!-- standard (paper) book form is prohibited unless prior -->
8 <!-- permission is obtained from the copyright holder. -->
12 >Virtual Vectors (eCos/ROM Monitor Calling Interface)</TITLE
13 ><meta name="MSSmartTagsPreventParsing" content="TRUE">
16 CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
19 TITLE="eCos Reference Manual"
20 HREF="ecos-ref.html"><LINK
22 TITLE=" Porting Guide"
23 HREF="hal-porting-guide.html"><LINK
26 HREF="hal-porting-structure.html"><LINK
28 TITLE="HAL Coding Conventions"
29 HREF="hal-porting-coding-conventions.html"></HEAD
40 SUMMARY="Header navigation table"
49 >eCos Reference Manual</TH
57 HREF="hal-porting-structure.html"
65 >Chapter 11. Porting Guide</TD
71 HREF="hal-porting-coding-conventions.html"
85 NAME="HAL-CALLING-IF">Virtual Vectors (eCos/ROM Monitor Calling Interface)</H1
87 >Some eCos platforms have supported full debugging capabilities via
88 CygMon since day one. Platforms of the architectures PowerPC, ARM, and
89 SH do not provide those features unless a GDB stub is included in the
92 >This is going to change. All platforms will (eventually) support
93 all the debugging features by relying on a ROM/RAM calling interface
94 (also referred to as virtual vector table) provided by the ROM
95 monitor. This calling interface is based on the tables used by libbsp
96 and is thus backwards compatible with the existing CygMon supported
103 NAME="HAL-PORTING-VIRTUAL-VECTORS">Virtual Vectors</H2
105 >What are virtual vectors, what do they do, and why are they
108 >"Virtual vectors" is the name of a table located at a static
109 location in the target address space. This table contains 64 vectors
116 > functions or data.</P
118 >The fact that the vectors are always placed at the same location in
119 the address space means that both ROM and RAM startup configurations
120 can access these and thus the services pointed to.</P
122 >The primary goal is to allow services to be provided by ROM
123 configurations (ROM monitors such as RedBoot in particular) with
130 > in RAM configurations being able to use these
133 >Without the table of pointers this would be impossible since the
134 ROM and RAM applications would be linked separately - in effect having
135 separate name spaces - preventing direct references from one to the
138 >This decoupling of service from client is needed by RedBoot,
139 allowing among other things debugging of applications which do not
140 contain debugging client code (stubs).</P
146 NAME="AEN8971">Initialization (or Mechanism vs. Policy)</H3
148 >Virtual vectors are a <SPAN
154 > for decoupling services
155 from clients in the address space.</P
157 >The mechanism allows services to be implemented by a ROM
158 monitor, a RAM application, to be switched out at run-time, to be
159 disabled by installing pointers to dummy functions, etc.</P
161 >The appropriate use of the mechanism is specified loosely by a
168 >. The general policy dictates that the vectors are
169 initialized in whole by ROM monitors (built for ROM or RAM), or by
170 stand-alone applications.</P
172 >For configurations relying on a ROM monitor environment, the policy
173 is to allow initialization on a service by service basis. The default
174 is to initialize all services, except COMMS services since these are
175 presumed to already be carrying a communication session to the
176 debugger / console which was used for launching the application. This
177 means that the bulk of the code gets tested in normal builds, and not
178 just once in a blue moon when building new stubs or a ROM
181 >The configuration options are written to comply with this policy by
182 default, but can be overridden by the user if desired. Defaults
189 >For application development: the ROM monitor provides
190 debugging and diagnostic IO services, the RAM application relies
191 on these by default.</P
195 >For production systems: the application contains all the
196 necessary services.</P
205 NAME="AEN8985">Pros and Cons of Virtual Vectors</H3
207 >There are pros and cons associated with the use of virtual
208 vectors. We do believe that the pros generally outweigh the cons by a
209 great margin, but there may be situations where the opposite is
212 >The use of the services are implemented by way of macros, meaning
213 that it is possible to circumvent the virtual vectors if
214 desired. There is (as yet) no implementation for doing this, but it is
217 >Here is a list of pros and cons:</P
224 >Pro: Allows debugging without including stubs</DT
227 >This is the primary reason for using virtual vectors. It
228 allows the ROM monitor to provide most of the debugging
229 infrastructure, requiring only the application to provide
230 hooks for asynchronous debugger interrupts and for accessing
231 kernel thread information.</P
234 >Pro: Allows debugging to be initiated from arbitrary
238 > While this is only true where the application does not
239 actively override the debugging channel setup, it is a very
240 nice feature during development. In particular it makes it
241 possible to launch (and/or debug) applications via Ethernet
242 even though the application configuration does not contain
243 networking support.</P
246 >Pro: Image smaller due to services being provided by ROM
250 >All service functions except HAL IO are included in the
251 default configuration. But if these are all disabled the
252 image for download will be a little smaller. Probably
253 doesn't matter much for regular development, but it is a
254 worthwhile saving for the 20000 daily tests run in the Red
255 Hat eCos test farm.</P
258 >Con: The vectors add a layer of indirection, increasing application
259 size and reducing performance.</DT
262 >The size increase is a fraction of what is required to
263 implement the services. So for RAM configurations there is
264 a net saving, while for ROM configurations there is a small
267 >The performance loss means little for most of the
268 services (of which the most commonly used is diagnostic IO
269 which happens via polled routines
273 >Con: The layer of indirection is another point of
277 > The concern primarily being that of vectors being
278 trashed by rogue writes from bad code, causing a complete
279 loss of the service and possibly a crash. But this does
280 not differ much from a rogue write to anywhere else in the
281 address space which could cause the same amount of
282 mayhem. But it is arguably an additional point of failure
283 for the service in question.</P
286 >Con: All the indirection stuff makes it harder to bring a HAL
290 > This is a valid concern. However, seeing as most of the
291 code in question is shared between all HALs and should
292 remain unchanged over time, the risk of it being broken
293 when a new HAL is being worked on should be
296 > When starting a new port, be sure to implement the HAL
297 IO drivers according to the scheme used in other drivers,
298 and there should be no problem.</P
300 > However, it is still possible to circumvent the vectors
301 if they are suspect of causing problems: simply change the
302 HAL_DIAG_INIT and HAL_DIAG_WRITE_CHAR macros to use the raw
313 NAME="AEN9018">Available services</H3
318 > file in the common HAL defines the
319 complete list of available services. A few worth mentioning in
326 >COMMS services. All HAL IO happens via the communication
331 >uS delay. Fine granularity (busy wait) delay function.</P
335 >Reset. Allows a software initiated reset of the board.</P
345 NAME="AEN9029">The COMMS channels</H2
347 >As all HAL IO happens via the COMMS channels these deserve to be
348 described in a little more detail. In particular the controls of where
349 diagnostic output is routed and how it is treated to allow for display
356 NAME="AEN9032">Console and Debugging Channels</H3
358 >There are two COMMS channels - one for console IO and one for
359 debugging IO. They can be individually configured to use any of the
360 actual IO ports (serial or Ethernet) available on the platform.</P
362 >The console channel is used for any IO initiated by calling the
366 > functions. Note that these should only be used during
367 development for debugging, assertion and possibly tracing
368 messages. All proper IO should happen via proper devices. This means
369 it should be possible to remove the HAL device drivers from production
370 configurations where assertions are disabled.</P
372 >The debugging channel is used for communication between the
373 debugger and the stub which remotely controls the target for the
374 debugger (the stub runs on the target). This usually happens via some
375 protocol, encoding commands and replies in some suitable form.</P
377 >Having two separate channels allows, e.g., for simple logging
378 without conflicts with the debugger or interactive IO which some
379 debuggers do not allow.</P
386 NAME="AEN9039">Mangling</H3
388 >As debuggers usually have a protocol using specialized commands
389 when communicating with the stub on the target, sending out text as
390 raw ASCII from the target on the same channel will either result in
391 protocol errors (with loss of control over the target) or the text may
392 just be ignored as junk by the debugger.</P
394 >To get around this, some debuggers have a special command for text
395 output. Mangling is the process of encoding diagnostic ASCII text
396 output in the form specified by the debugger protocol.</P
398 >When it is necessary to use mangling, i.e. when writing console
399 output to the same port used for debugging, a mangler function is
400 installed on the console channel which mangles the text and passes it
401 on to the debugger channel.</P
408 NAME="AEN9044">Controlling the Console Channel</H3
410 >Console output configuration is either inherited from the ROM
411 monitor launching the application, or it is specified by the
412 application. This is controlled by the new option
415 >CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE</TT
417 defaults to enabled when the configuration is set to use a ROM
420 >If the user wants to specify the console configuration in the
421 application image, there are two new options that are used for
424 >Defaults are to direct diagnostic output via a mangler to the
425 debugging channel (<TT
427 >CYGDBG_HAL_DIAG_TO_DEBUG_CHAN</TT
429 enabled). The mangler type is controlled by the option
432 >CYGSEM_HAL_DIAG_MANGLER</TT
433 >. At present there are only
434 two mangler types:</P
447 > This causes a mangler appropriate for debugging with GDB to be
448 installed on the console channel.</P
454 > This causes a NULL mangler to be installed on the console
455 channel. It will redirect the IO to/from the debug channel
456 without mangling of the data. This option differs from setting
457 the console channel to the same IO port as the debugging
458 channel in that it will keep redirecting data to the debugging
459 channel even if that is changed to some other port.</P
464 >Finally, by disabling <TT
466 >CYGDBG_HAL_DIAG_TO_DEBUG_CHAN</TT
468 output is directed in raw form to the specified console IO port.</P
470 >In summary this results in the following common configuration
471 scenarios for RAM startup configurations:</P
477 > For regular debugging with diagnostic output appearing in the
478 debugger, mangling is enabled and stubs disabled.</P
480 >Diagnostic output appears via the debugging channel as
481 initiated by the ROM monitor, allowing for correct behavior
482 whether the application was launched via serial or Ethernet, from
483 the RedBoot command line or from a debugger.</P
487 > For debugging with raw diagnostic output, mangling is
490 > Debugging session continues as initiated by the ROM monitor,
491 whether the application was launched via serial or
492 Ethernet. Diagnostic output is directed at the IO port configured
493 in the application configuration.</P
501 > There is one caveat to be aware of. If the
502 application uses proper devices (be it serial or Ethernet) on
503 the same ports as those used by the ROM monitor, the
504 connections initiated by the ROM monitor will be
511 >And for ROM startup configurations:</P
517 > Production configuration with raw output and no debugging
518 features (configured for RAM or ROM), mangling is disabled, no
519 stubs are included.</P
521 >Diagnostic output appears (in unmangled form) on the specified
526 > RedBoot configuration, includes debugging features and necessary
529 >Diagnostic and debugging output port is auto-selected by the
530 first connection to any of the supported IO ports. Can change
531 from interactive mode to debugging mode when a debugger is
532 detected - when this happens a mangler will be installed as
537 > GDB stubs configuration (obsoleted by RedBoot configuration),
538 includes debugging features, mangling is hardwired to GDB
541 >Diagnostic and debugging output is hardwired to configured IO
542 ports, mangling is hardwired.</P
551 NAME="AEN9086">Footnote: Design Reasoning for Control of Console Channel</H3
553 >The current code for controlling the console channel is a
554 replacement for an older implementation which had some shortcomings
555 which addressed by the new implementation.</P
557 >This is what the old implementation did: on initialization it would
558 check if the CDL configured console channel differed from the active
559 debug channel - and if so, set the console channel, thereby disabling
562 >The idea was that whatever channel was configured to be used for
563 console (i.e., diagnostic output) in the application was what should
564 be used. Also, it meant that if debug and console channels were
565 normally the same, a changed console channel would imply a request for
568 >But this prevented at least two things:</P
574 > It was impossible to inherit the existing connection by which
575 the application was launched (either by RedBoot commands via
576 telnet, or by via a debugger).</P
578 >This was mostly a problem on targets supporting Ethernet
579 access since the diagnostic output would not be returned via the
580 Ethernet connection, but on the configured serial port.</P
582 >The problem also occurred on any targets with multiple serial
583 ports where the ROM monitor was configured to use a different
584 port than the CDL defaults.</P
588 > Proper control of when to mangle or just write out raw ASCII
591 >Sometimes it's desirable to disable mangling, even if the
592 channel specified is the same as that used for debugging. This
593 usually happens if GDB is used to download the application, but
594 direct interaction with the application on the same channel is
595 desired (GDB protocol only allows output from the target, no
606 NAME="AEN9100">The calling Interface API</H2
608 >The calling interface API is defined by hal_if.h and hal_if.c in
611 >The API provides a set of services. Different platforms, or
612 different versions of the ROM monitor for a single platform, may
613 implement fewer or extra service. The table has room for growth, and
614 any entries which are not supported map to a NOP-service (when called
620 >A client of a service should either be selected by configuration,
621 or have suitable fall back alternatives in case the feature is not
622 implemented by the ROM monitor.</P
630 >Checking for unimplemented service when this may be a data
631 field/pointer instead of a function: suggest reserving the last entry
632 in the table as the NOP-service pointer. Then clients can compare a
633 service entry with this pointer to determine whether it's initialized
640 >cyg/hal/hal_if.h</TT
642 the table layout and accessor macros (allowing primitive type
643 checking and alternative implementations should it become necessary).</P
649 initialization function. All HALs should call this during platform
650 initialization - the table will get initialized according to
651 configuration. Also defined here are wrapper functions which map
652 between the calling interface API and the API of the used eCos
659 NAME="AEN9113">Implemented Services</H3
661 >This is a brief description of the services, some of which are
662 described in further detail below.</P
675 >Version of table. Serves as a way to check for how many
676 features are available in the table. This is the index of the
677 last service in the table.</P
686 >[Presently unused by the stub code, but initialized] This
687 vector defines a function to execute when the system receives
688 a kill signal from the debugger. It is initialized with the
689 reset function (see below), but the application (or eCos) can
690 override it if necessary.</P
699 >The communication procedure table used for console IO
701 HREF="hal-calling-if.html#HAL-PORTING-IO-CHANNELS"
702 >the Section called <I
714 >The communication procedure table used for debugger IO
716 HREF="hal-calling-if.html#HAL-PORTING-IO-CHANNELS"
717 >the Section called <I
729 >Flushes the data cache for the specified
730 region. Some implementations may flush the entire data cache.</P
739 >Flushes (invalidates) the instruction cache
740 for the specified region. Some implementations may flush the
741 entire instruction cache.</P
750 >Change debugging communication channel.</P
755 >SET_CONSOLE_COMM</TT
759 >Change console communication channel.</P
768 >Vector used to communication between debugger functions in
769 ROM and in RAM. RAM eCos configurations may install a function
770 pointer here which the ROM monitor uses to get thread
771 information from the kernel running in RAM.</P
780 >Resets the board on call. If it is not possible to reset
781 the board from software, it will jump to the ROM entry point
782 which will perform a "software" reset of the board.</P
787 >CONSOLE_INTERRUPT_FLAG</TT
791 >Set if a debugger interrupt request was detected while
792 processing console IO. Allows the actual breakpoint action to
793 be handled after return to RAM, ensuring proper backtraces
803 >Will delay the specified number of microseconds. The
804 precision is platform dependent to some extend - a small value
805 (<100us) is likely to cause bigger delays than requested.</P
814 >For accessing configuration settings kept in flash memory.</P
823 >Installs a breakpoint at the specified address. This is
824 used by the asynchronous breakpoint support
835 NAME="AEN9189">Compatibility</H3
837 >When a platform is changed to support the calling interface,
838 applications will use it if so configured. That means that if an
839 application is run on a platform with an older ROM monitor, the
840 service is almost guaranteed to fail.</P
842 >For this reason, applications should only use Console Comm for HAL
843 diagnostics output if explicitly configured to do so
846 >CYGSEM_HAL_VIRTUAL_VECTOR_DIAG</TT
849 >As for asynchronous GDB interrupts, the service will always be
850 used. This is likely to cause a crash under older ROM monitors, but
851 this crash may be caught by the debugger. The old workaround still
852 applies: if you need asynchronous breakpoints or thread debugging
853 under older ROM monitors, you may have to include the debugging
854 support when configuring eCos.</P
861 NAME="AEN9195">Implementation details</H3
863 >During the startup of a ROM monitor, the calling table will be
864 initialized. This also happens if eCos is configured <SPAN
879 > There is reserved space (256 bytes) for the vector
880 table whether it gets used or not. This may be something that we want
881 to change if we ever have to shave off every last byte for a given
886 >If thread debugging features are enabled, the function for accessing
887 the thread information gets registered in the table during startup of
888 a RAM startup configuration.</P
890 >Further implementation details are described where the service itself
898 NAME="AEN9204">New Platform Ports</H3
902 >hal_platform_init()</TT
909 >The HAL serial driver must, when called via
912 >cyg_hal_plf_comms_init()</TT
913 > must initialize the
914 communication channels.</P
919 > function defined in
923 > will attempt to do a hardware reset, but
924 if this fails it will fall back to simply jumping to the reset
925 entry-point. On most platforms the startup initialization will go a
926 long way to reset the target to a sane state (there will be
927 exceptions, of course). For this reason, make sure to define
930 >HAL_STUB_PLATFORM_RESET_ENTRY</TT
933 >All debugging features must be in place in order for the debugging
934 services to be functional. See general platform porting notes.</P
941 NAME="AEN9216">New architecture ports</H3
943 >There are no specific requirements for a new architecture port in
944 order to support the calling interface, but the basic debugging
945 features must be in place. See general architecture porting notes.</P
953 NAME="HAL-PORTING-IO-CHANNELS">IO channels</H2
955 >The calling interface provides procedure tables for all IO channels on
956 the platform. These are used for console (diagnostic) and debugger IO,
957 allowing a ROM monitor to provided all the needed IO routines. At
958 the same time, this makes it easy to switch console/debugger channels
959 at run-time (the old implementation had hardwired drivers for console
960 and debugger IO, preventing these to change at run-time).</P
962 >The hal_if provides wrappers which interface these services to the
963 eCos infrastructure diagnostics routines. This is done in a way which
964 ensures proper string mangling of the diagnostics output when required
965 (e.g. O-packetization when using a GDB compatible ROM monitor).</P
971 NAME="AEN9223">Available Procedures</H3
973 >This is a brief description of the procedures</P
986 >Pointer to the controller IO base (or a pointer to a per-device
987 structure if more data than the IO base is required). All the
988 procedures below are called with this data item as the first
998 >Writes the buffer to the device.</P
1007 >Fills a buffer from the device.</P
1016 >Write a character to the device.</P
1025 >Read a character from the device.</P
1034 >Device feature control. Second argument specifies function:</P
1038 CLASS="VARIABLELIST"
1047 >Changes baud rate.</P
1056 >Returns the current baud rate.</P
1061 >INSTALL_DBG_ISR</TT
1083 >Disable debugging receive interrupts on the device.</P
1092 >Enable debugging receive interrupts on the device.</P
1101 >Returns the ISR vector used by the device for debugging
1102 receive interrupts.</P
1111 >Set GETC timeout in milliseconds.</P
1120 >Forces driver to flush data in its buffers. Note
1121 that this may not affect hardware buffers
1134 >ISR used to handle receive interrupts from the
1144 >Read a character from the device with timeout.</P
1154 NAME="AEN9313">Usage</H3
1156 >The standard eCos diagnostics IO functions use the channel
1157 procedure table when <TT
1159 >CYGSEM_HAL_VIRTUAL_VECTOR_DIAG</TT
1161 means that when you use diag_printf (or the libc printf function) the
1162 stream goes through the selected console procedure table. If you use
1163 the virtual vector function SET_CONSOLE_COMM you can change the device
1164 which the diagnostics output goes to at run-time.</P
1166 >You can also use the table functions directly if desired
1167 (regardless of the <TT
1169 >CYGSEM_HAL_VIRTUAL_VECTOR_DIAG</TT
1170 > setting - assuming
1171 the ROM monitor provides the services). Here is a small example which
1172 changes the console to use channel 2, fetches the comm procs pointer
1173 and calls the write function from that table, then restores the
1174 console to the original channel:</P
1182 CLASS="PROGRAMLISTING"
1183 >#define T "Hello World!\n"
1188 hal_virtual_comm_table_t* comm;
1189 int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
1191 CYGACC_CALL_IF_SET_CONSOLE_COMM(2);
1193 comm = CYGACC_CALL_IF_CONSOLE_PROCS();
1194 CYGACC_COMM_IF_WRITE(*comm, T, strlen(T));
1196 CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);
1202 >Beware that if doing something like the above, you should only do
1203 it to a channel which does not have GDB at the other end: GDB ignores
1204 raw data, so you would not see the output.</P
1211 NAME="AEN9321">Compatibility</H3
1213 >The use of this service is controlled by the option
1216 >CYGSEM_HAL_VIRTUAL_VECTOR_DIAG</TT
1217 > which is disabled per default on most
1218 older platforms (thus preserving backwards compatibility with older
1219 stubs). On newer ports, this option should always be set.</P
1226 NAME="AEN9325">Implementation Details</H3
1228 >There is an array of procedure tables (raw comm channels) for each
1229 IO device of the platform which get initialized by the ROM monitor, or
1230 optionally by a RAM startup configuration (allowing the RAM
1231 configuration to take full control of the target). In addition to
1232 this, there's a special table which is used to hold mangler
1235 >The vector table defines which of these channels are selected for
1236 console and debugging IO respectively: console entry can be empty,
1237 point to mangler channel, or point to a raw channel. The debugger
1238 entry should always point to a raw channel.</P
1240 >During normal console output (i.e., diagnostic output) the console
1241 table will be used to handle IO if defined. If not defined, the debug
1242 table will be used.</P
1244 >This means that debuggers (such as GDB) which require text streams
1245 to be mangled (O-packetized in the case of GDB), can rely on the ROM
1246 monitor install mangling IO routines in the special mangler table and
1247 select this for console output. The mangler will pass the mangled data
1248 on to the selected debugging channel.</P
1250 >If the eCos configuration specifies a different console channel
1251 from that used by the debugger, the console entry will point to the
1252 selected raw channel, thus overriding any mangler provided by the ROM
1255 >See hal_if_diag_* routines in hal_if.c for more details of the stream
1256 path of diagnostic output. See <TT
1258 >cyg_hal_gdb_diag_*()</TT
1263 > for the mangler used for GDB communication.</P
1270 NAME="AEN9335">New Platform Ports</H3
1272 >Define CDL options <TT
1274 >CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS</TT
1278 >CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL</TT
1282 >CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL</TT
1287 >CYGSEM_HAL_VIRTUAL_VECTOR_DIAG</TT
1288 > is set, make sure the infra diag
1289 code uses the hal_if diag functions:</P
1297 CLASS="PROGRAMLISTING"
1298 > #define HAL_DIAG_INIT() hal_if_diag_init()
1299 #define HAL_DIAG_WRITE_CHAR(_c_) hal_if_diag_write_char(_c_)
1300 #define HAL_DIAG_READ_CHAR(_c_) hal_if_diag_read_char(&_c_)</PRE
1305 >In addition to the above functions, the platform HAL must also
1306 provide a function cyg_hal_plf_comms_init which initializes the
1307 drivers and the channel procedure tables.</P
1309 >Most of the other functionality in the table is more or less
1310 possible to copy unchanged from existing ports. Some care is necessary
1311 though to ensure the proper handling of interrupt vectors and timeouts
1312 for various devices handled by the same driver. See PowerPC/Cogent
1313 platform HAL for an example implementation.</P
1321 > When vector table console code is <SPAN
1328 the platform HAL must map the HAL_DIAG_INIT, HAL_DIAG_WRITE_CHAR and
1329 HAL_DIAG_READ_CHAR macros directly to the low-level IO functions,
1330 hardwired to use a compile-time configured channel.</P
1340 > On old ports the hardwired <TT
1346 >HAL_DIAG_WRITE_CHAR</TT
1350 >HAL_DIAG_READ_CHAR</TT
1351 > implementations will also
1352 contain code to O-packetize the output for GDB. This should
1359 > be adopted for new ports! On new ports the
1360 ROM monitor is guaranteed to provide the necessary mangling via the
1361 vector table. The hardwired configuration should be reserved for ROM
1362 startups where achieving minimal image size is crucial.</P
1373 SUMMARY="Footer navigation table"
1384 HREF="hal-porting-structure.html"
1393 HREF="ecos-ref.html"
1402 HREF="hal-porting-coding-conventions.html"
1418 HREF="hal-porting-guide.html"
1426 >HAL Coding Conventions</TD