~ [ 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-5.13.19)


  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                                                    69 
 89 ContainerOf()                                      70 ContainerOf()
 90                                                    71 
 91                                                    72 
 92 BIG_ENDIAN = 0                                     73 BIG_ENDIAN = 0
 93 LITTLE_ENDIAN = 1                                  74 LITTLE_ENDIAN = 1
 94 target_endianness = None                           75 target_endianness = None
 95                                                    76 
 96                                                    77 
 97 def get_target_endianness():                       78 def get_target_endianness():
 98     global target_endianness                       79     global target_endianness
 99     if target_endianness is None:                  80     if target_endianness is None:
100         endian = gdb.execute("show endian", to     81         endian = gdb.execute("show endian", to_string=True)
101         if "little endian" in endian:              82         if "little endian" in endian:
102             target_endianness = LITTLE_ENDIAN      83             target_endianness = LITTLE_ENDIAN
103         elif "big endian" in endian:               84         elif "big endian" in endian:
104             target_endianness = BIG_ENDIAN         85             target_endianness = BIG_ENDIAN
105         else:                                      86         else:
106             raise gdb.GdbError("unknown endian     87             raise gdb.GdbError("unknown endianness '{0}'".format(str(endian)))
107     return target_endianness                       88     return target_endianness
108                                                    89 
109                                                    90 
110 def read_memoryview(inf, start, length):           91 def read_memoryview(inf, start, length):
111     m = inf.read_memory(start, length)         !!  92     return memoryview(inf.read_memory(start, length))
112     if type(m) is memoryview:                  << 
113         return m                               << 
114     return memoryview(m)                       << 
115                                                    93 
116                                                    94 
117 def read_u16(buffer, offset):                      95 def read_u16(buffer, offset):
118     buffer_val = buffer[offset:offset + 2]         96     buffer_val = buffer[offset:offset + 2]
119     value = [0, 0]                                 97     value = [0, 0]
120                                                    98 
121     if type(buffer_val[0]) is str:                 99     if type(buffer_val[0]) is str:
122         value[0] = ord(buffer_val[0])             100         value[0] = ord(buffer_val[0])
123         value[1] = ord(buffer_val[1])             101         value[1] = ord(buffer_val[1])
124     else:                                         102     else:
125         value[0] = buffer_val[0]                  103         value[0] = buffer_val[0]
126         value[1] = buffer_val[1]                  104         value[1] = buffer_val[1]
127                                                   105 
128     if get_target_endianness() == LITTLE_ENDIA    106     if get_target_endianness() == LITTLE_ENDIAN:
129         return value[0] + (value[1] << 8)         107         return value[0] + (value[1] << 8)
130     else:                                         108     else:
131         return value[1] + (value[0] << 8)         109         return value[1] + (value[0] << 8)
132                                                   110 
133                                                   111 
134 def read_u32(buffer, offset):                     112 def read_u32(buffer, offset):
135     if get_target_endianness() == LITTLE_ENDIA    113     if get_target_endianness() == LITTLE_ENDIAN:
136         return read_u16(buffer, offset) + (rea    114         return read_u16(buffer, offset) + (read_u16(buffer, offset + 2) << 16)
137     else:                                         115     else:
138         return read_u16(buffer, offset + 2) +     116         return read_u16(buffer, offset + 2) + (read_u16(buffer, offset) << 16)
139                                                   117 
140                                                   118 
141 def read_u64(buffer, offset):                     119 def read_u64(buffer, offset):
142     if get_target_endianness() == LITTLE_ENDIA    120     if get_target_endianness() == LITTLE_ENDIAN:
143         return read_u32(buffer, offset) + (rea    121         return read_u32(buffer, offset) + (read_u32(buffer, offset + 4) << 32)
144     else:                                         122     else:
145         return read_u32(buffer, offset + 4) +     123         return read_u32(buffer, offset + 4) + (read_u32(buffer, offset) << 32)
146                                                   124 
147                                                   125 
148 def read_ulong(buffer, offset):                   126 def read_ulong(buffer, offset):
149     if get_long_type().sizeof == 8:               127     if get_long_type().sizeof == 8:
150         return read_u64(buffer, offset)           128         return read_u64(buffer, offset)
151     else:                                         129     else:
152         return read_u32(buffer, offset)           130         return read_u32(buffer, offset)
153                                                   131 
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                                                   132 
166 target_arch = None                                133 target_arch = None
167                                                   134 
168                                                   135 
169 def is_target_arch(arch):                         136 def is_target_arch(arch):
170     if hasattr(gdb.Frame, 'architecture'):        137     if hasattr(gdb.Frame, 'architecture'):
171         return arch in gdb.newest_frame().arch    138         return arch in gdb.newest_frame().architecture().name()
172     else:                                         139     else:
173         global target_arch                        140         global target_arch
174         if target_arch is None:                   141         if target_arch is None:
175             target_arch = gdb.execute("show ar    142             target_arch = gdb.execute("show architecture", to_string=True)
176         return arch in target_arch                143         return arch in target_arch
177                                                   144 
178                                                   145 
179 GDBSERVER_QEMU = 0                                146 GDBSERVER_QEMU = 0
180 GDBSERVER_KGDB = 1                                147 GDBSERVER_KGDB = 1
181 gdbserver_type = None                             148 gdbserver_type = None
182                                                   149 
183                                                   150 
184 def get_gdbserver_type():                         151 def get_gdbserver_type():
185     def exit_handler(event):                      152     def exit_handler(event):
186         global gdbserver_type                     153         global gdbserver_type
187         gdbserver_type = None                     154         gdbserver_type = None
188         gdb.events.exited.disconnect(exit_hand    155         gdb.events.exited.disconnect(exit_handler)
189                                                   156 
190     def probe_qemu():                             157     def probe_qemu():
191         try:                                      158         try:
192             return gdb.execute("monitor info v    159             return gdb.execute("monitor info version", to_string=True) != ""
193         except gdb.error:                         160         except gdb.error:
194             return False                          161             return False
195                                                   162 
196     def probe_kgdb():                             163     def probe_kgdb():
197         try:                                      164         try:
198             thread_info = gdb.execute("info th    165             thread_info = gdb.execute("info thread 2", to_string=True)
199             return "shadowCPU" in thread_info  !! 166             return "shadowCPU0" in thread_info
200         except gdb.error:                         167         except gdb.error:
201             return False                          168             return False
202                                                   169 
203     global gdbserver_type                         170     global gdbserver_type
204     if gdbserver_type is None:                    171     if gdbserver_type is None:
205         if probe_qemu():                          172         if probe_qemu():
206             gdbserver_type = GDBSERVER_QEMU       173             gdbserver_type = GDBSERVER_QEMU
207         elif probe_kgdb():                        174         elif probe_kgdb():
208             gdbserver_type = GDBSERVER_KGDB       175             gdbserver_type = GDBSERVER_KGDB
209         if gdbserver_type is not None and hasa    176         if gdbserver_type is not None and hasattr(gdb, 'events'):
210             gdb.events.exited.connect(exit_han    177             gdb.events.exited.connect(exit_handler)
211     return gdbserver_type                         178     return gdbserver_type
212                                                   179 
213                                                   180 
214 def gdb_eval_or_none(expresssion):                181 def gdb_eval_or_none(expresssion):
215     try:                                          182     try:
216         return gdb.parse_and_eval(expresssion)    183         return gdb.parse_and_eval(expresssion)
217     except gdb.error:                             184     except gdb.error:
218         return None                               185         return None
                                                   >> 186 
                                                   >> 187 
                                                   >> 188 def dentry_name(d):
                                                   >> 189     parent = d['d_parent']
                                                   >> 190     if parent == d or parent == 0:
                                                   >> 191         return ""
                                                   >> 192     p = dentry_name(d['d_parent']) + "/"
                                                   >> 193     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