13
13
* limitations under the License.
14
14
*/
15
15
16
+ #include <osd/cl_cdm.h>
16
17
#include <osd/gdbserver.h>
17
18
#include <osd/module.h>
18
19
#include <osd/osd.h>
39
40
struct osd_gdbserver_ctx {
40
41
struct osd_hostmod_ctx * hostmod_ctx ;
41
42
struct osd_log_ctx * log_ctx ;
43
+ struct osd_cdm_desc cdm_desc ;
44
+ uint16_t cdm_di_addr ;
42
45
int fd ;
43
46
char * name ;
44
47
char * port ;
@@ -53,21 +56,25 @@ struct osd_gdbserver_ctx {
53
56
API_EXPORT
54
57
osd_result osd_gdbserver_new (struct osd_gdbserver_ctx * * ctx ,
55
58
struct osd_log_ctx * log_ctx ,
56
- const char * host_controller_address )
59
+ const char * host_controller_address ,
60
+ uint16_t cdm_di_addr )
57
61
{
58
62
osd_result rv ;
59
63
60
64
struct osd_gdbserver_ctx * c = calloc (1 , sizeof (struct osd_gdbserver_ctx ));
61
65
assert (c );
62
66
63
67
c -> log_ctx = log_ctx ;
68
+ c -> cdm_di_addr = cdm_di_addr ;
64
69
65
70
struct osd_hostmod_ctx * hostmod_ctx ;
66
71
rv = osd_hostmod_new (& hostmod_ctx , log_ctx , host_controller_address , NULL ,
67
72
NULL );
68
73
assert (OSD_SUCCEEDED (rv ));
69
74
c -> hostmod_ctx = hostmod_ctx ;
70
75
76
+ // c->cdm_desc = cdm_desc;
77
+
71
78
* ctx = c ;
72
79
73
80
return OSD_OK ;
@@ -298,7 +305,7 @@ bool validate_rsp_packet(char *packet_buffer, int packet_len,
298
305
}
299
306
300
307
static osd_result receive_rsp_packet (struct osd_gdbserver_ctx * ctx ,
301
- int * packet_data_len , char * packet_data )
308
+ char * packet_data , int * packet_data_len )
302
309
{
303
310
int packet_char ;
304
311
osd_result rv ;
@@ -375,3 +382,149 @@ static osd_result send_rsp_packet(struct osd_gdbserver_ctx *ctx,
375
382
}
376
383
}
377
384
}
385
+
386
+ static osd_result gdb_read_general_registers_cmd (struct osd_gdbserver_ctx * ctx ,
387
+ char * packet_buffer ,
388
+ int packet_len )
389
+ {
390
+ osd_result rv ;
391
+ // SPR register address mapped as GPR0 in OR1K
392
+ // GROUP 0 REG_NUM 1024
393
+ uint16_t reg_addr = 0x400 ;
394
+
395
+ rv =
396
+ osd_cl_cdm_get_desc (ctx -> hostmod_ctx , ctx -> cdm_di_addr , & ctx -> cdm_desc );
397
+ if (OSD_FAILED (rv )) {
398
+ return rv ;
399
+ }
400
+
401
+ int core_reg_len = ctx -> cdm_desc .core_data_width ;
402
+ size_t reg_read_result [32 ];
403
+ // + 1 for null character
404
+ // used for storing the read register value of all the GPRs
405
+ char * reg_packet = malloc ((core_reg_len / 8 ) * 32 + 1 );
406
+
407
+ // read the value of each GPR from the CPU core and
408
+ // store it in the register packet
409
+ for (int i = 0 ; i < 32 ; i ++ ) {
410
+ rv = cl_cdm_cpureg_read (ctx -> hostmod_ctx , & ctx -> cdm_desc ,
411
+ & reg_read_result [i ], reg_addr + i , 0 );
412
+ if (OSD_FAILED (rv )) {
413
+ return rv ;
414
+ }
415
+
416
+ char * reg_val = malloc ((core_reg_len / 8 ) + 1 );
417
+ sprintf (reg_val , "%02lx" , reg_read_result [i ]);
418
+ strcat (reg_packet , reg_val );
419
+ free (reg_val );
420
+ }
421
+
422
+ rv = send_rsp_packet (ctx , reg_packet , (core_reg_len / 8 ) * 32 + 1 );
423
+ if (OSD_FAILED (rv )) {
424
+ return rv ;
425
+ }
426
+
427
+ free (reg_packet );
428
+
429
+ return OSD_OK ;
430
+ }
431
+
432
+ static osd_result gdb_write_general_registers_cmd (struct osd_gdbserver_ctx * ctx ,
433
+ char * packet , int packet_len )
434
+ {
435
+ osd_result rv ;
436
+ rv =
437
+ osd_cl_cdm_get_desc (ctx -> hostmod_ctx , ctx -> cdm_di_addr , & ctx -> cdm_desc );
438
+ if (OSD_FAILED (rv )) {
439
+ return rv ;
440
+ }
441
+
442
+ // increment by 1 to skip initial char 'G'
443
+ packet ++ ;
444
+ // SPR register address mapped as GPR0 in OR1K
445
+ // GROUP 0 REG_NUM 1024
446
+ uint16_t reg_addr = 0x400 ;
447
+ int core_reg_len = ctx -> cdm_desc .core_data_width ;
448
+
449
+ // write the value of each GPR in the CPU core
450
+ for (int i = 0 ; i < 32 ; i ++ ) {
451
+ char cur_reg_val [core_reg_len / 4 + 1 ];
452
+ for (int j = 0 ; j < core_reg_len / 4 ; j ++ ) {
453
+ cur_reg_val [j ] = packet [i * core_reg_len + j ];
454
+ }
455
+
456
+ cur_reg_val [core_reg_len / 4 ] = '\0' ;
457
+ size_t reg_val = strtoul (cur_reg_val , NULL , 16 );
458
+ rv = cl_cdm_cpureg_write (ctx -> hostmod_ctx , & ctx -> cdm_desc , & reg_val ,
459
+ reg_addr + i , 0 );
460
+ if (OSD_FAILED (rv )) {
461
+ return rv ;
462
+ }
463
+ }
464
+
465
+ rv = send_rsp_packet (ctx , "OK" , 2 );
466
+ if (OSD_FAILED (rv )) {
467
+ return rv ;
468
+ }
469
+
470
+ return OSD_OK ;
471
+ }
472
+
473
+ static osd_result gdb_read_register_cmd (struct osd_gdbserver_ctx * ctx ,
474
+ char * packet , int packet_len )
475
+ {
476
+ osd_result rv ;
477
+ uint16_t reg_addr = strtoul (packet + 1 , NULL , 16 );
478
+
479
+ rv =
480
+ osd_cl_cdm_get_desc (ctx -> hostmod_ctx , ctx -> cdm_di_addr , & ctx -> cdm_desc );
481
+ if (OSD_FAILED (rv )) {
482
+ return rv ;
483
+ }
484
+
485
+ int core_reg_len = ctx -> cdm_desc .core_data_width ;
486
+ size_t reg_read_result ;
487
+ rv = cl_cdm_cpureg_read (ctx -> hostmod_ctx , & ctx -> cdm_desc , & reg_read_result ,
488
+ reg_addr , 0 );
489
+ if (OSD_FAILED (rv )) {
490
+ return rv ;
491
+ }
492
+
493
+ char * reg_val = malloc (core_reg_len / 8 + 1 );
494
+ sprintf (reg_val , "%02lx" , reg_read_result );
495
+ rv = send_rsp_packet (ctx , reg_val , core_reg_len / 8 + 1 );
496
+ if (OSD_FAILED (rv )) {
497
+ return rv ;
498
+ }
499
+
500
+ free (reg_val );
501
+
502
+ return OSD_OK ;
503
+ }
504
+
505
+ static osd_result gdb_write_register_cmd (struct osd_gdbserver_ctx * ctx ,
506
+ char * packet , int packet_len )
507
+ {
508
+ osd_result rv ;
509
+ char * equal_separator ;
510
+ uint16_t reg_addr = strtoul (packet + 1 , & equal_separator , 16 );
511
+ rv =
512
+ osd_cl_cdm_get_desc (ctx -> hostmod_ctx , ctx -> cdm_di_addr , & ctx -> cdm_desc );
513
+ if (OSD_FAILED (rv )) {
514
+ return rv ;
515
+ }
516
+
517
+ size_t reg_val = strtoul (equal_separator + 1 , NULL , 16 );
518
+ rv = cl_cdm_cpureg_write (ctx -> hostmod_ctx , & ctx -> cdm_desc , & reg_val ,
519
+ reg_addr , 0 );
520
+ if (OSD_FAILED (rv )) {
521
+ return rv ;
522
+ }
523
+
524
+ rv = send_rsp_packet (ctx , "OK" , 2 );
525
+ if (OSD_FAILED (rv )) {
526
+ return rv ;
527
+ }
528
+
529
+ return OSD_OK ;
530
+ }
0 commit comments