[gem5-dev] Change in public/gem5[master]: arch-arm: Add AArch32 HLT Semihosting interface

2018-02-20 Thread Giacomo Travaglini (Gerrit)
Giacomo Travaglini merged this change by Giacomo Travaglini. (  
https://gem5-review.googlesource.com/8372 )


Change subject: arch-arm: Add AArch32 HLT Semihosting interface
..

arch-arm: Add AArch32 HLT Semihosting interface

AArch32 HLT instruction is now able to issue Arm Semihosting commands as
the AArch64 counterpart in either Arm and Thumb mode.

Change-Id: I77da73d2e6a9288c704a5f646f4447022517ceb6
Signed-off-by: Giacomo Travaglini 
Reviewed-by: Andreas Sandberg 
Reviewed-on: https://gem5-review.googlesource.com/8372
Maintainer: Andreas Sandberg 
---
M src/arch/arm/isa/decoder/arm.isa
M src/arch/arm/isa/formats/breakpoint.isa
M src/arch/arm/isa/formats/data.isa
M src/arch/arm/isa/insts/misc.isa
4 files changed, 60 insertions(+), 17 deletions(-)

Approvals:
  Andreas Sandberg: Looks good to me, approved; Looks good to me, approved



diff --git a/src/arch/arm/isa/decoder/arm.isa  
b/src/arch/arm/isa/decoder/arm.isa

index 9b8b37a..1a32ce6 100644
--- a/src/arch/arm/isa/decoder/arm.isa
+++ b/src/arch/arm/isa/decoder/arm.isa
@@ -1,6 +1,6 @@
 // -*- mode:c++ -*-

-// Copyright (c) 2010-2013,2017 ARM Limited
+// Copyright (c) 2010-2013,2017-2018 ARM Limited
 // All rights reserved
 //
 // The license below extends only to copyright in the software and shall
@@ -76,7 +76,7 @@
 0x5: ArmSatAddSub::armSatAddSub();
 0x6: ArmERet::armERet();
 0x7: decode OPCODE_22 {
-0: Breakpoint::bkpt();
+0: ArmBkptHlt::armBkptHlt();
 1: ArmSmcHyp::armSmcHyp();
 }
 }
diff --git a/src/arch/arm/isa/formats/breakpoint.isa  
b/src/arch/arm/isa/formats/breakpoint.isa

index a22f2de..4db470b 100644
--- a/src/arch/arm/isa/formats/breakpoint.isa
+++ b/src/arch/arm/isa/formats/breakpoint.isa
@@ -1,6 +1,6 @@
 // -*- mode:c++ -*-

-// Copyright (c) 2010 ARM Limited
+// Copyright (c) 2010,2018 ARM Limited
 // All rights reserved
 //
 // The license below extends only to copyright in the software and shall
@@ -87,7 +87,17 @@
 }
 }};

-def format Breakpoint() {{
-decode_block = 'return new Breakpoint(machInst);\n'
+def format ArmBkptHlt() {{
+decode_block = '''
+{
+if (bits(machInst, 21)) {
+return new Breakpoint(machInst);
+} else {
+uint32_t imm16 = (bits(machInst, 19, 8) << 4) |
+ (bits(machInst,  3, 0) << 0);
+return new Hlt(machInst, imm16);
+}
+}
+'''
 }};

diff --git a/src/arch/arm/isa/formats/data.isa  
b/src/arch/arm/isa/formats/data.isa

index 909a525..eab0818 100644
--- a/src/arch/arm/isa/formats/data.isa
+++ b/src/arch/arm/isa/formats/data.isa
@@ -1,4 +1,4 @@
-// Copyright (c) 2010,2017 ARM Limited
+// Copyright (c) 2010,2017-2018 ARM Limited
 // All rights reserved
 //
 // The license below extends only to copyright in the software and shall
@@ -1199,17 +1199,25 @@
 }
   case 0xa:
 {
-IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 2,  
0);
-IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 5,  
3);

-switch (bits(machInst, 7, 6)) {
-  case 0x0:
-return new Rev(machInst, rd, rm);
-  case 0x1:
-return new Rev16(machInst, rd, rm);
-  case 0x3:
-return new Revsh(machInst, rd, rm);
-  default:
-break;
+const uint8_t op1 = bits(machInst, 7, 6);
+if (op1 == 0x2) {
+return new Hlt(machInst, bits(machInst, 5, 0));
+} else {
+IntRegIndex rd =
+(IntRegIndex)(uint32_t)bits(machInst, 2, 0);
+IntRegIndex rm =
+(IntRegIndex)(uint32_t)bits(machInst, 5, 3);
+
+switch (op1) {
+  case 0x0:
+return new Rev(machInst, rd, rm);
+  case 0x1:
+return new Rev16(machInst, rd, rm);
+  case 0x3:
+return new Revsh(machInst, rd, rm);
+  default:
+break;
+}
 }
 }
 break;
diff --git a/src/arch/arm/isa/insts/misc.isa  
b/src/arch/arm/isa/insts/misc.isa

index 566ea4b..a183f5d 100644
--- a/src/arch/arm/isa/insts/misc.isa
+++ b/src/arch/arm/isa/insts/misc.isa
@@ -62,6 +62,31 @@
 decoder_output = SemihostConstructor.subst(svcIop)
 exec_output = PredOpExecute.subst(svcIop)

+hltCode = '''
+ThreadContext *tc = xc->tcBase();
+
+const auto semihost_imm = Thumb? 0x3C : 0xF000;
+
+if (ArmSystem::haveSemihosting(tc) && imm == semihost_imm) {
+R0 = ArmSystem::ca

[gem5-dev] Change in public/gem5[master]: arch-arm: Add AArch32 HLT Semihosting interface

2018-02-19 Thread Giacomo Travaglini (Gerrit)

Hello Andreas Sandberg,

I'd like you to do a code review. Please visit

https://gem5-review.googlesource.com/8372

to review the following change.


Change subject: arch-arm: Add AArch32 HLT Semihosting interface
..

arch-arm: Add AArch32 HLT Semihosting interface

AArch32 HLT instruction is now able to issue Arm Semihosting commands as
the AArch64 counterpart in either Arm and Thumb mode.

Change-Id: I77da73d2e6a9288c704a5f646f4447022517ceb6
Signed-off-by: Giacomo Travaglini 
Reviewed-by: Andreas Sandberg 
---
M src/arch/arm/isa/decoder/arm.isa
M src/arch/arm/isa/formats/breakpoint.isa
M src/arch/arm/isa/formats/data.isa
M src/arch/arm/isa/insts/misc.isa
4 files changed, 60 insertions(+), 17 deletions(-)



diff --git a/src/arch/arm/isa/decoder/arm.isa  
b/src/arch/arm/isa/decoder/arm.isa

index 9b8b37a..1a32ce6 100644
--- a/src/arch/arm/isa/decoder/arm.isa
+++ b/src/arch/arm/isa/decoder/arm.isa
@@ -1,6 +1,6 @@
 // -*- mode:c++ -*-

-// Copyright (c) 2010-2013,2017 ARM Limited
+// Copyright (c) 2010-2013,2017-2018 ARM Limited
 // All rights reserved
 //
 // The license below extends only to copyright in the software and shall
@@ -76,7 +76,7 @@
 0x5: ArmSatAddSub::armSatAddSub();
 0x6: ArmERet::armERet();
 0x7: decode OPCODE_22 {
-0: Breakpoint::bkpt();
+0: ArmBkptHlt::armBkptHlt();
 1: ArmSmcHyp::armSmcHyp();
 }
 }
diff --git a/src/arch/arm/isa/formats/breakpoint.isa  
b/src/arch/arm/isa/formats/breakpoint.isa

index a22f2de..4db470b 100644
--- a/src/arch/arm/isa/formats/breakpoint.isa
+++ b/src/arch/arm/isa/formats/breakpoint.isa
@@ -1,6 +1,6 @@
 // -*- mode:c++ -*-

-// Copyright (c) 2010 ARM Limited
+// Copyright (c) 2010,2018 ARM Limited
 // All rights reserved
 //
 // The license below extends only to copyright in the software and shall
@@ -87,7 +87,17 @@
 }
 }};

-def format Breakpoint() {{
-decode_block = 'return new Breakpoint(machInst);\n'
+def format ArmBkptHlt() {{
+decode_block = '''
+{
+if (bits(machInst, 21)) {
+return new Breakpoint(machInst);
+} else {
+uint32_t imm16 = (bits(machInst, 19, 8) << 4) |
+ (bits(machInst,  3, 0) << 0);
+return new Hlt(machInst, imm16);
+}
+}
+'''
 }};

diff --git a/src/arch/arm/isa/formats/data.isa  
b/src/arch/arm/isa/formats/data.isa

index 909a525..eab0818 100644
--- a/src/arch/arm/isa/formats/data.isa
+++ b/src/arch/arm/isa/formats/data.isa
@@ -1,4 +1,4 @@
-// Copyright (c) 2010,2017 ARM Limited
+// Copyright (c) 2010,2017-2018 ARM Limited
 // All rights reserved
 //
 // The license below extends only to copyright in the software and shall
@@ -1199,17 +1199,25 @@
 }
   case 0xa:
 {
-IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 2,  
0);
-IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 5,  
3);

-switch (bits(machInst, 7, 6)) {
-  case 0x0:
-return new Rev(machInst, rd, rm);
-  case 0x1:
-return new Rev16(machInst, rd, rm);
-  case 0x3:
-return new Revsh(machInst, rd, rm);
-  default:
-break;
+const uint8_t op1 = bits(machInst, 7, 6);
+if (op1 == 0x2) {
+return new Hlt(machInst, bits(machInst, 5, 0));
+} else {
+IntRegIndex rd =
+(IntRegIndex)(uint32_t)bits(machInst, 2, 0);
+IntRegIndex rm =
+(IntRegIndex)(uint32_t)bits(machInst, 5, 3);
+
+switch (op1) {
+  case 0x0:
+return new Rev(machInst, rd, rm);
+  case 0x1:
+return new Rev16(machInst, rd, rm);
+  case 0x3:
+return new Revsh(machInst, rd, rm);
+  default:
+break;
+}
 }
 }
 break;
diff --git a/src/arch/arm/isa/insts/misc.isa  
b/src/arch/arm/isa/insts/misc.isa

index 566ea4b..a183f5d 100644
--- a/src/arch/arm/isa/insts/misc.isa
+++ b/src/arch/arm/isa/insts/misc.isa
@@ -62,6 +62,31 @@
 decoder_output = SemihostConstructor.subst(svcIop)
 exec_output = PredOpExecute.subst(svcIop)

+hltCode = '''
+ThreadContext *tc = xc->tcBase();
+
+const auto semihost_imm = Thumb? 0x3C : 0xF000;
+
+if (ArmSystem::haveSemihosting(tc) && imm == semihost_imm) {
+R0 = ArmSystem::callSemihosting32(tc, R0, R1);
+} else {
+// HLT instructions aren't implemented, so treat them as undefined
+