[RFC] Enable GDB handle compressed target.xml returned by GDB stub

Terry Guo
2012-06-11T07:31:13Z

Hi,

As stated in GDB document, the most natural way for gdb to get target
register information is the target.xml file returned from gdb server
or gdb stub. Normally it wouldn't be a burden for gdb server/stub to
implement such feature, but there are some gdb stubs running directly
on bare metal boards which have very limited memory/flash resources,
saving the content of target.xml file means extra storage and cost
increment. So a practical solution for such stub is to use the content
of pre-compressed target.xml file and reply host gdb with that
content. To cope with such compressed xml file, I am going to propose
following working model:
1). Use ZLIB to compress (at Z_BEST_COMPRESSION level) and decompress
the xml file in memory, don't use the gz format.
2). When reply to host gdb, the first four bytes of the packet should
be "ZLIB" and following four bytes should be the length of data before
compressed, the rest should be the compressed data. In this way, the
host gdb can know the format of received data and how to decompress
them.

I am not going to propose to adding a new feature in gdb remote serial
protocol because it is possible that a gdb server/stub can support
both ways. In addition gdb needs to know the length of uncompressed
data. Anyway we need to detect the received data to figure out its
actual format. So I plan to implement such functionality as an
extension of how gdb handle received xml file. Perhaps the right place
for this functionality is right after the call of function
fetch_available_features_from_target in function
target_read_description_xml.

Please share your thoughts and comments. All of them are welcomed.

PS:

Related background is here:
http://sourceware.org/ml/gdb-patches/2012-04/msg00971.html.

Some results from experiment:
If we use a string to store the plain xml file as below, the size of
the string is 1869 bytes.

static const char *raw_target_xml =
"<?xml version=\"1.0\"?>"
"<!-- Copyright (C) 2010, 2011 Free Software Foundation, Inc."
" Copying and distribution of this file, with or without modification,"
" are permitted in any medium without royalty provided the copyright"
" notice and this notice are preserved. -->"
" "
"<target>"
"<feature name=\"org.gnu.gdb.arm.m-profile\">"
" <reg name=\"r0\" bitsize=\"32\"/>"
" <reg name=\"r1\" bitsize=\"32\"/>"
" <reg name=\"r2\" bitsize=\"32\"/>"
" <reg name=\"r3\" bitsize=\"32\"/>"
" <reg name=\"r4\" bitsize=\"32\"/>"
" <reg name=\"r5\" bitsize=\"32\"/>"
" <reg name=\"r6\" bitsize=\"32\"/>"
" <reg name=\"r7\" bitsize=\"32\"/>"
" <reg name=\"r8\" bitsize=\"32\"/>"
" <reg name=\"r9\" bitsize=\"32\"/>"
" <reg name=\"r10\" bitsize=\"32\"/>"
" <reg name=\"r11\" bitsize=\"32\"/>"
" <reg name=\"r12\" bitsize=\"32\"/>"
" <reg name=\"sp\" bitsize=\"32\" type=\"data_ptr\"/>"
" <reg name=\"lr\" bitsize=\"32\"/>"
" <reg name=\"pc\" bitsize=\"32\" type=\"code_ptr\"/>"
" <reg name=\"xpsr\" bitsize=\"32\" regnum=\"25\"/>"
"</feature>"
"<feature name=\"org.gnu.gdb.arm.vfp\">"
" <reg name=\"d0\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d1\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d2\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d3\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d4\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d5\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d6\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d7\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d8\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d9\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d10\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d11\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d12\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d13\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d14\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"d15\" bitsize=\"64\" type=\"ieee_double\"/>"
" <reg name=\"fpscr\" bitsize=\"32\" type=\"int\" group=\"float\"/>"
"</feature>"
"</target>"
;

Then compress it with zlib function:

ret = compress2((Bytef*)dest, (uLongf *)&dlen, (const Bytef
*)raw_target_xml, (uLong)mlen, Z_BEST_COMPRESSION);

The size of compressed data is 462 bytes.

So Jonathan: is this size acceptable to eCos stub?

BR,
Terry