1 /* Remote debugging for the ARM RDP interface.
2 Copyright 1994, 1995 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 Much of this file (in particular the SWI stuff) is based on code by
26 David Taylor (djt1000@uk.ac.cam.hermes).
28 I hacked on and simplified it by removing a lot of sexy features he
29 had added, and some of the (unix specific) workarounds he'd done
30 for other GDB problems - which if they still exist should be fixed
31 in GDB, not in a remote-foo thing . I also made it conform more to
32 the doc I have; which may be wrong.
34 Steve Chamberlain (sac@cygnus.com).
44 #ifdef ANSI_PROTOTYPES
52 #include "remote-utils.h"
53 #include "gdb_string.h"
59 extern struct target_ops remote_rdp_ops;
61 static host_callback *callback = &default_callback;
70 char command_line[10];
72 int rdi_stopped_status;
78 /* Definitions for the RDP protocol. */
80 #define RDP_MOUTHFULL (1<<6)
81 #define FPU_COPRO_NUMBER 1
84 #define RDP_OPEN_TYPE_COLD 0
85 #define RDP_OPEN_TYPE_WARM 1
86 #define RDP_OPEN_TYPE_BAUDRATE 2
88 #define RDP_OPEN_BAUDRATE_9600 1
89 #define RDP_OPEN_BAUDRATE_19200 2
90 #define RDP_OPEN_BAUDRATE_38400 3
92 #define RDP_OPEN_TYPE_RETURN_SEX (1<<3)
96 #define RDP_MEM_READ 2
98 #define RDP_MEM_WRITE 3
100 #define RDP_CPU_READ 4
101 #define RDP_CPU_WRITE 5
102 #define RDP_CPU_READWRITE_MODE_CURRENT 255
103 #define RDP_CPU_READWRITE_MASK_PC (1<<16)
104 #define RDP_CPU_READWRITE_MASK_CPSR (1<<17)
105 #define RDP_CPU_READWRITE_MASK_SPSR (1<<18)
107 #define RDP_COPRO_READ 6
108 #define RDP_COPRO_WRITE 7
109 #define RDP_FPU_READWRITE_MASK_FPS (1<<8)
111 #define RDP_SET_BREAK 0xa
112 #define RDP_SET_BREAK_TYPE_PC_EQUAL 0
113 #define RDP_SET_BREAK_TYPE_GET_HANDLE (0x10)
115 #define RDP_CLEAR_BREAK 0xb
117 #define RDP_EXEC 0x10
118 #define RDP_EXEC_TYPE_SYNC 0
120 #define RDP_STEP 0x11
122 #define RDP_INFO 0x12
123 #define RDP_INFO_ABOUT_STEP 2
124 #define RDP_INFO_ABOUT_STEP_GT_1 1
125 #define RDP_INFO_ABOUT_STEP_TO_JMP 2
126 #define RDP_INFO_ABOUT_STEP_1 4
127 #define RDP_INFO_ABOUT_TARGET 0
128 #define RDP_INFO_ABOUT_BREAK 1
129 #define RDP_INFO_ABOUT_BREAK_COMP 1
130 #define RDP_INFO_ABOUT_BREAK_RANGE 2
131 #define RDP_INFO_ABOUT_BREAK_BYTE_READ 4
132 #define RDP_INFO_ABOUT_BREAK_HALFWORD_READ 8
133 #define RDP_INFO_ABOUT_BREAK_WORD_READ (1<<4)
134 #define RDP_INFO_ABOUT_BREAK_BYTE_WRITE (1<<5)
135 #define RDP_INFO_ABOUT_BREAK_HALFWORD_WRITE (1<<6)
136 #define RDP_INFO_ABOUT_BREAK_WORD_WRITE (1<<7)
137 #define RDP_INFO_ABOUT_BREAK_MASK (1<<8)
138 #define RDP_INFO_ABOUT_BREAK_THREAD_BREAK (1<<9)
139 #define RDP_INFO_ABOUT_BREAK_THREAD_WATCH (1<<10)
140 #define RDP_INFO_ABOUT_BREAK_COND (1<<11)
142 #define RDP_RESET 0x7f
144 /* Returns from RDP */
145 #define RDP_RES_STOPPED 0x20
146 #define RDP_RES_SWI 0x21
147 #define RDP_RES_FATAL 0x5e
148 #define RDP_RES_VALUE 0x5f
149 #define RDP_RES_VALUE_LITTLE_ENDIAN 240
150 #define RDP_RES_VALUE_BIG_ENDIAN 241
151 #define RDP_RES_RESET 0x7f
152 #define RDP_RES_AT_BREAKPOINT 143
153 #define RDP_RES_IDUNNO 0xe6
154 #define RDP_OSOpReply 0x13
155 #define RDP_OSOpWord 2
156 #define RDP_OSOpNothing 0
158 static int timeout = 2;
161 remote_rdp_xfer_inferior_memory PARAMS ((CORE_ADDR memaddr,
165 struct target_ops * target));
168 /* Stuff for talking to the serial layer. */
173 int c = SERIAL_READCHAR (io, timeout);
176 printf ("[%02x]\n", c);
178 if (c == SERIAL_TIMEOUT)
181 return (unsigned char) c;
183 error ("Timeout reading from remote_system");
189 /* Note that the target always speaks little-endian to us,
190 even if it's a big endian machine. */
194 unsigned int val = 0;
197 for (n = 0; n < 4; n++)
210 printf ("(%02x)\n", val);
211 SERIAL_WRITE (io, &val, 1);
218 /* We always send in little endian */
226 printf ("(%04x)", val);
228 SERIAL_WRITE (io, b, 4);
233 /* Stuff for talking to the RDP layer. */
235 /* This is a bit more fancy that need be so that it syncs even in nasty cases.
237 I'be been unable to make it reliably sync up with the change
238 baudrate open command. It likes to sit and say it's been reset,
239 with no more action. So I took all that code out. I'd rather sync
240 reliably at 9600 than wait forever for a possible 19200 connection.
249 int type = cold ? RDP_OPEN_TYPE_COLD : RDP_OPEN_TYPE_WARM;
252 time_t now = time (0);
253 time_t stop_time = now + 10; /* Try and sync for 10 seconds, then give up */
256 while (time (0) < stop_time && !sync)
261 SERIAL_FLUSH_INPUT (io);
262 SERIAL_FLUSH_OUTPUT (io);
265 printf_unfiltered ("Trying to connect at %d baud.\n", baudtry);
268 put_byte (type | RDP_OPEN_TYPE_RETURN_SEX);
271 while (!sync && (restype = SERIAL_READCHAR (io, 1)) > 0)
274 printf_unfiltered ("[%02x]\n", restype);
281 while ((restype = SERIAL_READCHAR (io, 1)) == RDP_RESET)
283 while ((restype = SERIAL_READCHAR (io, 1)) > 0)
285 printf_unfiltered ("%c", isgraph (restype) ? restype : ' ');
287 while ((restype = SERIAL_READCHAR (io, 1)) > 0)
291 printf_unfiltered ("\nThe board has sent notification that it was reset.\n");
292 printf_unfiltered ("Waiting for it to settle down...\n");
296 printf_unfiltered ("\nTrying again.\n");
302 int resval = SERIAL_READCHAR (io, 1);
307 case RDP_RES_VALUE_LITTLE_ENDIAN:
308 target_byte_order = LITTLE_ENDIAN;
311 case RDP_RES_VALUE_BIG_ENDIAN:
312 target_byte_order = BIG_ENDIAN;
325 error ("Couldn't reset the board, try pressing the reset button");
330 #ifdef ANSI_PROTOTYPES
332 send_rdp (char *template,...)
335 send_rdp (char *template, va_alist)
342 #ifdef ANSI_PROTOTYPES
343 va_start (alist, template);
358 val = va_arg (alist, int);
362 val = va_arg (alist, int);
370 if (val != RDP_RES_VALUE)
372 printf_unfiltered ("got bad res value of %d, %x\n", val, val);
376 pstat = va_arg (alist, int *);
377 pi = va_arg (alist, int *);
379 *pstat = get_byte ();
380 /* Check the result was zero, if not read the syndrome */
387 /* Check the result code, error if not zero */
389 error ("Command garbled");
392 /* Read a word from the target */
393 pi = va_arg (alist, int *);
397 /* Read in some bytes from the target. */
398 pc = va_arg (alist, char *);
399 val = va_arg (alist, int);
400 for (i = 0; i < val; i++)
406 /* send what's being pointed at */
407 pc = va_arg (alist, char *);
408 val = va_arg (alist, int);
410 SERIAL_WRITE (io, pc, val);
413 /* Send whats in the queue */
416 SERIAL_WRITE (io, buf, dst - buf);
421 pi = va_arg (alist, int *);
436 rdp_write (memaddr, buf, len)
444 send_rdp ("bww-p-SV", RDP_MEM_WRITE, memaddr, len, buf, len, &res, &val);
455 rdp_read (memaddr, buf, len)
462 send_rdp ("bww-S-P-V",
463 RDP_MEM_READ, memaddr, len,
474 rdp_fetch_one_register (mask, buf)
479 send_rdp ("bbw-SWZ", RDP_CPU_READ, RDP_CPU_READWRITE_MODE_CURRENT, mask, &val);
480 store_signed_integer (buf, 4, val);
484 rdp_fetch_one_fpu_register (mask, buf)
489 /* !!! Since the PIE board doesn't work as documented,
490 and it doesn't have FPU hardware anyway and since it
491 slows everything down, I've disabled this. */
493 if (mask == RDP_FPU_READWRITE_MASK_FPS)
495 /* this guy is only a word */
496 send_rdp ("bbw-SWZ", RDP_COPRO_READ, FPU_COPRO_NUMBER, mask, &val);
497 store_signed_integer (buf, 4, val);
501 /* There are 12 bytes long
502 !! fixme about endianness
504 int dummy; /* I've seen these come back as four words !! */
505 send_rdp ("bbw-SWWWWZ", RDP_COPRO_READ, FPU_COPRO_NUMBER, mask, buf + 0, buf + 4, buf + 8, &dummy);
508 memset (buf, 0, MAX_REGISTER_RAW_SIZE);
513 rdp_store_one_register (mask, buf)
517 int val = extract_unsigned_integer (buf, 4);
520 RDP_CPU_WRITE, RDP_CPU_READWRITE_MODE_CURRENT, mask, val);
525 rdp_store_one_fpu_register (mask, buf)
530 /* See comment in fetch_one_fpu_register */
531 if (mask == RDP_FPU_READWRITE_MASK_FPS)
533 int val = extract_unsigned_integer (buf, 4);
534 /* this guy is only a word */
535 send_rdp ("bbww-SZ", RDP_COPRO_WRITE,
541 /* There are 12 bytes long
542 !! fixme about endianness
545 /* I've seen these come as four words, not the three advertized !! */
546 printf ("Sending mask %x\n", mask);
547 send_rdp ("bbwwwww-SZ",
556 printf ("done mask %x\n", mask);
562 /* Convert between GDB requests and the RDP layer. */
565 remote_rdp_fetch_register (regno)
570 for (regno = 0; regno < NUM_REGS; regno++)
571 remote_rdp_fetch_register (regno);
575 char buf[MAX_REGISTER_RAW_SIZE];
577 rdp_fetch_one_register (1 << regno, buf);
578 else if (regno == PC_REGNUM)
579 rdp_fetch_one_register (RDP_CPU_READWRITE_MASK_PC, buf);
580 else if (regno == PS_REGNUM)
581 rdp_fetch_one_register (RDP_CPU_READWRITE_MASK_CPSR, buf);
582 else if (regno == FPS_REGNUM)
583 rdp_fetch_one_fpu_register (RDP_FPU_READWRITE_MASK_FPS, buf);
584 else if (regno >= F0_REGNUM && regno <= F7_REGNUM)
585 rdp_fetch_one_fpu_register (1 << (regno - F0_REGNUM), buf);
588 printf ("Help me with fetch reg %d\n", regno);
590 supply_register (regno, buf);
596 remote_rdp_store_register (regno)
601 for (regno = 0; regno < NUM_REGS; regno++)
602 remote_rdp_store_register (regno);
606 char tmp[MAX_REGISTER_RAW_SIZE];
607 read_register_gen (regno, tmp);
609 rdp_store_one_register (1 << regno, tmp);
610 else if (regno == PC_REGNUM)
611 rdp_store_one_register (RDP_CPU_READWRITE_MASK_PC, tmp);
612 else if (regno == PS_REGNUM)
613 rdp_store_one_register (RDP_CPU_READWRITE_MASK_CPSR, tmp);
614 else if (regno >= F0_REGNUM && regno <= F7_REGNUM)
615 rdp_store_one_fpu_register (1 << (regno - F0_REGNUM), tmp);
618 printf ("Help me with reg %d\n", regno);
626 callback->shutdown (callback);
633 send_rdp ("bw-S-W-Z", RDP_INFO, RDP_INFO_ABOUT_STEP,
635 send_rdp ("bw-S-W-Z", RDP_INFO, RDP_INFO_ABOUT_BREAK,
637 send_rdp ("bw-S-WW-Z", RDP_INFO, RDP_INFO_ABOUT_TARGET,
641 ds.can_step = ds.step_info & RDP_INFO_ABOUT_STEP_1;
643 ds.rdi_level = (ds.target_info >> 5) & 3;
650 /* Start it off, but don't wait for it */
651 send_rdp ("bb-", RDP_EXEC, RDP_EXEC_TYPE_SYNC);
673 #define SWI_WriteC 0x0
674 #define SWI_Write0 0x2
675 #define SWI_ReadC 0x4
677 #define SWI_GetEnv 0x10
678 #define SWI_Exit 0x11
679 #define SWI_EnterOS 0x16
681 #define SWI_GetErrno 0x60
682 #define SWI_Clock 0x61
684 #define SWI_Time 0x63
685 #define SWI_Remove 0x64
686 #define SWI_Rename 0x65
687 #define SWI_Open 0x66
689 #define SWI_Close 0x68
690 #define SWI_Write 0x69
691 #define SWI_Read 0x6a
692 #define SWI_Seek 0x6b
693 #define SWI_Flen 0x6c
695 #define SWI_IsTTY 0x6e
696 #define SWI_TmpNam 0x6f
697 #define SWI_InstallHandler 0x70
698 #define SWI_GenerateError 0x71
711 callback->write_stdout (callback, &c, 1);
714 for (i = 0; i < args->n; i++)
715 callback->write_stdout (callback, args->s, strlen (args->s));
718 callback->read_stdin (callback, &c, 1);
722 args->n = callback->system (callback, args->s);
725 args->n = callback->get_errno (callback);
728 args->n = callback->time (callback, NULL);
731 args->n = callback->unlink (callback, args->s);
734 args->n = callback->rename (callback, args[0].s, args[1].s);
754 args->n = callback->open (callback, args->s, i);
758 args->n = callback->close (callback, args->n);
762 args->n = callback->write (callback, args[0].n, args[1].s, args[1].n);
766 char *copy = alloca (args[2].n);
767 int done = callback->read (callback, args[0].n, copy, args[2].n);
769 remote_rdp_xfer_inferior_memory (args[0].n, copy, done, 1, 0);
775 args->n = callback->lseek (callback, args[0].n, args[1].n, 0) >= 0;
779 long old = callback->lseek (callback, args->n, 1, 1);
780 args->n = callback->lseek (callback, args->n, 2, 0);
781 callback->lseek (callback, args->n, old, 0);
786 args->n = callback->isatty (callback, args->n);
803 int swino = get_word ();
804 int type = get_byte ();
810 args[count].n = get_byte ();
814 args[count].n = get_word ();
818 /* If the word is under 32 bytes it will be sent otherwise
819 an address to it is passed. Also: Special case of 255 */
829 remote_rdp_xfer_inferior_memory (get_word (),
838 buf = alloca (len + 1);
839 for (i = 0; i < len; i++)
840 buf[i] = get_byte ();
848 error ("Unimplented SWI argument");
855 if (exec_swi (swino, args))
857 /* We have two options here reply with either a byte or a word
858 which is stored in args[0].n. There is no harm in replying with
859 a word all the time, so thats what I do! */
860 send_rdp ("bbw-", RDP_OSOpReply, RDP_OSOpWord, args[0].n);
864 send_rdp ("bb-", RDP_OSOpReply, RDP_OSOpNothing);
869 rdp_execute_finish ()
876 res = SERIAL_READCHAR (io, 1);
877 while (res == SERIAL_TIMEOUT)
880 printf_filtered ("Waiting for target..\n");
881 res = SERIAL_READCHAR (io, 1);
890 send_rdp ("B", &ds.rdi_stopped_status);
894 printf_filtered ("Target reset\n");
898 printf_filtered ("Ignoring %x\n", res);
908 rdp_execute_start ();
909 rdp_execute_finish ();
913 remote_rdp_insert_breakpoint (addr, save)
918 if (ds.rdi_level > 0)
923 RDP_SET_BREAK_TYPE_PC_EQUAL | RDP_SET_BREAK_TYPE_GET_HANDLE,
932 RDP_SET_BREAK_TYPE_PC_EQUAL,
939 remote_rdp_remove_breakpoint (addr, save)
944 if (ds.rdi_level > 0)
964 if (ds.can_step && 0)
966 /* The pie board can't do steps so I can't test this, and
967 the other code will always work. */
976 CORE_ADDR pc = read_register (PC_REGNUM);
977 pc = arm_get_next_pc (pc);
978 remote_rdp_insert_breakpoint (pc, &handle);
980 remote_rdp_remove_breakpoint (pc, &handle);
985 remote_rdp_open (args, from_tty)
990 error_no_arg ("serial port device name");
994 target_preopen (from_tty);
996 io = SERIAL_OPEN (args);
999 perror_with_name (args);
1003 rdp_init (1, from_tty);
1008 printf_unfiltered ("Remote RDP debugging using %s at %d baud\n", args, baud_rate);
1013 push_target (&remote_rdp_ops);
1015 callback->init (callback);
1016 flush_cached_frames ();
1017 registers_changed ();
1018 stop_pc = read_pc ();
1019 set_current_frame (create_new_frame (read_fp (), stop_pc));
1020 select_frame (get_current_frame (), 0);
1021 print_stack_frame (selected_frame, -1, 1);
1026 /* Close out all files and local state before this target loses control. */
1029 remote_rdp_close (quitting)
1032 callback->shutdown (callback);
1039 /* Resume execution of the target process. STEP says whether to single-step
1040 or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
1041 to the target, or zero for no signal. */
1044 remote_rdp_resume (pid, step, siggnal)
1046 enum target_signal siggnal;
1054 /* Wait for inferior process to do something. Return pid of child,
1055 or -1 in case of error; store status through argument pointer STATUS,
1056 just as `wait' would. */
1059 remote_rdp_wait (pid, status)
1061 struct target_waitstatus *status;
1063 switch (ds.rdi_stopped_status)
1068 status->kind = TARGET_WAITKIND_EXITED;
1069 status->value.integer = read_register (0);
1071 case RDP_RES_AT_BREAKPOINT:
1072 status->kind = TARGET_WAITKIND_STOPPED;
1073 /* The signal in sigrc is a host signal. That probably
1075 status->value.sig = TARGET_SIGNAL_TRAP;
1079 status->kind = TARGET_WAITKIND_SIGNALLED;
1080 /* The signal in sigrc is a host signal. That probably
1082 status->value.sig = target_signal_from_host (sigrc);
1087 return inferior_pid;
1090 /* Get ready to modify the registers array. On machines which store
1091 individual registers, this doesn't need to do anything. On machines
1092 which store all the registers in one fell swoop, this makes sure
1093 that registers contains all the registers from the program being
1097 remote_rdp_prepare_to_store ()
1099 /* Do nothing, since we can store individual regs */
1103 remote_rdp_xfer_inferior_memory (memaddr, myaddr, len, write, target)
1108 struct target_ops *target; /* ignored */
1110 /* I infer from D Taylor's code that there's a limit on the amount
1111 we can transfer in one chunk.. */
1116 int thisbite = len - done;
1117 if (thisbite > RDP_MOUTHFULL)
1118 thisbite = RDP_MOUTHFULL;
1124 justdone = rdp_write (memaddr + done, myaddr + done, thisbite);
1128 justdone = rdp_read (memaddr + done, myaddr + done, thisbite);
1133 if (justdone != thisbite)
1146 static struct yn stepinfo[] =
1148 {"Step more than one instruction", RDP_INFO_ABOUT_STEP_GT_1},
1149 {"Step to jump", RDP_INFO_ABOUT_STEP_TO_JMP},
1150 {"Step one instruction", RDP_INFO_ABOUT_STEP_1},
1154 static struct yn breakinfo[] =
1156 {"comparison breakpoints supported", RDP_INFO_ABOUT_BREAK_COMP},
1157 {"range breakpoints supported", RDP_INFO_ABOUT_BREAK_RANGE},
1158 {"watchpoints for byte reads supported", RDP_INFO_ABOUT_BREAK_BYTE_READ},
1159 {"watchpoints for half-word reads supported", RDP_INFO_ABOUT_BREAK_HALFWORD_READ},
1160 {"watchpoints for word reads supported", RDP_INFO_ABOUT_BREAK_WORD_READ},
1161 {"watchpoints for byte writes supported", RDP_INFO_ABOUT_BREAK_BYTE_WRITE},
1162 {"watchpoints for half-word writes supported", RDP_INFO_ABOUT_BREAK_HALFWORD_WRITE},
1163 {"watchpoints for word writes supported", RDP_INFO_ABOUT_BREAK_WORD_WRITE},
1164 {"mask break/watch-points supported", RDP_INFO_ABOUT_BREAK_MASK},
1165 {"thread-specific breakpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_BREAK},
1166 {"thread-specific watchpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_WATCH},
1167 {"conditional breakpoints supported", RDP_INFO_ABOUT_BREAK_COND},
1179 printf_unfiltered (" %-45s : %s\n", t->name, (info & t->bit) ? "Yes" : "No");
1185 remote_rdp_files_info (target)
1186 struct target_ops *target;
1188 printf_filtered ("Target capabilities:\n");
1189 dump_bits (stepinfo, ds.step_info);
1190 dump_bits (breakinfo, ds.break_info);
1191 printf_unfiltered ("target level RDI %x\n", (ds.target_info >> 5) & 3);
1195 /* Define the target subroutine names */
1197 struct target_ops remote_rdp_ops =
1199 "rdp", /* to_shortname */
1201 "Remote Target using the RDProtocol",
1203 "Use a remote ARM system which uses the ARM Remote Debugging Protocol",
1204 remote_rdp_open, /* to_open */
1205 remote_rdp_close, /* to_close */
1206 NULL, /* to_attach */
1207 NULL, /* to_detach */
1208 remote_rdp_resume, /* to_resume */
1209 remote_rdp_wait, /* to_wait */
1210 remote_rdp_fetch_register, /* to_fetch_registers */
1211 remote_rdp_store_register, /* to_store_registers */
1212 remote_rdp_prepare_to_store, /* to_prepare_to_store */
1213 remote_rdp_xfer_inferior_memory, /* to_xfer_memory */
1214 remote_rdp_files_info, /* to_files_info */
1215 remote_rdp_insert_breakpoint, /* to_insert_breakpoint */
1216 remote_rdp_remove_breakpoint, /* to_remove_breakpoint */
1217 NULL, /* to_terminal_init */
1218 NULL, /* to_terminal_inferior */
1219 NULL, /* to_terminal_ours_for_output */
1220 NULL, /* to_terminal_ours */
1221 NULL, /* to_terminal_info */
1222 remote_rdp_kill, /* to_kill */
1223 generic_load, /* to_load */
1224 NULL, /* to_lookup_symbol */
1225 NULL, /* to_create_inferior */
1226 generic_mourn_inferior, /* to_mourn_inferior */
1228 0, /* to_notice_signals */
1229 0, /* to_thread_alive */
1231 process_stratum, /* to_stratum */
1233 1, /* to_has_all_memory */
1234 1, /* to_has_memory */
1235 1, /* to_has_stack */
1236 1, /* to_has_registers */
1237 1, /* to_has_execution */
1238 NULL, /* sections */
1239 NULL, /* sections_end */
1240 OPS_MAGIC, /* to_magic */
1244 _initialize_remote_rdp ()
1246 add_target (&remote_rdp_ops);