~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/scripts/gdb/linux/utils.py

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /scripts/gdb/linux/utils.py (Version linux-6.12-rc7) and /scripts/gdb/linux/utils.py (Version linux-4.20.17)


  1 #                                                   1 #
  2 # gdb helper commands and functions for Linux       2 # gdb helper commands and functions for Linux kernel debugging
  3 #                                                   3 #
  4 #  common utilities                                 4 #  common utilities
  5 #                                                   5 #
  6 # Copyright (c) Siemens AG, 2011-2013               6 # Copyright (c) Siemens AG, 2011-2013
  7 #                                                   7 #
  8 # Authors:                                          8 # Authors:
  9 #  Jan Kiszka <jan.kiszka@siemens.com>               9 #  Jan Kiszka <jan.kiszka@siemens.com>
 10 #                                                  10 #
 11 # This work is licensed under the terms of the     11 # This work is licensed under the terms of the GNU GPL version 2.
 12 #                                                  12 #
 13                                                    13 
 14 import gdb                                         14 import gdb
 15                                                    15 
 16                                                    16 
 17 class CachedType:                                  17 class CachedType:
 18     def __init__(self, name):                      18     def __init__(self, name):
 19         self._type = None                          19         self._type = None
 20         self._name = name                          20         self._name = name
 21                                                    21 
 22     def _new_objfile_handler(self, event):         22     def _new_objfile_handler(self, event):
 23         self._type = None                          23         self._type = None
 24         gdb.events.new_objfile.disconnect(self     24         gdb.events.new_objfile.disconnect(self._new_objfile_handler)
 25                                                    25 
 26     def get_type(self):                            26     def get_type(self):
 27         if self._type is None:                     27         if self._type is None:
 28             self._type = gdb.lookup_type(self.     28             self._type = gdb.lookup_type(self._name)
 29             if self._type is None:                 29             if self._type is None:
 30                 raise gdb.GdbError(                30                 raise gdb.GdbError(
 31                     "cannot resolve type '{0}'     31                     "cannot resolve type '{0}'".format(self._name))
 32             if hasattr(gdb, 'events') and hasa     32             if hasattr(gdb, 'events') and hasattr(gdb.events, 'new_objfile'):
 33                 gdb.events.new_objfile.connect     33                 gdb.events.new_objfile.connect(self._new_objfile_handler)
 34         return self._type                          34         return self._type
 35                                                    35 
 36                                                    36 
 37 long_type = CachedType("long")                     37 long_type = CachedType("long")
 38 ulong_type = CachedType("unsigned long")       !!  38 
 39 uint_type = CachedType("unsigned int")         << 
 40 atomic_long_type = CachedType("atomic_long_t") << 
 41 size_t_type = CachedType("size_t")             << 
 42 struct_page_type = CachedType("struct page")   << 
 43                                                << 
 44 def get_uint_type():                           << 
 45     global uint_type                           << 
 46     return uint_type.get_type()                << 
 47                                                << 
 48 def get_page_type():                           << 
 49     global struct_page_type                    << 
 50     return struct_page_type.get_type()         << 
 51                                                    39 
 52 def get_long_type():                               40 def get_long_type():
 53     global long_type                               41     global long_type
 54     return long_type.get_type()                    42     return long_type.get_type()
 55                                                    43 
 56 def get_ulong_type():                          << 
 57     global ulong_type                          << 
 58     return ulong_type.get_type()               << 
 59                                                << 
 60 def get_size_t_type():                         << 
 61     global size_t_type                         << 
 62     return size_t_type.get_type()              << 
 63                                                    44 
 64 def offset_of(typeobj, field):                     45 def offset_of(typeobj, field):
 65     element = gdb.Value(0).cast(typeobj)           46     element = gdb.Value(0).cast(typeobj)
 66     return int(str(element[field].address).spl     47     return int(str(element[field].address).split()[0], 16)
 67                                                    48 
 68                                                    49 
 69 def container_of(ptr, typeobj, member):            50 def container_of(ptr, typeobj, member):
 70     return (ptr.cast(get_long_type()) -            51     return (ptr.cast(get_long_type()) -
 71             offset_of(typeobj, member)).cast(t     52             offset_of(typeobj, member)).cast(typeobj)
 72                                                    53 
 73                                                    54 
 74 class ContainerOf(gdb.Function):                   55 class ContainerOf(gdb.Function):
 75     """Return pointer to containing data struc     56     """Return pointer to containing data structure.
 76                                                    57 
 77 $container_of(PTR, "TYPE", "ELEMENT"): Given P     58 $container_of(PTR, "TYPE", "ELEMENT"): Given PTR, return a pointer to the
 78 data structure of the type TYPE in which PTR i     59 data structure of the type TYPE in which PTR is the address of ELEMENT.
 79 Note that TYPE and ELEMENT have to be quoted a     60 Note that TYPE and ELEMENT have to be quoted as strings."""
 80                                                    61 
 81     def __init__(self):                            62     def __init__(self):
 82         super(ContainerOf, self).__init__("con     63         super(ContainerOf, self).__init__("container_of")
 83                                                    64 
 84     def invoke(self, ptr, typename, elementnam     65     def invoke(self, ptr, typename, elementname):
 85         return container_of(ptr, gdb.lookup_ty     66         return container_of(ptr, gdb.lookup_type(typename.string()).pointer(),
 86                             elementname.string     67                             elementname.string())
 87                                                    68 
 88                                                << 
 89 ContainerOf()                                      69 ContainerOf()
 90                                                    70 
 91                                                    71 
 92 BIG_ENDIAN = 0                                     72 BIG_ENDIAN = 0
 93 LITTLE_ENDIAN = 1                                  73 LITTLE_ENDIAN = 1
 94 target_endianness = None                           74 target_endianness = None
 95                                                    75 
 96                                                    76 
 97 def get_target_endianness():                       77 def get_target_endianness():
 98     global target_endianness                       78     global target_endianness
 99     if target_endianness is None:                  79     if target_endianness is None:
100         endian = gdb.execute("show endian", to     80         endian = gdb.execute("show endian", to_string=True)
101         if "little endian" in endian:              81         if "little endian" in endian:
102             target_endianness = LITTLE_ENDIAN      82             target_endianness = LITTLE_ENDIAN
103         elif "big endian" in endian:               83         elif "big endian" in endian:
104             target_endianness = BIG_ENDIAN         84             target_endianness = BIG_ENDIAN
105         else:                                      85         else:
106             raise gdb.GdbError("unknown endian     86             raise gdb.GdbError("unknown endianness '{0}'".format(str(endian)))
107     return target_endianness                       87     return target_endianness
108                                                    88 
109                                                    89 
110 def read_memoryview(inf, start, length):           90 def read_memoryview(inf, start, length):
111     m = inf.read_memory(start, length)         !!  91     return memoryview(inf.read_memory(start, length))
112     if type(m) is memoryview:                  << 
113         return m                               << 
114     return memoryview(m)                       << 
115                                                    92 
116                                                    93 
117 def read_u16(buffer, offset):                  !!  94 def read_u16(buffer):
118     buffer_val = buffer[offset:offset + 2]     << 
119     value = [0, 0]                                 95     value = [0, 0]
120                                                    96 
121     if type(buffer_val[0]) is str:             !!  97     if type(buffer[0]) is str:
122         value[0] = ord(buffer_val[0])          !!  98         value[0] = ord(buffer[0])
123         value[1] = ord(buffer_val[1])          !!  99         value[1] = ord(buffer[1])
124     else:                                         100     else:
125         value[0] = buffer_val[0]               !! 101         value[0] = buffer[0]
126         value[1] = buffer_val[1]               !! 102         value[1] = buffer[1]
127                                                   103 
128     if get_target_endianness() == LITTLE_ENDIA    104     if get_target_endianness() == LITTLE_ENDIAN:
129         return value[0] + (value[1] << 8)         105         return value[0] + (value[1] << 8)
130     else:                                         106     else:
131         return value[1] + (value[0] << 8)         107         return value[1] + (value[0] << 8)
132                                                   108 
133                                                   109 
134 def read_u32(buffer, offset):                  !! 110 def read_u32(buffer):
135     if get_target_endianness() == LITTLE_ENDIA    111     if get_target_endianness() == LITTLE_ENDIAN:
136         return read_u16(buffer, offset) + (rea !! 112         return read_u16(buffer[0:2]) + (read_u16(buffer[2:4]) << 16)
137     else:                                         113     else:
138         return read_u16(buffer, offset + 2) +  !! 114         return read_u16(buffer[2:4]) + (read_u16(buffer[0:2]) << 16)
139                                                   115 
140                                                   116 
141 def read_u64(buffer, offset):                  !! 117 def read_u64(buffer):
142     if get_target_endianness() == LITTLE_ENDIA    118     if get_target_endianness() == LITTLE_ENDIAN:
143         return read_u32(buffer, offset) + (rea !! 119         return read_u32(buffer[0:4]) + (read_u32(buffer[4:8]) << 32)
144     else:                                      << 
145         return read_u32(buffer, offset + 4) +  << 
146                                                << 
147                                                << 
148 def read_ulong(buffer, offset):                << 
149     if get_long_type().sizeof == 8:            << 
150         return read_u64(buffer, offset)        << 
151     else:                                         120     else:
152         return read_u32(buffer, offset)        !! 121         return read_u32(buffer[4:8]) + (read_u32(buffer[0:4]) << 32)
153                                                   122 
154 atomic_long_counter_offset = atomic_long_type. << 
155 atomic_long_counter_sizeof = atomic_long_type. << 
156                                                << 
157 def read_atomic_long(buffer, offset):          << 
158     global atomic_long_counter_offset          << 
159     global atomic_long_counter_sizeof          << 
160                                                << 
161     if atomic_long_counter_sizeof == 8:        << 
162         return read_u64(buffer, offset + atomi << 
163     else:                                      << 
164         return read_u32(buffer, offset + atomi << 
165                                                   123 
166 target_arch = None                                124 target_arch = None
167                                                   125 
168                                                   126 
169 def is_target_arch(arch):                         127 def is_target_arch(arch):
170     if hasattr(gdb.Frame, 'architecture'):        128     if hasattr(gdb.Frame, 'architecture'):
171         return arch in gdb.newest_frame().arch    129         return arch in gdb.newest_frame().architecture().name()
172     else:                                         130     else:
173         global target_arch                        131         global target_arch
174         if target_arch is None:                   132         if target_arch is None:
175             target_arch = gdb.execute("show ar    133             target_arch = gdb.execute("show architecture", to_string=True)
176         return arch in target_arch                134         return arch in target_arch
177                                                   135 
178                                                   136 
179 GDBSERVER_QEMU = 0                                137 GDBSERVER_QEMU = 0
180 GDBSERVER_KGDB = 1                                138 GDBSERVER_KGDB = 1
181 gdbserver_type = None                             139 gdbserver_type = None
182                                                   140 
183                                                   141 
184 def get_gdbserver_type():                         142 def get_gdbserver_type():
185     def exit_handler(event):                      143     def exit_handler(event):
186         global gdbserver_type                     144         global gdbserver_type
187         gdbserver_type = None                     145         gdbserver_type = None
188         gdb.events.exited.disconnect(exit_hand    146         gdb.events.exited.disconnect(exit_handler)
189                                                   147 
190     def probe_qemu():                             148     def probe_qemu():
191         try:                                      149         try:
192             return gdb.execute("monitor info v    150             return gdb.execute("monitor info version", to_string=True) != ""
193         except gdb.error:                      !! 151         except:
194             return False                          152             return False
195                                                   153 
196     def probe_kgdb():                             154     def probe_kgdb():
197         try:                                      155         try:
198             thread_info = gdb.execute("info th    156             thread_info = gdb.execute("info thread 2", to_string=True)
199             return "shadowCPU" in thread_info  !! 157             return "shadowCPU0" in thread_info
200         except gdb.error:                      !! 158         except:
201             return False                          159             return False
202                                                   160 
203     global gdbserver_type                         161     global gdbserver_type
204     if gdbserver_type is None:                    162     if gdbserver_type is None:
205         if probe_qemu():                          163         if probe_qemu():
206             gdbserver_type = GDBSERVER_QEMU       164             gdbserver_type = GDBSERVER_QEMU
207         elif probe_kgdb():                        165         elif probe_kgdb():
208             gdbserver_type = GDBSERVER_KGDB       166             gdbserver_type = GDBSERVER_KGDB
209         if gdbserver_type is not None and hasa    167         if gdbserver_type is not None and hasattr(gdb, 'events'):
210             gdb.events.exited.connect(exit_han    168             gdb.events.exited.connect(exit_handler)
211     return gdbserver_type                         169     return gdbserver_type
212                                                   170 
213                                                   171 
214 def gdb_eval_or_none(expresssion):                172 def gdb_eval_or_none(expresssion):
215     try:                                          173     try:
216         return gdb.parse_and_eval(expresssion)    174         return gdb.parse_and_eval(expresssion)
217     except gdb.error:                          !! 175     except:
218         return None                               176         return None
                                                   >> 177 
                                                   >> 178 
                                                   >> 179 def dentry_name(d):
                                                   >> 180     parent = d['d_parent']
                                                   >> 181     if parent == d or parent == 0:
                                                   >> 182         return ""
                                                   >> 183     p = dentry_name(d['d_parent']) + "/"
                                                   >> 184     return p + d['d_iname'].string()
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php