summaryrefslogblamecommitdiffstats
path: root/tools/gdb/python/sparc.py
blob: 41b6fecf93c1e54a20f3971608c5d47576fbd812 (plain) (tree)
1
2
3
4
5
6
7
8
9
10





                                          
 
 

                         
 

                             
 



                            
 
 

                                
 

                                      
 

                                        
 

                                            
 

                                            
 


                                          
 

                                         
 

                                        
 

                                         
 

                                         
 

                                         
 



















                                                                               
 
                            


































                                                 
 




























                                        
                            
#
# RTEMS gdb extensions
# sparc archetecture specific abstractions

from helper import test_bit



class register:
    '''SPARC Registers'''

    class psr:
        '''status register'''

        sv_table = {
            0 : 'user',
            1 : 'superviser'
        }


        def __init__(self, psr):
            self.psr = psr

        def current_window(self):
            return int(self.psr & 0xf)

        def traps(self):
            return test_bit(self.psr, 5)

        def prev_superviser(self):
            return int(test_bit(self.psr,6))

        def superviser(self):
            return int(test_bit(self.psr,7))

        def interrupt_level(self):
            # bits 8 to 11
            return (self.spr & 0x780) >> 7

        def floating_point_status(self):
            return test_bit(self.psr, 12)

        def coproc_status(self):
            return test_bit(self.psr,13)

        def carry(self):
            return test_bit(self.psr, 20)

        def overflow(self):
            return test_bit(self.psr, 21)

        def zero(self):
            return test_bit(self.psr, 22)

        def icc(self):
            n = test_bit(self.psr,23)
            z = test_bit(self.psr,22)
            v = test_bit(self.psr,21)
            c = test_bit(self.psr,20)
            return (n,z,v,c)

        def to_string(self):
            val = "     Status Register"
            val += "\n         R Window : " + str(self.current_window())
            val += "\n    Traps Enabled : " + str(self.traps())
            val += "\n   Flaoting Point : " + str(self.floating_point_status())
            val += "\n      Coprocessor : " + str(self.coproc_status())
            val += "\n   Processor Mode : " + self.sv_table[self.superviser()]
            val += "\n       Prev. Mode : " + self.sv_table[self.superviser()]
            val += "\n            Carry : " + str(int(self.carry()))
            val += "\n         Overflow : " + str(int(self.overflow()))
            val += "\n             Zero : " + str(int(self.zero()))

            return val

    def __init__(self, reg):
        self.reg = reg

    def global_regs(self):
        val = [self.reg['g0_g1']]

        for i in range(2,7):
            val.append(int(self.reg['g'+str(i)]))
        return val

    def local_regs(self):
        val = []

        for i in range(0,8):
            val.append(self.reg['l'+str(i)])
        return val

    def in_regs(self):
        val = []

        for i in range(0,8):
            if i==6:
                val.append(self.reg['i6_fp'])
            else:
                val.append(self.reg['i'+str(i)])
        return val

    def out_regs(self):
        val = []

        for i in range(0,8):
            if i==6:
                val.append(self.reg['o6_sp'])
            else:
                val.append(self.reg['o'+str(i)])
        return val

    def status(self):
        return self.psr(self.reg['psr'])

    def show(self):
        print '         Global Regs:',
        print ' [',
        for i in self.global_regs():
            print str(i)+',',
        print '\b\b ]'

        print '          Local Regs:',
        print ' [',
        for i in self.local_regs():
            print str(i)+',',
        print '\b\b ]'

        print '             In Regs:',
        print ' [',
        for i in self.in_regs():
            print str(i)+',',
        print '\b\b ]'

        print '            Out Regs:',
        print ' [',
        for i in self.out_regs():
            print str(i)+',',
        print '\b\b ]'

        sr = self.status()
        print sr.to_string()