@@ -676,3 +676,103 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
676
676
#endif
677
677
return & user_parisc_native_view ;
678
678
}
679
+
680
+
681
+ /* HAVE_REGS_AND_STACK_ACCESS_API feature */
682
+
683
+ struct pt_regs_offset {
684
+ const char * name ;
685
+ int offset ;
686
+ };
687
+
688
+ #define REG_OFFSET_NAME (r ) {.name = #r, .offset = offsetof(struct pt_regs, r)}
689
+ #define REG_OFFSET_INDEX (r ,i ) {.name = #r#i, .offset = offsetof(struct pt_regs, r[i])}
690
+ #define REG_OFFSET_END {.name = NULL, .offset = 0}
691
+
692
+ static const struct pt_regs_offset regoffset_table [] = {
693
+ REG_OFFSET_INDEX (gr ,0 ),
694
+ REG_OFFSET_INDEX (gr ,1 ),
695
+ REG_OFFSET_INDEX (gr ,2 ),
696
+ REG_OFFSET_INDEX (gr ,3 ),
697
+ REG_OFFSET_INDEX (gr ,4 ),
698
+ REG_OFFSET_INDEX (gr ,5 ),
699
+ REG_OFFSET_INDEX (gr ,6 ),
700
+ REG_OFFSET_INDEX (gr ,7 ),
701
+ REG_OFFSET_INDEX (gr ,8 ),
702
+ REG_OFFSET_INDEX (gr ,9 ),
703
+ REG_OFFSET_INDEX (gr ,10 ),
704
+ REG_OFFSET_INDEX (gr ,11 ),
705
+ REG_OFFSET_INDEX (gr ,12 ),
706
+ REG_OFFSET_INDEX (gr ,13 ),
707
+ REG_OFFSET_INDEX (gr ,14 ),
708
+ REG_OFFSET_INDEX (gr ,15 ),
709
+ REG_OFFSET_INDEX (gr ,16 ),
710
+ REG_OFFSET_INDEX (gr ,17 ),
711
+ REG_OFFSET_INDEX (gr ,18 ),
712
+ REG_OFFSET_INDEX (gr ,19 ),
713
+ REG_OFFSET_INDEX (gr ,20 ),
714
+ REG_OFFSET_INDEX (gr ,21 ),
715
+ REG_OFFSET_INDEX (gr ,22 ),
716
+ REG_OFFSET_INDEX (gr ,23 ),
717
+ REG_OFFSET_INDEX (gr ,24 ),
718
+ REG_OFFSET_INDEX (gr ,25 ),
719
+ REG_OFFSET_INDEX (gr ,26 ),
720
+ REG_OFFSET_INDEX (gr ,27 ),
721
+ REG_OFFSET_INDEX (gr ,28 ),
722
+ REG_OFFSET_INDEX (gr ,29 ),
723
+ REG_OFFSET_INDEX (gr ,30 ),
724
+ REG_OFFSET_INDEX (gr ,31 ),
725
+ REG_OFFSET_INDEX (sr ,0 ),
726
+ REG_OFFSET_INDEX (sr ,1 ),
727
+ REG_OFFSET_INDEX (sr ,2 ),
728
+ REG_OFFSET_INDEX (sr ,3 ),
729
+ REG_OFFSET_INDEX (sr ,4 ),
730
+ REG_OFFSET_INDEX (sr ,5 ),
731
+ REG_OFFSET_INDEX (sr ,6 ),
732
+ REG_OFFSET_INDEX (sr ,7 ),
733
+ REG_OFFSET_INDEX (iasq ,0 ),
734
+ REG_OFFSET_INDEX (iasq ,1 ),
735
+ REG_OFFSET_INDEX (iaoq ,0 ),
736
+ REG_OFFSET_INDEX (iaoq ,1 ),
737
+ REG_OFFSET_NAME (cr27 ),
738
+ REG_OFFSET_NAME (ksp ),
739
+ REG_OFFSET_NAME (kpc ),
740
+ REG_OFFSET_NAME (sar ),
741
+ REG_OFFSET_NAME (iir ),
742
+ REG_OFFSET_NAME (isr ),
743
+ REG_OFFSET_NAME (ior ),
744
+ REG_OFFSET_NAME (ipsw ),
745
+ REG_OFFSET_END ,
746
+ };
747
+
748
+ /**
749
+ * regs_query_register_offset() - query register offset from its name
750
+ * @name: the name of a register
751
+ *
752
+ * regs_query_register_offset() returns the offset of a register in struct
753
+ * pt_regs from its name. If the name is invalid, this returns -EINVAL;
754
+ */
755
+ int regs_query_register_offset (const char * name )
756
+ {
757
+ const struct pt_regs_offset * roff ;
758
+ for (roff = regoffset_table ; roff -> name != NULL ; roff ++ )
759
+ if (!strcmp (roff -> name , name ))
760
+ return roff -> offset ;
761
+ return - EINVAL ;
762
+ }
763
+
764
+ /**
765
+ * regs_query_register_name() - query register name from its offset
766
+ * @offset: the offset of a register in struct pt_regs.
767
+ *
768
+ * regs_query_register_name() returns the name of a register from its
769
+ * offset in struct pt_regs. If the @offset is invalid, this returns NULL;
770
+ */
771
+ const char * regs_query_register_name (unsigned int offset )
772
+ {
773
+ const struct pt_regs_offset * roff ;
774
+ for (roff = regoffset_table ; roff -> name != NULL ; roff ++ )
775
+ if (roff -> offset == offset )
776
+ return roff -> name ;
777
+ return NULL ;
778
+ }
0 commit comments