44//! Architecture specific data and definitions
55
66use self :: {
7+ aarch64:: AArch64ArchitectureOperations , arm:: ARMArchitectureOperations ,
78 risc_v:: RISCVArchitectureOperations , x86:: X86ArchitectureOperations ,
89 x86_64:: X86_64ArchitectureOperations ,
910} ;
@@ -24,6 +25,8 @@ use simics::{
2425} ;
2526use std:: { fmt:: Debug , str:: FromStr } ;
2627
28+ pub mod aarch64;
29+ pub mod arm;
2730pub mod risc_v;
2831pub mod x86;
2932pub mod x86_64;
@@ -37,6 +40,10 @@ pub(crate) enum ArchitectureHint {
3740 I386 ,
3841 /// The architecture is RISCV
3942 Riscv ,
43+ /// The architecture is arm
44+ Arm ,
45+ /// The architecture is aarch64
46+ Aarch64 ,
4047}
4148
4249impl FromStr for ArchitectureHint {
@@ -47,6 +54,8 @@ impl FromStr for ArchitectureHint {
4754 "x86-64" => Self :: X86_64 ,
4855 "i386" | "i486" | "i586" | "i686" | "ia-32" | "x86" => Self :: I386 ,
4956 "riscv" | "risc-v" | "riscv32" | "riscv64" => Self :: Riscv ,
57+ "armv4" | "armv5" | "armv6" | "armv7" | "arm" | "arm32" => Self :: Arm ,
58+ "aarch64" | "armv8" | "arm64" => Self :: Aarch64 ,
5059 _ => bail ! ( "Unknown hint: {}" , s) ,
5160 } )
5261 }
@@ -58,6 +67,8 @@ impl From<ArchitectureHint> for AttrValueType {
5867 ArchitectureHint :: X86_64 => "x86-64" ,
5968 ArchitectureHint :: I386 => "i386" ,
6069 ArchitectureHint :: Riscv => "risc-v" ,
70+ ArchitectureHint :: Arm => "arm" ,
71+ ArchitectureHint :: Aarch64 => "aarch64" ,
6172 }
6273 . into ( )
6374 }
@@ -76,6 +87,12 @@ impl ArchitectureHint {
7687 ArchitectureHint :: Riscv => {
7788 Architecture :: Riscv ( RISCVArchitectureOperations :: new_unchecked ( cpu) ?)
7889 }
90+ ArchitectureHint :: Arm => {
91+ Architecture :: Arm ( ARMArchitectureOperations :: new_unchecked ( cpu) ?)
92+ }
93+ ArchitectureHint :: Aarch64 => {
94+ Architecture :: Aarch64 ( AArch64ArchitectureOperations :: new_unchecked ( cpu) ?)
95+ }
7996 } )
8097 }
8198}
@@ -87,6 +104,10 @@ pub(crate) enum Architecture {
87104 I386 ( X86ArchitectureOperations ) ,
88105 /// The RISC-V architecture
89106 Riscv ( RISCVArchitectureOperations ) ,
107+ /// The ARM architecture (v7 and below)
108+ Arm ( ARMArchitectureOperations ) ,
109+ /// The AARCH64 architecture (v8 and above)
110+ Aarch64 ( AArch64ArchitectureOperations ) ,
90111}
91112
92113impl Debug for Architecture {
@@ -98,6 +119,8 @@ impl Debug for Architecture {
98119 Architecture :: X86_64 ( _) => "x86-64" ,
99120 Architecture :: I386 ( _) => "i386" ,
100121 Architecture :: Riscv ( _) => "risc-v" ,
122+ Architecture :: Arm ( _) => "arm" ,
123+ Architecture :: Aarch64 ( _) => "aarch64" ,
101124 }
102125 )
103126 }
@@ -513,6 +536,10 @@ impl ArchitectureOperations for Architecture {
513536 Ok ( Self :: I386 ( x86) )
514537 } else if let Ok ( riscv) = RISCVArchitectureOperations :: new ( cpu) {
515538 Ok ( Self :: Riscv ( riscv) )
539+ } else if let Ok ( arm) = ARMArchitectureOperations :: new ( cpu) {
540+ Ok ( Self :: Arm ( arm) )
541+ } else if let Ok ( aarch64) = AArch64ArchitectureOperations :: new ( cpu) {
542+ Ok ( Self :: Aarch64 ( aarch64) )
516543 } else {
517544 bail ! ( "Unsupported architecture" ) ;
518545 }
@@ -523,6 +550,8 @@ impl ArchitectureOperations for Architecture {
523550 Architecture :: X86_64 ( x86_64) => x86_64. cpu ( ) ,
524551 Architecture :: I386 ( i386) => i386. cpu ( ) ,
525552 Architecture :: Riscv ( riscv) => riscv. cpu ( ) ,
553+ Architecture :: Arm ( arm) => arm. cpu ( ) ,
554+ Architecture :: Aarch64 ( aarch64) => aarch64. cpu ( ) ,
526555 }
527556 }
528557
@@ -531,6 +560,8 @@ impl ArchitectureOperations for Architecture {
531560 Architecture :: X86_64 ( x86_64) => x86_64. disassembler ( ) ,
532561 Architecture :: I386 ( i386) => i386. disassembler ( ) ,
533562 Architecture :: Riscv ( riscv) => riscv. disassembler ( ) ,
563+ Architecture :: Arm ( arm) => arm. disassembler ( ) ,
564+ Architecture :: Aarch64 ( aarch64) => aarch64. disassembler ( ) ,
534565 }
535566 }
536567
@@ -539,6 +570,8 @@ impl ArchitectureOperations for Architecture {
539570 Architecture :: X86_64 ( x86_64) => x86_64. int_register ( ) ,
540571 Architecture :: I386 ( i386) => i386. int_register ( ) ,
541572 Architecture :: Riscv ( riscv) => riscv. int_register ( ) ,
573+ Architecture :: Arm ( arm) => arm. int_register ( ) ,
574+ Architecture :: Aarch64 ( aarch64) => aarch64. int_register ( ) ,
542575 }
543576 }
544577
@@ -547,6 +580,8 @@ impl ArchitectureOperations for Architecture {
547580 Architecture :: X86_64 ( x86_64) => x86_64. processor_info_v2 ( ) ,
548581 Architecture :: I386 ( i386) => i386. processor_info_v2 ( ) ,
549582 Architecture :: Riscv ( riscv) => riscv. processor_info_v2 ( ) ,
583+ Architecture :: Arm ( arm) => arm. processor_info_v2 ( ) ,
584+ Architecture :: Aarch64 ( aarch64) => aarch64. processor_info_v2 ( ) ,
550585 }
551586 }
552587
@@ -555,6 +590,8 @@ impl ArchitectureOperations for Architecture {
555590 Architecture :: X86_64 ( x86_64) => x86_64. cpu_instruction_query ( ) ,
556591 Architecture :: I386 ( i386) => i386. cpu_instruction_query ( ) ,
557592 Architecture :: Riscv ( riscv) => riscv. cpu_instruction_query ( ) ,
593+ Architecture :: Arm ( arm) => arm. cpu_instruction_query ( ) ,
594+ Architecture :: Aarch64 ( aarch64) => aarch64. cpu_instruction_query ( ) ,
558595 }
559596 }
560597
@@ -563,6 +600,8 @@ impl ArchitectureOperations for Architecture {
563600 Architecture :: X86_64 ( x86_64) => x86_64. cpu_instrumentation_subscribe ( ) ,
564601 Architecture :: I386 ( i386) => i386. cpu_instrumentation_subscribe ( ) ,
565602 Architecture :: Riscv ( riscv) => riscv. cpu_instrumentation_subscribe ( ) ,
603+ Architecture :: Arm ( arm) => arm. cpu_instrumentation_subscribe ( ) ,
604+ Architecture :: Aarch64 ( aarch64) => aarch64. cpu_instrumentation_subscribe ( ) ,
566605 }
567606 }
568607
@@ -571,6 +610,8 @@ impl ArchitectureOperations for Architecture {
571610 Architecture :: X86_64 ( x86_64) => x86_64. cycle ( ) ,
572611 Architecture :: I386 ( i386) => i386. cycle ( ) ,
573612 Architecture :: Riscv ( riscv) => riscv. cycle ( ) ,
613+ Architecture :: Arm ( arm) => arm. cycle ( ) ,
614+ Architecture :: Aarch64 ( aarch64) => aarch64. cycle ( ) ,
574615 }
575616 }
576617
@@ -579,6 +620,8 @@ impl ArchitectureOperations for Architecture {
579620 Architecture :: X86_64 ( x86_64) => x86_64. get_magic_index_selector ( ) ,
580621 Architecture :: I386 ( i386) => i386. get_magic_index_selector ( ) ,
581622 Architecture :: Riscv ( riscv) => riscv. get_magic_index_selector ( ) ,
623+ Architecture :: Arm ( arm) => arm. get_magic_index_selector ( ) ,
624+ Architecture :: Aarch64 ( aarch64) => aarch64. get_magic_index_selector ( ) ,
582625 }
583626 }
584627
@@ -587,6 +630,8 @@ impl ArchitectureOperations for Architecture {
587630 Architecture :: X86_64 ( x86_64) => x86_64. get_magic_start_buffer_ptr_size_ptr ( ) ,
588631 Architecture :: I386 ( i386) => i386. get_magic_start_buffer_ptr_size_ptr ( ) ,
589632 Architecture :: Riscv ( riscv) => riscv. get_magic_start_buffer_ptr_size_ptr ( ) ,
633+ Architecture :: Arm ( arm) => arm. get_magic_start_buffer_ptr_size_ptr ( ) ,
634+ Architecture :: Aarch64 ( aarch64) => aarch64. get_magic_start_buffer_ptr_size_ptr ( ) ,
590635 }
591636 }
592637
@@ -595,6 +640,8 @@ impl ArchitectureOperations for Architecture {
595640 Architecture :: X86_64 ( x86_64) => x86_64. get_magic_start_buffer_ptr_size_val ( ) ,
596641 Architecture :: I386 ( i386) => i386. get_magic_start_buffer_ptr_size_val ( ) ,
597642 Architecture :: Riscv ( riscv) => riscv. get_magic_start_buffer_ptr_size_val ( ) ,
643+ Architecture :: Arm ( arm) => arm. get_magic_start_buffer_ptr_size_val ( ) ,
644+ Architecture :: Aarch64 ( aarch64) => aarch64. get_magic_start_buffer_ptr_size_val ( ) ,
598645 }
599646 }
600647
@@ -603,6 +650,8 @@ impl ArchitectureOperations for Architecture {
603650 Architecture :: X86_64 ( x86_64) => x86_64. get_magic_start_buffer_ptr_size_ptr ( ) ,
604651 Architecture :: I386 ( i386) => i386. get_magic_start_buffer_ptr_size_ptr ( ) ,
605652 Architecture :: Riscv ( riscv) => riscv. get_magic_start_buffer_ptr_size_ptr ( ) ,
653+ Architecture :: Arm ( arm) => arm. get_magic_start_buffer_ptr_size_ptr_val ( ) ,
654+ Architecture :: Aarch64 ( aarch64) => aarch64. get_magic_start_buffer_ptr_size_ptr_val ( ) ,
606655 }
607656 }
608657
@@ -611,6 +660,8 @@ impl ArchitectureOperations for Architecture {
611660 Architecture :: X86_64 ( x86_64) => x86_64. get_manual_start_info ( info) ,
612661 Architecture :: I386 ( i386) => i386. get_manual_start_info ( info) ,
613662 Architecture :: Riscv ( riscv) => riscv. get_manual_start_info ( info) ,
663+ Architecture :: Arm ( arm) => arm. get_manual_start_info ( info) ,
664+ Architecture :: Aarch64 ( aarch64) => aarch64. get_manual_start_info ( info) ,
614665 }
615666 }
616667
@@ -619,6 +670,8 @@ impl ArchitectureOperations for Architecture {
619670 Architecture :: X86_64 ( x86_64) => x86_64. write_start ( testcase, info) ,
620671 Architecture :: I386 ( i386) => i386. write_start ( testcase, info) ,
621672 Architecture :: Riscv ( riscv) => riscv. write_start ( testcase, info) ,
673+ Architecture :: Arm ( arm) => arm. write_start ( testcase, info) ,
674+ Architecture :: Aarch64 ( aarch64) => aarch64. write_start ( testcase, info) ,
622675 }
623676 }
624677
@@ -627,6 +680,8 @@ impl ArchitectureOperations for Architecture {
627680 Architecture :: X86_64 ( x86_64) => x86_64. trace_pc ( instruction_query) ,
628681 Architecture :: I386 ( i386) => i386. trace_pc ( instruction_query) ,
629682 Architecture :: Riscv ( riscv) => riscv. trace_pc ( instruction_query) ,
683+ Architecture :: Arm ( arm) => arm. trace_pc ( instruction_query) ,
684+ Architecture :: Aarch64 ( aarch64) => aarch64. trace_pc ( instruction_query) ,
630685 }
631686 }
632687
@@ -635,6 +690,8 @@ impl ArchitectureOperations for Architecture {
635690 Architecture :: X86_64 ( x86_64) => x86_64. trace_cmp ( instruction_query) ,
636691 Architecture :: I386 ( i386) => i386. trace_cmp ( instruction_query) ,
637692 Architecture :: Riscv ( riscv) => riscv. trace_cmp ( instruction_query) ,
693+ Architecture :: Arm ( arm) => arm. trace_cmp ( instruction_query) ,
694+ Architecture :: Aarch64 ( aarch64) => aarch64. trace_cmp ( instruction_query) ,
638695 }
639696 }
640697}
0 commit comments