+ target_register_event_callback(nds32_callback_event_handler,
+ &(nds32->target->target_number));
+
+ return ERROR_OK;
+}
+
+int nds32_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info)
+{
+ /* fill syscall parameters to file-I/O info */
+ if (NULL == fileio_info) {
+ LOG_ERROR("Target has not initial file-I/O data structure");
+ return ERROR_FAIL;
+ }
+
+ struct nds32 *nds32 = target_to_nds32(target);
+ uint32_t value_ir6;
+ uint32_t syscall_id;
+
+ if (nds32->hit_syscall == false)
+ return ERROR_FAIL;
+
+ nds32_get_mapped_reg(nds32, IR6, &value_ir6);
+ syscall_id = (value_ir6 >> 16) & 0x7FFF;
+ nds32->active_syscall_id = syscall_id;
+
+ LOG_DEBUG("hit syscall ID: 0x%" PRIx32, syscall_id);
+
+ /* free previous identifier storage */
+ if (NULL != fileio_info->identifier) {
+ free(fileio_info->identifier);
+ fileio_info->identifier = NULL;
+ }
+
+ switch (syscall_id) {
+ case NDS32_SYSCALL_EXIT:
+ fileio_info->identifier = (char *)malloc(5);
+ sprintf(fileio_info->identifier, "exit");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ break;
+ case NDS32_SYSCALL_OPEN:
+ {
+ uint8_t filename[256];
+ fileio_info->identifier = (char *)malloc(5);
+ sprintf(fileio_info->identifier, "open");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ /* reserve fileio_info->param_2 for length of path */
+ nds32_get_mapped_reg(nds32, R1, &(fileio_info->param_3));
+ nds32_get_mapped_reg(nds32, R2, &(fileio_info->param_4));
+
+ target->type->read_buffer(target, fileio_info->param_1,
+ 256, filename);
+ fileio_info->param_2 = strlen((char *)filename) + 1;
+ }
+ break;
+ case NDS32_SYSCALL_CLOSE:
+ fileio_info->identifier = (char *)malloc(6);
+ sprintf(fileio_info->identifier, "close");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ break;
+ case NDS32_SYSCALL_READ:
+ fileio_info->identifier = (char *)malloc(5);
+ sprintf(fileio_info->identifier, "read");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ nds32_get_mapped_reg(nds32, R1, &(fileio_info->param_2));
+ nds32_get_mapped_reg(nds32, R2, &(fileio_info->param_3));
+ break;
+ case NDS32_SYSCALL_WRITE:
+ fileio_info->identifier = (char *)malloc(6);
+ sprintf(fileio_info->identifier, "write");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ nds32_get_mapped_reg(nds32, R1, &(fileio_info->param_2));
+ nds32_get_mapped_reg(nds32, R2, &(fileio_info->param_3));
+ break;
+ case NDS32_SYSCALL_LSEEK:
+ fileio_info->identifier = (char *)malloc(6);
+ sprintf(fileio_info->identifier, "lseek");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ nds32_get_mapped_reg(nds32, R1, &(fileio_info->param_2));
+ nds32_get_mapped_reg(nds32, R2, &(fileio_info->param_3));
+ break;
+ case NDS32_SYSCALL_UNLINK:
+ {
+ uint8_t filename[256];
+ fileio_info->identifier = (char *)malloc(7);
+ sprintf(fileio_info->identifier, "unlink");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ /* reserve fileio_info->param_2 for length of path */
+
+ target->type->read_buffer(target, fileio_info->param_1,
+ 256, filename);
+ fileio_info->param_2 = strlen((char *)filename) + 1;
+ }
+ break;
+ case NDS32_SYSCALL_RENAME:
+ {
+ uint8_t filename[256];
+ fileio_info->identifier = (char *)malloc(7);
+ sprintf(fileio_info->identifier, "rename");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ /* reserve fileio_info->param_2 for length of old path */
+ nds32_get_mapped_reg(nds32, R1, &(fileio_info->param_3));
+ /* reserve fileio_info->param_4 for length of new path */
+
+ target->type->read_buffer(target, fileio_info->param_1,
+ 256, filename);
+ fileio_info->param_2 = strlen((char *)filename) + 1;
+
+ target->type->read_buffer(target, fileio_info->param_3,
+ 256, filename);
+ fileio_info->param_4 = strlen((char *)filename) + 1;
+ }
+ break;
+ case NDS32_SYSCALL_FSTAT:
+ fileio_info->identifier = (char *)malloc(6);
+ sprintf(fileio_info->identifier, "fstat");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ nds32_get_mapped_reg(nds32, R1, &(fileio_info->param_2));
+ break;
+ case NDS32_SYSCALL_STAT:
+ {
+ uint8_t filename[256];
+ fileio_info->identifier = (char *)malloc(5);
+ sprintf(fileio_info->identifier, "stat");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ /* reserve fileio_info->param_2 for length of old path */
+ nds32_get_mapped_reg(nds32, R1, &(fileio_info->param_3));
+
+ target->type->read_buffer(target, fileio_info->param_1,
+ 256, filename);
+ fileio_info->param_2 = strlen((char *)filename) + 1;
+ }
+ break;
+ case NDS32_SYSCALL_GETTIMEOFDAY:
+ fileio_info->identifier = (char *)malloc(13);
+ sprintf(fileio_info->identifier, "gettimeofday");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ nds32_get_mapped_reg(nds32, R1, &(fileio_info->param_2));
+ break;
+ case NDS32_SYSCALL_ISATTY:
+ fileio_info->identifier = (char *)malloc(7);
+ sprintf(fileio_info->identifier, "isatty");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ break;
+ case NDS32_SYSCALL_SYSTEM:
+ {
+ uint8_t command[256];
+ fileio_info->identifier = (char *)malloc(7);
+ sprintf(fileio_info->identifier, "system");
+ nds32_get_mapped_reg(nds32, R0, &(fileio_info->param_1));
+ /* reserve fileio_info->param_2 for length of old path */
+
+ target->type->read_buffer(target, fileio_info->param_1,
+ 256, command);
+ fileio_info->param_2 = strlen((char *)command) + 1;
+ }
+ break;
+ case NDS32_SYSCALL_ERRNO:
+ fileio_info->identifier = (char *)malloc(6);
+ sprintf(fileio_info->identifier, "errno");
+ nds32_set_mapped_reg(nds32, R0, nds32->virtual_hosting_errno);
+ break;
+ default:
+ fileio_info->identifier = (char *)malloc(8);
+ sprintf(fileio_info->identifier, "unknown");
+ break;
+ }