Changes in kernel/generic/src/udebug/udebug_ipc.c [31696b4f:96b02eb9] in mainline
- File:
-
- 1 edited
-
kernel/generic/src/udebug/udebug_ipc.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/udebug/udebug_ipc.c
r31696b4f r96b02eb9 41 41 #include <proc/task.h> 42 42 #include <proc/thread.h> 43 #include <mm/as.h> 43 44 #include <arch.h> 44 45 #include <errno.h> … … 165 166 static void udebug_receive_thread_read(call_t *call) 166 167 { 167 unative_t uspace_addr; 168 unative_t to_copy; 169 unsigned total_bytes; 170 unsigned buf_size; 168 uintptr_t uspace_addr; 169 size_t buf_size; 171 170 void *buffer; 172 size_t n;171 size_t copied, needed; 173 172 int rc; 174 173 … … 180 179 * of threads times thread-id size. 181 180 */ 182 rc = udebug_thread_read(&buffer, buf_size, & n);181 rc = udebug_thread_read(&buffer, buf_size, &copied, &needed); 183 182 if (rc < 0) { 184 183 IPC_SET_RETVAL(call->data, rc); … … 187 186 } 188 187 189 total_bytes = n; 190 191 /* Copy MAX(buf_size, total_bytes) bytes */ 192 193 if (buf_size > total_bytes) 194 to_copy = total_bytes; 188 /* 189 * Make use of call->buffer to transfer data to caller's userspace 190 */ 191 192 IPC_SET_RETVAL(call->data, 0); 193 /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that 194 same code in process_answer() can be used 195 (no way to distinguish method in answer) */ 196 IPC_SET_ARG1(call->data, uspace_addr); 197 IPC_SET_ARG2(call->data, copied); 198 IPC_SET_ARG3(call->data, needed); 199 call->buffer = buffer; 200 201 ipc_answer(&TASK->kb.box, call); 202 } 203 204 /** Process a NAME_READ call. 205 * 206 * Returns a string containing the name of the task. 207 * 208 * @param call The call structure. 209 */ 210 static void udebug_receive_name_read(call_t *call) 211 { 212 sysarg_t uspace_addr; 213 sysarg_t to_copy; 214 size_t data_size; 215 size_t buf_size; 216 void *data; 217 218 uspace_addr = IPC_GET_ARG2(call->data); /* Destination address */ 219 buf_size = IPC_GET_ARG3(call->data); /* Dest. buffer size */ 220 221 /* 222 * Read task name. 223 */ 224 udebug_name_read((char **) &data, &data_size); 225 226 /* Copy MAX(buf_size, data_size) bytes */ 227 228 if (buf_size > data_size) 229 to_copy = data_size; 195 230 else 196 231 to_copy = buf_size; … … 207 242 IPC_SET_ARG2(call->data, to_copy); 208 243 209 IPC_SET_ARG3(call->data, total_bytes); 210 call->buffer = buffer; 211 212 ipc_answer(&TASK->kb.box, call); 213 } 244 IPC_SET_ARG3(call->data, data_size); 245 call->buffer = data; 246 247 ipc_answer(&TASK->kb.box, call); 248 } 249 250 /** Process an AREAS_READ call. 251 * 252 * Returns a list of address space areas in the current task, as an array 253 * of as_area_info_t structures. 254 * 255 * @param call The call structure. 256 */ 257 static void udebug_receive_areas_read(call_t *call) 258 { 259 sysarg_t uspace_addr; 260 sysarg_t to_copy; 261 size_t data_size; 262 size_t buf_size; 263 void *data; 264 265 uspace_addr = IPC_GET_ARG2(call->data); /* Destination address */ 266 buf_size = IPC_GET_ARG3(call->data); /* Dest. buffer size */ 267 268 /* 269 * Read area list. 270 */ 271 as_get_area_info(AS, (as_area_info_t **) &data, &data_size); 272 273 /* Copy MAX(buf_size, data_size) bytes */ 274 275 if (buf_size > data_size) 276 to_copy = data_size; 277 else 278 to_copy = buf_size; 279 280 /* 281 * Make use of call->buffer to transfer data to caller's userspace 282 */ 283 284 IPC_SET_RETVAL(call->data, 0); 285 /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that 286 same code in process_answer() can be used 287 (no way to distinguish method in answer) */ 288 IPC_SET_ARG1(call->data, uspace_addr); 289 IPC_SET_ARG2(call->data, to_copy); 290 291 IPC_SET_ARG3(call->data, data_size); 292 call->buffer = data; 293 294 ipc_answer(&TASK->kb.box, call); 295 } 296 214 297 215 298 /** Process an ARGS_READ call. … … 221 304 { 222 305 thread_t *t; 223 unative_t uspace_addr;306 sysarg_t uspace_addr; 224 307 int rc; 225 308 void *buffer; … … 245 328 (no way to distinguish method in answer) */ 246 329 IPC_SET_ARG1(call->data, uspace_addr); 247 IPC_SET_ARG2(call->data, 6 * sizeof( unative_t));330 IPC_SET_ARG2(call->data, 6 * sizeof(sysarg_t)); 248 331 call->buffer = buffer; 249 332 … … 251 334 } 252 335 336 /** Receive a REGS_READ call. 337 * 338 * Reads the thread's register state (istate structure). 339 */ 340 static void udebug_receive_regs_read(call_t *call) 341 { 342 thread_t *t; 343 sysarg_t uspace_addr; 344 sysarg_t to_copy; 345 void *buffer; 346 int rc; 347 348 t = (thread_t *) IPC_GET_ARG2(call->data); 349 350 rc = udebug_regs_read(t, &buffer); 351 if (rc < 0) { 352 IPC_SET_RETVAL(call->data, rc); 353 ipc_answer(&TASK->kb.box, call); 354 return; 355 } 356 357 /* 358 * Make use of call->buffer to transfer data to caller's userspace 359 */ 360 361 uspace_addr = IPC_GET_ARG3(call->data); 362 to_copy = sizeof(istate_t); 363 364 IPC_SET_RETVAL(call->data, 0); 365 /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that 366 same code in process_answer() can be used 367 (no way to distinguish method in answer) */ 368 IPC_SET_ARG1(call->data, uspace_addr); 369 IPC_SET_ARG2(call->data, to_copy); 370 371 call->buffer = buffer; 372 373 ipc_answer(&TASK->kb.box, call); 374 } 375 376 253 377 /** Process an MEM_READ call. 254 378 * … … 258 382 static void udebug_receive_mem_read(call_t *call) 259 383 { 260 unative_t uspace_dst;261 unative_t uspace_src;384 sysarg_t uspace_dst; 385 sysarg_t uspace_src; 262 386 unsigned size; 263 387 void *buffer; … … 331 455 udebug_receive_thread_read(call); 332 456 break; 457 case UDEBUG_M_NAME_READ: 458 udebug_receive_name_read(call); 459 break; 460 case UDEBUG_M_AREAS_READ: 461 udebug_receive_areas_read(call); 462 break; 333 463 case UDEBUG_M_ARGS_READ: 334 464 udebug_receive_args_read(call); 335 465 break; 466 case UDEBUG_M_REGS_READ: 467 udebug_receive_regs_read(call); 468 break; 336 469 case UDEBUG_M_MEM_READ: 337 470 udebug_receive_mem_read(call);
Note:
See TracChangeset
for help on using the changeset viewer.
