aboutsummaryrefslogtreecommitdiffstats
path: root/tools/debugger/gdbsx/gx/gx_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/debugger/gdbsx/gx/gx_utils.c')
-rw-r--r--tools/debugger/gdbsx/gx/gx_utils.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/tools/debugger/gdbsx/gx/gx_utils.c b/tools/debugger/gdbsx/gx/gx_utils.c
new file mode 100644
index 0000000000..e87ffcb730
--- /dev/null
+++ b/tools/debugger/gdbsx/gx/gx_utils.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2009, Mukesh Rathor, Oracle Corp. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License v2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 021110-1307, USA.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdarg.h>
+
+#include "gx.h"
+
+
+void
+gxprt(const char *fmt, ...)
+{
+ char buf[2048];
+ va_list args;
+
+ va_start(args, fmt);
+ (void)vsnprintf(buf, sizeof(buf), fmt, args);
+ va_end(args);
+ fprintf(stderr, "%s", buf);
+ fflush(stderr);
+}
+
+int
+gx_fromhex(int a)
+{
+ if (a >= '0' && a <= '9')
+ return a - '0';
+ else if (a >= 'a' && a <= 'f')
+ return a - 'a' + 10;
+ else
+ gxprt("Reply contains invalid hex digit");
+ return 0;
+}
+
+int
+gx_tohex(int nib)
+{
+ if (nib < 10)
+ return '0' + nib;
+ else
+ return 'a' + nib - 10;
+}
+
+
+void
+gx_convert_int_to_ascii(char *from, char *to, int n)
+{
+ int nib;
+ int ch;
+ while (n--) {
+ ch = *from++;
+ nib = ((ch & 0xf0) >> 4) & 0x0f;
+ *to++ = gx_tohex(nib);
+ nib = ch & 0x0f;
+ *to++ = gx_tohex(nib);
+ }
+ *to = 0;
+}
+
+/* input: "70676433206431" output: "pgd3 d1" n == 7 */
+void
+gx_convert_ascii_to_int(char *from, char *to, int n)
+{
+ int nib1, nib2;
+ while (n--) {
+ nib1 = gx_fromhex(*from++);
+ nib2 = gx_fromhex(*from++);
+ *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f);
+ }
+ *to = 0;
+}
+
+void
+gx_decode_zZ_packet(char *from, uint64_t *mem_addr_ptr)
+{
+ int i = 0;
+ char ch;
+ *mem_addr_ptr = 0;
+
+ while ((ch=from[i++]) != ',') {
+ *mem_addr_ptr = *mem_addr_ptr << 4;
+ *mem_addr_ptr |= gx_fromhex(ch) & 0x0f;
+ }
+}
+
+/* Eg: mc0267d3a,1\0 : from points to char after 'm' */
+void
+gx_decode_m_packet(char *from, uint64_t *mem_addr_ptr, int *len_ptr)
+{
+ int i = 0, j = 0;
+ char ch;
+ *mem_addr_ptr = *len_ptr = 0;
+
+ while ((ch=from[i++]) != ',') {
+ *mem_addr_ptr = *mem_addr_ptr << 4;
+ *mem_addr_ptr |= gx_fromhex(ch) & 0x0f;
+ }
+ for (j = 0; j < 4; j++) {
+ if ((ch=from[i++]) == 0)
+ break;
+ *len_ptr = *len_ptr << 4;
+ *len_ptr |= gx_fromhex(ch) & 0x0f;
+ }
+}
+
+/*
+ * Decode M pkt as in: Mc0267d3a,1:cc\0 where c0267d3a is the guest addr
+ * from points to char after 'M'
+ * Returns: address of byte after ":", ie, addr of cc in buf
+ */
+char *
+gx_decode_M_packet(char *from, uint64_t *mem_addr_ptr, int *len_ptr)
+{
+ int i = 0;
+ char ch;
+
+ *mem_addr_ptr = *len_ptr = 0;
+
+ while ((ch=from[i++]) != ',') {
+ *mem_addr_ptr = *mem_addr_ptr << 4;
+ *mem_addr_ptr |= gx_fromhex(ch) & 0x0f;
+ }
+ while ((ch = from[i++]) != ':') {
+ *len_ptr = *len_ptr << 4;
+ *len_ptr |= gx_fromhex(ch) & 0x0f;
+ }
+ return(&from[i]);
+}
+