@@ -34,6 +34,7 @@ struct InternalCPUState
34
34
uint32_t mcause ;
35
35
uint32_t reserved [21 ];
36
36
uint8_t uart8250 [8 ]; //@248
37
+ uint8_t * image ;
37
38
};
38
39
39
40
@@ -136,6 +137,7 @@ int main( int argc, char ** argv )
136
137
core .pc = ram_image_offset ;
137
138
core .registers [10 ] = 0x00 ; //hart ID
138
139
core .registers [11 ] = dtb_ptr ?(dtb_ptr + 0x80000000 ):0 ; //dtb_pa (Must be valid pointer) (Should be pointer to dtb)
140
+ core .image = ram_image ;
139
141
140
142
// Image is loaded.
141
143
int rt ;
@@ -180,11 +182,17 @@ int ReadCSR( struct InternalCPUState * state, int csr )
180
182
}
181
183
}
182
184
183
- void WriteCSR ( struct InternalCPUState * state , int csr , int value )
185
+ void WriteCSR ( struct InternalCPUState * state , int csr , uint32_t value )
184
186
{
185
187
printf ( "%04x = %08x\n" , csr , value );
186
188
switch ( csr )
187
189
{
190
+ case 0x137 :
191
+ {
192
+ // Special, side-channel printf.
193
+ printf ( "SIDE-CHANNEL-DEBUG: %s\n" , state -> image + value - 0x80000000 );
194
+ break ;
195
+ }
188
196
case 0x340 : state -> mscratch = value ; break ;
189
197
case 0x305 : state -> mtvec = value ; break ;
190
198
case 0x304 : state -> mie = value ; break ;
@@ -317,9 +325,11 @@ int StepInstruction( struct InternalCPUState * state, uint8_t * image, uint32_t
317
325
if ( rsval >= 0x90000000 && rsval < 0x90000008 )
318
326
{
319
327
//Special: UART.
320
- printf ( "****************************Read UART: %08x\n" , rsval );
321
- rsval = (rsval - 0x90000000 ) - (intptr_t )image + (intptr_t )state -> uart8250 ;
322
- state -> uart8250 [5 ] |= 0x20 ;
328
+ //if(rsval != 0x90000005 ) printf( "****************************Read UART: %08x %08x\n", rsval, pc );
329
+ rsval = (rsval - 0x90000000 );
330
+ state -> uart8250 [5 ] |= 0x60 ;
331
+ //printf( "=> %08x\n", *((uint32_t*)(image + rsval)) );
332
+ if ( rdid ) regs [rdid ] = state -> uart8250 [rsval ];
323
333
}
324
334
else if ( rsval >= ram_amt - 3 )
325
335
{
@@ -356,7 +366,15 @@ int StepInstruction( struct InternalCPUState * state, uint8_t * image, uint32_t
356
366
if ( addy >= 0x90000000 && addy < 0x90000008 )
357
367
{
358
368
//Special: UART.
359
- printf ( "************************** Write UART: %08x -> %08x\n" , addy , rs2 );
369
+ if ( addy == 0x90000000 )
370
+ {
371
+ printf ( "%c" , rs2 );
372
+ fflush ( stdout );
373
+ }
374
+ else
375
+ {
376
+ printf ( "************************** Write UART: %08x -> %08x\n" , addy , rs2 );
377
+ }
360
378
addy = (addy - 0x90000000 ) - (intptr_t )image + (intptr_t )state -> uart8250 ;
361
379
}
362
380
else if ( addy >= ram_amt - 3 )
@@ -416,16 +434,25 @@ int StepInstruction( struct InternalCPUState * state, uint8_t * image, uint32_t
416
434
{
417
435
// RV32M
418
436
// XXX TODO: Check MULH/MULHSU/MULHU
419
- switch ( (ir >>12 )& 7 )
437
+
438
+ if ( ( (ir >>12 ) & 0x100 ) && rs2 == 0 )
439
+ {
440
+ //Integer division by zero
441
+
442
+ }
443
+ else
420
444
{
421
- case 0b000 : val = rs1 * rs2 ; break ; // MUL
422
- case 0b001 : val = ((int64_t )rs1 * (int64_t )rs2 ) >> 32 ; break ; // MULH
423
- case 0b010 : val = ((int64_t )rs1 * (uint64_t )rs2 ) >> 32 ; break ; // MULHSU
424
- case 0b011 : val = ((uint64_t )rs1 * (uint64_t )rs2 ) >> 32 ; break ; // MULHU
425
- case 0b100 : val = (int32_t )rs1 / (int32_t )rs2 ; break ; // DIV
426
- case 0b101 : val = rs1 / rs2 ; break ; // DIVU
427
- case 0b110 : val = (int32_t )rs1 % (int32_t )rs2 ; break ; // REM
428
- case 0b111 : val = rs1 % rs2 ; break ; // REMU
445
+ switch ( (ir >>12 )& 7 )
446
+ {
447
+ case 0b000 : val = rs1 * rs2 ; break ; // MUL
448
+ case 0b001 : val = ((int64_t )rs1 * (int64_t )rs2 ) >> 32 ; break ; // MULH
449
+ case 0b010 : val = ((int64_t )rs1 * (uint64_t )rs2 ) >> 32 ; break ; // MULHSU
450
+ case 0b011 : val = ((uint64_t )rs1 * (uint64_t )rs2 ) >> 32 ; break ; // MULHU
451
+ case 0b100 : if ( rs2 == 0 ) val = -1 ; else val = (int32_t )rs1 / (int32_t )rs2 ; break ; // DIV
452
+ case 0b101 : if ( rs2 == 0 ) val = 0xffffffff ; else val = rs1 / rs2 ; break ; // DIVU
453
+ case 0b110 : if ( rs2 == 0 ) val = rs1 ; else val = (int32_t )rs1 % (int32_t )rs2 ; break ; // REM
454
+ case 0b111 : if ( rs2 == 0 ) val = rs1 ; else val = rs1 % rs2 ; break ; // REMU
455
+ }
429
456
}
430
457
}
431
458
else
@@ -437,7 +464,7 @@ int StepInstruction( struct InternalCPUState * state, uint8_t * image, uint32_t
437
464
case 0b010 : val = (int32_t )rs1 < (int32_t )rs2 ; break ;
438
465
case 0b011 : val = rs1 < rs2 ; break ;
439
466
case 0b100 : val = rs1 ^ rs2 ; break ;
440
- case 0b101 : val = (ir & 0x40000000 ) ? ( ((int32_t )rs1 ) >> rs2 ) : ( rs1 << rs2 ); break ;
467
+ case 0b101 : val = (ir & 0x40000000 ) ? ( ((int32_t )rs1 ) >> rs2 ) : ( rs1 >> rs2 ); break ;
441
468
case 0b110 : val = rs1 | rs2 ; break ;
442
469
case 0b111 : val = rs1 & rs2 ; break ;
443
470
}
@@ -478,6 +505,10 @@ int StepInstruction( struct InternalCPUState * state, uint8_t * image, uint32_t
478
505
;// WFI, Ignore.
479
506
else
480
507
{
508
+ if ( (ir >> 24 ) == 0xff )
509
+ {
510
+ exit (1 );
511
+ }
481
512
//retval = -100;
482
513
printf ( "EBREAK EBREAK EBREAK @ %08x\n" , pc );//retval = 1;
483
514
}
0 commit comments