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
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.
44 #ifdef ANSI_PROTOTYPES
52 #include "remote-utils.h"
54 extern struct target_ops remote_rdp_ops;
56 static host_callback *callback = &default_callback;
65 char command_line[10];
67 int rdi_stopped_status;
72 /* Definitions for the RDP protocol. */
74 #define RDP_MOUTHFULL (1<<6)
75 #define FPU_COPRO_NUMBER 1
78 #define RDP_OPEN_TYPE_COLD 0
79 #define RDP_OPEN_TYPE_WARM 1
80 #define RDP_OPEN_TYPE_BAUDRATE 2
82 #define RDP_OPEN_BAUDRATE_9600 1
83 #define RDP_OPEN_BAUDRATE_19200 2
84 #define RDP_OPEN_BAUDRATE_38400 3
86 #define RDP_OPEN_TYPE_RETURN_SEX (1<<3)
90 #define RDP_MEM_READ 2
92 #define RDP_MEM_WRITE 3
94 #define RDP_CPU_READ 4
95 #define RDP_CPU_WRITE 5
96 #define RDP_CPU_READWRITE_MODE_CURRENT 255
97 #define RDP_CPU_READWRITE_MASK_PC (1<<16)
98 #define RDP_CPU_READWRITE_MASK_CPSR (1<<17)
99 #define RDP_CPU_READWRITE_MASK_SPSR (1<<18)
101 #define RDP_COPRO_READ 6
102 #define RDP_COPRO_WRITE 7
103 #define RDP_FPU_READWRITE_MASK_FPS (1<<8)
105 #define RDP_SET_BREAK 0xa
106 #define RDP_SET_BREAK_TYPE_PC_EQUAL 0
107 #define RDP_SET_BREAK_TYPE_GET_HANDLE (0x10)
109 #define RDP_CLEAR_BREAK 0xb
111 #define RDP_EXEC 0x10
112 #define RDP_EXEC_TYPE_SYNC 0
114 #define RDP_STEP 0x11
116 #define RDP_INFO 0x12
117 #define RDP_INFO_ABOUT_STEP 2
118 #define RDP_INFO_ABOUT_STEP_GT_1 1
119 #define RDP_INFO_ABOUT_STEP_TO_JMP 2
120 #define RDP_INFO_ABOUT_STEP_1 4
121 #define RDP_INFO_ABOUT_TARGET 0
122 #define RDP_INFO_ABOUT_BREAK 1
123 #define RDP_INFO_ABOUT_BREAK_COMP 1
124 #define RDP_INFO_ABOUT_BREAK_RANGE 2
125 #define RDP_INFO_ABOUT_BREAK_BYTE_READ 4
126 #define RDP_INFO_ABOUT_BREAK_HALFWORD_READ 8
127 #define RDP_INFO_ABOUT_BREAK_WORD_READ (1<<4)
128 #define RDP_INFO_ABOUT_BREAK_BYTE_WRITE (1<<5)
129 #define RDP_INFO_ABOUT_BREAK_HALFWORD_WRITE (1<<6)
130 #define RDP_INFO_ABOUT_BREAK_WORD_WRITE (1<<7)
131 #define RDP_INFO_ABOUT_BREAK_MASK (1<<8)
132 #define RDP_INFO_ABOUT_BREAK_THREAD_BREAK (1<<9)
133 #define RDP_INFO_ABOUT_BREAK_THREAD_WATCH (1<<10)
134 #define RDP_INFO_ABOUT_BREAK_COND (1<<11)
136 #define RDP_RESET 0x7f
138 /* Returns from RDP */
139 #define RDP_RES_STOPPED 0x20
140 #define RDP_RES_SWI 0x21
141 #define RDP_RES_FATAL 0x5e
142 #define RDP_RES_VALUE 0x5f
143 #define RDP_RES_VALUE_LITTLE_ENDIAN 240
144 #define RDP_RES_VALUE_BIG_ENDIAN 241
145 #define RDP_RES_RESET 0x7f
146 #define RDP_RES_AT_BREAKPOINT 143
147 #define RDP_RES_IDUNNO 0xe6
148 #define RDP_OSOpReply 0x13
149 #define RDP_OSOpWord 2
150 #define RDP_OSOpNothing 0
152 static int timeout = 2;
155 remote_rdp_xfer_inferior_memory PARAMS ((CORE_ADDR memaddr,
159 struct target_ops * target));
162 /* Stuff for talking to the serial layer. */
167 int c = SERIAL_READCHAR (io, timeout);
170 printf ("[%02x]", c);
172 if (c == SERIAL_TIMEOUT)
175 return (unsigned char) c;
177 error ("Timeout reading from remote_system");
183 /* Note that the target always speaks little-endian to us,
184 even if it's a big endian machine. */
188 unsigned int val = 0;
191 for (n = 0; n < 4; n++)
204 printf("(%02x)", val);
205 SERIAL_WRITE (io, &val, 1);
212 /* We always send in little endian */
220 printf("(%04x)", val);
222 SERIAL_WRITE (io, b, 4);
227 /* Stuff for talking to the RDP layer. */
229 /* This is a bit more fancy that need be so that it syncs even in nasty cases. */
236 int type = cold ? RDP_OPEN_TYPE_COLD : RDP_OPEN_TYPE_WARM;
241 for (try = 0; !sync && try < 10 ; try++)
245 SERIAL_FLUSH_INPUT (io);
248 if (baud_rate == 19200)
250 put_byte (type | RDP_OPEN_TYPE_RETURN_SEX | RDP_OPEN_TYPE_BAUDRATE);
252 put_word (RDP_OPEN_BAUDRATE_19200);
256 put_byte (type | RDP_OPEN_TYPE_RETURN_SEX);
260 restype = SERIAL_READCHAR (io, 1);
263 printf_unfiltered ("[%02x]\n", restype);
265 if (restype == RDP_RESET)
267 put_byte (RDP_RESET);
268 while ((restype = SERIAL_READCHAR (io, 1)) == RDP_RESET)
270 while ((restype = SERIAL_READCHAR (io, 1)) > 0)
272 printf_unfiltered ("%c", isgraph(restype) ? restype : ' ');
274 while ((restype = SERIAL_READCHAR (io, 1)) > 0)
276 printf_unfiltered("\n");
277 error("board reset, try again.\n");
286 /* Ignore a load of these */
292 int resval = SERIAL_READCHAR (io, 1);
297 case RDP_RES_VALUE_LITTLE_ENDIAN:
298 target_byte_order = LITTLE_ENDIAN;
301 case RDP_RES_VALUE_BIG_ENDIAN:
302 target_byte_order = BIG_ENDIAN;
314 SERIAL_FLUSH_INPUT (io);
315 SERIAL_SETBAUDRATE (io, baud_rate);
316 SERIAL_FLUSH_INPUT (io);
320 error ("Couldn't reset the board, try pressing the reset button");
325 #ifdef ANSI_PROTOTYPES
327 send_rdp (char *template,...)
330 send_rdp (char *template, va_alist)
337 #ifdef ANSI_PROTOTYPES
338 va_start (alist, template);
353 val = va_arg (alist, int);
357 val = va_arg (alist, int);
365 if (val != RDP_RES_VALUE)
367 printf_unfiltered ("got bad res value of %d, %x\n", val, val);
371 pstat = va_arg (alist, int *);
372 pi = va_arg (alist, int *);
374 *pstat = get_byte ();
375 /* Check the result was zero, if not read the syndrome */
382 /* Check the result code, error if not zero */
384 error ("Command garbled");
387 /* Read a word from the target */
388 pi = va_arg (alist, int *);
392 /* Read in some bytes from the target. */
393 pc = va_arg (alist, char *);
394 val = va_arg (alist, int);
395 for (i = 0; i < val; i++)
401 /* send what's being pointed at */
402 pc = va_arg (alist, char *);
403 val = va_arg (alist, int);
405 SERIAL_WRITE (io, pc, val);
408 /* Send whats in the queue */
411 SERIAL_WRITE (io, buf, dst - buf);
416 pi = va_arg (alist, int *);
431 rdp_write (memaddr, buf, len)
439 send_rdp ("bww-p-SV", RDP_MEM_WRITE, memaddr, len, buf, len, &res, &val);
450 rdp_read (memaddr, buf, len)
457 send_rdp ("bww-S-P-V",
458 RDP_MEM_READ, memaddr, len,
469 rdp_fetch_one_register (mask, buf)
474 send_rdp ("bbw-SWZ", RDP_CPU_READ, RDP_CPU_READWRITE_MODE_CURRENT, mask, &val);
475 store_signed_integer (buf, 4, val);
479 rdp_fetch_one_fpu_register (mask, buf)
484 /* !!! Since the PIE board doesn't work as documented,
485 and it doesn't have FPU hardware anyway and since it
486 slows everything down, I've disabled this. */
488 if (mask == RDP_FPU_READWRITE_MASK_FPS)
490 /* this guy is only a word */
491 send_rdp ("bbw-SWZ", RDP_COPRO_READ, FPU_COPRO_NUMBER, mask, &val);
492 store_signed_integer (buf, 4, val);
496 /* There are 12 bytes long
497 !! fixme about endianness
499 int dummy; /* I've seen these come back as four words !! */
500 send_rdp ("bbw-SWWWWZ", RDP_COPRO_READ, FPU_COPRO_NUMBER, mask, buf + 0, buf + 4, buf + 8, &dummy);
503 memset (buf, 0, MAX_REGISTER_RAW_SIZE);
508 rdp_store_one_register (mask, buf)
512 int val = extract_unsigned_integer (buf, 4);
515 RDP_CPU_WRITE, RDP_CPU_READWRITE_MODE_CURRENT, mask, val);
520 rdp_store_one_fpu_register (mask, buf)
525 /* See comment in fetch_one_fpu_register */
526 if (mask == RDP_FPU_READWRITE_MASK_FPS)
528 int val = extract_unsigned_integer (buf, 4);
529 /* this guy is only a word */
530 send_rdp ("bbww-SZ", RDP_COPRO_WRITE,
536 /* There are 12 bytes long
537 !! fixme about endianness
540 /* I've seen these come as four words, not the three advertized !! */
541 printf ("Sending mask %x\n", mask);
542 send_rdp ("bbwwwww-SZ",
551 printf ("done mask %x\n", mask);
557 /* Convert between GDB requests and the RDP layer. */
560 remote_rdp_fetch_register (regno)
565 for (regno = 0; regno < NUM_REGS; regno++)
566 remote_rdp_fetch_register (regno);
570 char buf[MAX_REGISTER_RAW_SIZE];
572 rdp_fetch_one_register (1 << regno, buf);
573 else if (regno == PC_REGNUM)
574 rdp_fetch_one_register (RDP_CPU_READWRITE_MASK_PC, buf);
575 else if (regno == PS_REGNUM)
576 rdp_fetch_one_register (RDP_CPU_READWRITE_MASK_CPSR, buf);
577 else if (regno == FPS_REGNUM)
578 rdp_fetch_one_fpu_register (RDP_FPU_READWRITE_MASK_FPS, buf);
579 else if (regno >= F0_REGNUM && regno <= F7_REGNUM)
580 rdp_fetch_one_fpu_register (1 << (regno - F0_REGNUM), buf);
583 printf ("Help me with fetch reg %d\n", regno);
585 supply_register (regno, buf);
591 remote_rdp_store_register (regno)
596 for (regno = 0; regno < NUM_REGS; regno++)
597 remote_rdp_store_register (regno);
601 char tmp[MAX_REGISTER_RAW_SIZE];
602 read_register_gen (regno, tmp);
604 rdp_store_one_register (1 << regno, tmp);
605 else if (regno == PC_REGNUM)
606 rdp_store_one_register (RDP_CPU_READWRITE_MASK_PC, tmp);
607 else if (regno == PS_REGNUM)
608 rdp_store_one_register (RDP_CPU_READWRITE_MASK_CPSR, tmp);
609 else if (regno >= F0_REGNUM && regno <= F7_REGNUM)
610 rdp_store_one_fpu_register (1 << (regno - F0_REGNUM), tmp);
613 printf ("Help me with reg %d\n", regno);
621 callback->shutdown (callback);
628 send_rdp ("bw-S-W-Z", RDP_INFO, RDP_INFO_ABOUT_STEP,
630 send_rdp ("bw-S-W-Z", RDP_INFO, RDP_INFO_ABOUT_BREAK,
632 send_rdp ("bw-S-WW-Z", RDP_INFO, RDP_INFO_ABOUT_TARGET,
636 ds.can_step = ds.step_info & RDP_INFO_ABOUT_STEP_1;
638 ds.rdi_level = (ds.target_info >> 5) & 3;
645 /* Start it off, but don't wait for it */
646 send_rdp ("bb-", RDP_EXEC, RDP_EXEC_TYPE_SYNC);
668 #define SWI_WriteC 0x0
669 #define SWI_Write0 0x2
670 #define SWI_ReadC 0x4
672 #define SWI_GetEnv 0x10
673 #define SWI_Exit 0x11
674 #define SWI_EnterOS 0x16
676 #define SWI_GetErrno 0x60
677 #define SWI_Clock 0x61
679 #define SWI_Time 0x63
680 #define SWI_Remove 0x64
681 #define SWI_Rename 0x65
682 #define SWI_Open 0x66
684 #define SWI_Close 0x68
685 #define SWI_Write 0x69
686 #define SWI_Read 0x6a
687 #define SWI_Seek 0x6b
688 #define SWI_Flen 0x6c
690 #define SWI_IsTTY 0x6e
691 #define SWI_TmpNam 0x6f
692 #define SWI_InstallHandler 0x70
693 #define SWI_GenerateError 0x71
706 callback->write_stdout (callback, &c, 1);
709 for (i = 0; i < args->n; i++)
710 callback->write_stdout (callback, args->s, strlen (args->s));
713 callback->read_stdin (callback, &c, 1);
717 args->n = callback->system (callback, args->s);
720 args->n = callback->get_errno (callback);
723 args->n = callback->time (callback, NULL);
726 args->n = callback->unlink (callback, args->s);
729 args->n = callback->rename (callback, args[0].s, args[1].s);
749 args->n = callback->open (callback, args->s, i);
753 args->n = callback->close (callback, args->n);
757 args->n = callback->write (callback, args[0].n, args[1].s, args[1].n);
761 char *copy = alloca (args[2].n);
762 int done = callback->read (callback, args[0].n, copy, args[2].n);
764 remote_rdp_xfer_inferior_memory (args[0].n, copy, done, 1, 0);
770 args->n = callback->lseek (callback, args[0].n, args[1].n, 0) >= 0;
774 long old = callback->lseek (callback, args->n, 1, 1);
775 args->n = callback->lseek (callback, args->n, 2, 0);
776 callback->lseek (callback, args->n, old, 0);
781 args->n = callback->isatty (callback, args->n);
798 int swino = get_word ();
799 int type = get_byte ();
805 args[count].n = get_byte ();
809 args[count].n = get_word ();
813 /* If the word is under 32 bytes it will be sent otherwise
814 an address to it is passed. Also: Special case of 255 */
824 remote_rdp_xfer_inferior_memory (get_word (),
833 buf = alloca (len + 1);
834 for (i = 0; i < len; i++)
835 buf[i] = get_byte ();
843 error ("Unimplented SWI argument");
850 if (exec_swi (swino, args))
852 /* We have two options here reply with either a byte or a word
853 which is stored in args[0].n. There is no harm in replying with
854 a word all the time, so thats what I do! */
855 send_rdp ("bbw-", RDP_OSOpReply, RDP_OSOpWord, args[0].n);
859 send_rdp ("bb-", RDP_OSOpReply, RDP_OSOpNothing);
864 rdp_execute_finish ()
871 res = SERIAL_READCHAR (io, 1);
872 while (res == SERIAL_TIMEOUT)
875 printf_filtered ("Waiting for target..\n");
876 res = SERIAL_READCHAR (io, 1);
885 send_rdp ("B", &ds.rdi_stopped_status);
889 printf_filtered ("Target reset\n");
893 printf_filtered ("Ignoring %x\n", res);
903 rdp_execute_start ();
904 rdp_execute_finish ();
908 remote_rdp_insert_breakpoint (addr, save)
913 if (ds.rdi_level > 0)
918 RDP_SET_BREAK_TYPE_PC_EQUAL | RDP_SET_BREAK_TYPE_GET_HANDLE,
927 RDP_SET_BREAK_TYPE_PC_EQUAL,
934 remote_rdp_remove_breakpoint (addr, save)
939 if (ds.rdi_level > 0)
959 if (ds.can_step && 0)
961 /* The pie board can't do steps so I can't test this, and
962 the other code will always work. */
971 CORE_ADDR pc = read_register (PC_REGNUM);
972 pc = arm_get_next_pc (pc);
973 remote_rdp_insert_breakpoint (pc, &handle);
975 remote_rdp_remove_breakpoint (pc, &handle);
980 remote_rdp_open (args, from_tty)
985 error_no_arg ("serial port device name");
987 if (baud_rate != 19200)
990 target_preopen (from_tty);
992 io = SERIAL_OPEN (args);
995 perror_with_name (args);
1004 printf_unfiltered ("Remote RDP debugging using %s at %d baud\n", args, baud_rate);
1009 push_target (&remote_rdp_ops);
1011 callback->init (callback);
1012 flush_cached_frames ();
1013 registers_changed ();
1014 stop_pc = read_pc ();
1015 set_current_frame (create_new_frame (read_fp (), stop_pc));
1016 select_frame (get_current_frame (), 0);
1017 print_stack_frame (selected_frame, -1, 1);
1022 /* Close out all files and local state before this target loses control. */
1025 remote_rdp_close (quitting)
1028 callback->shutdown (callback);
1034 /* Terminate the open connection to the remote debugger. */
1037 remote_rdp_detach (args, from_tty)
1044 /* Resume execution of the target process. STEP says whether to single-step
1045 or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
1046 to the target, or zero for no signal. */
1049 remote_rdp_resume (pid, step, siggnal)
1051 enum target_signal siggnal;
1059 /* Wait for inferior process to do something. Return pid of child,
1060 or -1 in case of error; store status through argument pointer STATUS,
1061 just as `wait' would. */
1064 remote_rdp_wait (pid, status)
1066 struct target_waitstatus *status;
1068 switch (ds.rdi_stopped_status)
1073 status->kind = TARGET_WAITKIND_EXITED;
1074 status->value.integer = read_register (0);
1076 case RDP_RES_AT_BREAKPOINT:
1077 status->kind = TARGET_WAITKIND_STOPPED;
1078 /* The signal in sigrc is a host signal. That probably
1080 status->value.sig = TARGET_SIGNAL_TRAP;
1084 status->kind = TARGET_WAITKIND_SIGNALLED;
1085 /* The signal in sigrc is a host signal. That probably
1087 status->value.sig = target_signal_from_host (sigrc);
1092 return inferior_pid;
1095 /* Get ready to modify the registers array. On machines which store
1096 individual registers, this doesn't need to do anything. On machines
1097 which store all the registers in one fell swoop, this makes sure
1098 that registers contains all the registers from the program being
1102 remote_rdp_prepare_to_store ()
1104 /* Do nothing, since we can store individual regs */
1108 remote_rdp_xfer_inferior_memory (memaddr, myaddr, len, write, target)
1113 struct target_ops *target; /* ignored */
1115 /* I infer from D Taylor's code that there's a limit on the amount
1116 we can transfer in one chunk.. */
1121 int thisbite = len - done;
1122 if (thisbite > RDP_MOUTHFULL)
1123 thisbite = RDP_MOUTHFULL;
1129 justdone = rdp_write (memaddr + done, myaddr + done, thisbite);
1133 justdone = rdp_read (memaddr + done, myaddr + done, thisbite);
1138 if (justdone != thisbite)
1151 static struct yn stepinfo[] =
1153 {"Step more than one instruction", RDP_INFO_ABOUT_STEP_GT_1},
1154 {"Step to jump", RDP_INFO_ABOUT_STEP_TO_JMP},
1155 {"Step one instruction", RDP_INFO_ABOUT_STEP_1},
1159 static struct yn breakinfo[] =
1161 {"comparison breakpoints supported", RDP_INFO_ABOUT_BREAK_COMP},
1162 {"range breakpoints supported", RDP_INFO_ABOUT_BREAK_RANGE},
1163 {"watchpoints for byte reads supported", RDP_INFO_ABOUT_BREAK_BYTE_READ},
1164 {"watchpoints for half-word reads supported", RDP_INFO_ABOUT_BREAK_HALFWORD_READ},
1165 {"watchpoints for word reads supported", RDP_INFO_ABOUT_BREAK_WORD_READ},
1166 {"watchpoints for byte writes supported", RDP_INFO_ABOUT_BREAK_BYTE_WRITE},
1167 {"watchpoints for half-word writes supported", RDP_INFO_ABOUT_BREAK_HALFWORD_WRITE},
1168 {"watchpoints for word writes supported", RDP_INFO_ABOUT_BREAK_WORD_WRITE},
1169 {"mask break/watch-points supported", RDP_INFO_ABOUT_BREAK_MASK},
1170 {"thread-specific breakpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_BREAK},
1171 {"thread-specific watchpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_WATCH},
1172 {"conditional breakpoints supported", RDP_INFO_ABOUT_BREAK_COND},
1184 printf_unfiltered (" %-45s : %s\n", t->name, (info & t->bit) ? "Yes" : "No");
1190 remote_rdp_files_info (target)
1191 struct target_ops *target;
1193 printf_filtered ("Target capabilities:\n");
1194 dump_bits (stepinfo, ds.step_info);
1195 dump_bits (breakinfo, ds.break_info);
1196 printf_unfiltered ("target level RDI %x\n", (ds.target_info >> 5) & 3);
1200 /* Define the target subroutine names */
1202 struct target_ops remote_rdp_ops =
1204 "rdp", /* to_shortname */
1206 "Remote Target using the RDProtocol",
1208 "Use a remote ARM system which uses the ARM Remote Debugging Protocol",
1209 remote_rdp_open, /* to_open */
1210 remote_rdp_close, /* to_close */
1211 NULL, /* to_attach */
1212 NULL, /* to_detach */
1213 remote_rdp_resume, /* to_resume */
1214 remote_rdp_wait, /* to_wait */
1215 remote_rdp_fetch_register, /* to_fetch_registers */
1216 remote_rdp_store_register, /* to_store_registers */
1217 remote_rdp_prepare_to_store, /* to_prepare_to_store */
1218 remote_rdp_xfer_inferior_memory, /* to_xfer_memory */
1219 remote_rdp_files_info, /* to_files_info */
1220 remote_rdp_insert_breakpoint, /* to_insert_breakpoint */
1221 remote_rdp_remove_breakpoint, /* to_remove_breakpoint */
1222 NULL, /* to_terminal_init */
1223 NULL, /* to_terminal_inferior */
1224 NULL, /* to_terminal_ours_for_output */
1225 NULL, /* to_terminal_ours */
1226 NULL, /* to_terminal_info */
1227 remote_rdp_kill, /* to_kill */
1228 generic_load, /* to_load */
1229 NULL, /* to_lookup_symbol */
1230 NULL, /* to_create_inferior */
1231 generic_mourn_inferior, /* to_mourn_inferior */
1233 0, /* to_notice_signals */
1234 0, /* to_thread_alive */
1236 process_stratum, /* to_stratum */
1238 1, /* to_has_all_memory */
1239 1, /* to_has_memory */
1240 1, /* to_has_stack */
1241 1, /* to_has_registers */
1242 1, /* to_has_execution */
1243 NULL, /* sections */
1244 NULL, /* sections_end */
1245 OPS_MAGIC, /* to_magic */
1249 _initialize_remote_rdp ()
1251 add_target (&remote_rdp_ops);