Mercurial > flash_v2
diff packages/hal/common/current/src/generic-stub.c @ 46:797268ecc331 ecos-sw-1999-10-19
Merge from eCos master repository on 1999-10-19-18:55:31-BST
| author | jlarmour |
|---|---|
| date | Tue, 19 Oct 1999 19:19:52 +0000 |
| parents | e7ba79f6d3a8 |
| children | 1370c5e55234 |
line wrap: on
line diff
--- a/packages/hal/common/current/src/generic-stub.c +++ b/packages/hal/common/current/src/generic-stub.c @@ -818,6 +818,106 @@ void int (*_get_trace_register_hook) (regnames_t, target_register_t *); +void +stub_format_registers(char *ptr) +{ + int regnum; + + for (regnum = 0; regnum < NUMREGS_GDB; regnum++) { + /* We need to compensate for the value offset within the + register. */ + char dummyDat[32]; + target_register_t addr; + char *vptr; + int reg_valid = 1; + +#ifdef TARGET_HAS_LARGE_REGISTERS + if (sizeof (target_register_t) < REGSIZE (regnum)) { + get_register_as_bytes (regnum, dummyDat); + vptr = dummyDat; + } else +#endif + { + if (_get_trace_register_hook) + reg_valid = _get_trace_register_hook (regnum, &addr); + else + addr = get_register (regnum); + + vptr = ((char *) &addr); + if (sizeof (addr) > REGSIZE(regnum)) { + /* May need to cope with endian-ness */ + +#if !defined(__LITTLE_ENDIAN__) && !defined(_LITTLE_ENDIAN) + vptr += sizeof (addr) - REGSIZE (regnum); +#endif + } else if (sizeof (addr) < REGSIZE (regnum)) { + int off = REGSIZE (regnum) - sizeof (addr); + int x; + + for (x = 0; x < off; x++) + dummyDat[x] = 0; + memcpy (dummyDat + off, &addr, sizeof (addr)); + vptr = dummyDat; + } + } + if (reg_valid) { /* we have a valid reg value */ + ptr = __mem2hex (vptr, ptr, REGSIZE (regnum), 0); + } else { + /* Trace component returned a failure code. + This means that the register value is not available. + We'll fill it with 'x's, and GDB will understand. */ + memset (ptr, 'x', 2 * REGSIZE (regnum)); + ptr += 2 * REGSIZE (regnum); + } + } +} + +void +stub_update_registers(char *in_ptr, char *out_ptr) +{ + char *ptr = &in_ptr[1]; + int x; + int sr = 0, er = NUMREGS_GDB; + + if (*in_ptr == 'P') { + target_register_t regno; + + if (__hexToInt (&ptr, ®no) && (*ptr++ == '=')) { + + sr = regno; + er = regno + 1; + } else { + strcpy (out_ptr, "P01"); + return; + } + } + + for (x = sr; x < er; x++) { + target_register_t value = 0; + char *vptr; + +#ifdef TARGET_HAS_LARGE_REGISTERS + if (sizeof (target_register_t) < REGSIZE (x)) { + char dummyDat [32]; + + __hex2mem (ptr, dummyDat, REGSIZE (x), 0); + put_register_as_bytes (x, dummyDat); + } else +#endif + { + vptr = ((char *) &value); +#if !defined(__LITTLE_ENDIAN__) && !defined(_LITTLE_ENDIAN) + vptr += sizeof (value) - REGSIZE (x); +#endif + __hex2mem (ptr, vptr, REGSIZE (x), 0); + put_register (x, value); + } + ptr += REGSIZE (x) * 2; + } + + strcpy (out_ptr, "OK"); +} + int __process_packet (char *packet) { @@ -858,64 +958,7 @@ int case 'g': /* return the value of the CPU registers */ { char *ptr = remcomOutBuffer; - int regnum; - - for (regnum = 0; regnum < NUMREGS_GDB; regnum++) - { - /* We need to compensate for the value offset within the - register. */ - char dummyDat[32]; - target_register_t addr; - char *vptr; - int reg_valid = 1; - -#ifdef TARGET_HAS_LARGE_REGISTERS - if (sizeof (target_register_t) < REGSIZE (regnum)) - { - get_register_as_bytes (regnum, dummyDat); - vptr = dummyDat; - } - else -#endif - { - if (_get_trace_register_hook) - reg_valid = _get_trace_register_hook (regnum, &addr); - else - addr = get_register (regnum); - - vptr = ((char *) &addr); - if (sizeof (addr) > REGSIZE(regnum)) - { - /* May need to cope with endian-ness */ - -#if !defined(__LITTLE_ENDIAN__) && !defined(_LITTLE_ENDIAN) - vptr += sizeof (addr) - REGSIZE (regnum); -#endif - } - else if (sizeof (addr) < REGSIZE (regnum)) - { - int off = REGSIZE (regnum) - sizeof (addr); - int x; - - for (x = 0; x < off; x++) - dummyDat[x] = 0; - memcpy (dummyDat + off, &addr, sizeof (addr)); - vptr = dummyDat; - } - } - if (reg_valid) /* we have a valid reg value */ - { - ptr = __mem2hex (vptr, ptr, REGSIZE (regnum), 0); - } - else - { - /* Trace component returned a failure code. - This means that the register value is not available. - We'll fill it with 'x's, and GDB will understand. */ - memset (ptr, 'x', 2 * REGSIZE (regnum)); - ptr += 2 * REGSIZE (regnum); - } - } + stub_format_registers(ptr); break; } @@ -967,54 +1010,9 @@ int case 'P': case 'G': /* set the value of the CPU registers - return OK */ { - int x; - int sr = 0, er = NUMREGS_GDB; - char *ptr = &packet[1]; - - if (packet[0] == 'P') - { - target_register_t regno; - - if (__hexToInt (&ptr, ®no) - && (*ptr++ == '=')) - { - sr = regno; - er = regno + 1; - } - else - { - strcpy (remcomOutBuffer, "P01"); - break; - } - } - - for (x = sr; x < er; x++) - { - target_register_t value = 0; - char *vptr; - -#ifdef TARGET_HAS_LARGE_REGISTERS - if (sizeof (target_register_t) < REGSIZE (x)) - { - char dummyDat [32]; - - __hex2mem (ptr, dummyDat, REGSIZE (x), 0); - put_register_as_bytes (x, dummyDat); - } - else -#endif - { - vptr = ((char *) &value); -#if !defined(__LITTLE_ENDIAN__) && !defined(_LITTLE_ENDIAN) - vptr += sizeof (value) - REGSIZE (x); -#endif - __hex2mem (ptr, vptr, REGSIZE (x), 0); - put_register (x, value); - } - ptr += REGSIZE (x) * 2; - } - - strcpy (remcomOutBuffer, "OK"); + char *in_ptr = &packet[0]; + char *out_ptr = remcomOutBuffer; + stub_update_registers(in_ptr, out_ptr); break; }
