Hi Damjan,
I tried to rewrite the function reading CPU info from /proc/cpuinfo, using VPP
style functions, for multi-arch dynamic function selection.
But function unformat_check_input failed and crashed.
I pasted the /proc/cpuinfo reading function and gdb process as below.
Could you suggest on this issue?
static inline int
clib_cpu_supports_implements (const u32 implid, const u32 partid)
{
u32 implementer = -1, part = -1;
int fd;
unformat_input_t input;
fd = open ("/proc/cpuinfo", 0);
if (fd < 0)
return 0;
unformat_init_clib_file (&input, fd);
while (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (&input, "CPU implementer : %x", &implementer))
;
else if (unformat (&input, "CPU part : %x", &part))
;
else
unformat_skip_line (&input);
if ((-1 != implementer) && (-1 != part))
break;
}
unformat_free (&input);
close (fd);
printf("++++++++++ %x %x\n", implementer, part);
if ((implid == implementer) && (partid == part))
return 1;
else
return 0;
}
lijian@net-arm-thunderx2:~/tasks/vpp.upstream/vpp$ sudo gdb
./build-root/build-vpp_debug-native/vpp/bin/vpp -c /home/lijian/startup.conf
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "aarch64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./build-root/build-vpp_debug-native/vpp/bin/vpp...done.
"/home/lijian/startup.conf" is not a core dump: File format not recognized
(gdb) b clib_cpu_supports_implements
Function "clib_cpu_supports_implements" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (clib_cpu_supports_implements) pending.
(gdb) run -c /home/lijian/startup.conf
Starting program:
/home/lijian/tasks/vpp.upstream/vpp/build-root/build-vpp_debug-native/vpp/bin/vpp
-c /home/lijian/startup.conf
warning: Unable to determine the number of hardware watchpoints available.
warning: Unable to determine the number of hardware breakpoints available.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".
Breakpoint 1, clib_cpu_supports_implements (implid=81, partid=3072) at
/home/lijian/tasks/vpp.upstream/vpp/src/vppinfra/cpu.h:28
28 {
(gdb) bt
#0 clib_cpu_supports_implements (implid=81, partid=3072) at
/home/lijian/tasks/vpp.upstream/vpp/src/vppinfra/cpu.h:28
#1 0x0000ffffbeac4294 in clib_cpu_march_priority_qdf24xx () at
/home/lijian/tasks/vpp.upstream/vpp/src/vppinfra/cpu.h:248
#2 0x0000ffffbeac5c04 in svm_fifo_enqueue_nowait_march_constructor_qdf24xx ()
at /home/lijian/tasks/vpp.upstream/vpp/src/svm/svm_fifo.c:457
#3 0x0000ffffbf6dfb60 in call_init (l=<optimized out>, argc=argc@entry=3,
argv=argv@entry=0xfffffffff5f8, env=env@entry=0xfffffffff618) at dl-init.c:72
#4 0x0000ffffbf6dfca8 in call_init (env=0xfffffffff618, argv=0xfffffffff5f8,
argc=3, l=<optimized out>) at dl-init.c:30
#5 _dl_init (main_map=0xffffbf700190, argc=3, argv=0xfffffffff5f8,
env=0xfffffffff618) at dl-init.c:120
#6 0x0000ffffbf6d2d44 in _dl_start_user () from /lib/ld-linux-aarch64.so.1
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) n
29 u32 implementer = -1, part = -1;
(gdb)
33 fd = open ("/proc/cpuinfo", 0);
(gdb)
34 if (fd < 0)
(gdb)
37 unformat_init_clib_file (&input, fd);
(gdb)
39 while (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT)
(gdb) p input
$1 = {buffer = 0x0, index = 0, buffer_marks = 0x0, fill_buffer = 0xffffbea41188
<clib_file_fill_buffer>, fill_buffer_arg = 0x3}
(gdb) s
unformat_check_input (i=0xfffffffff4f0) at
/home/lijian/tasks/vpp.upstream/vpp/src/vppinfra/format.h:171
171 {
(gdb) n
175 if (i->index >= vec_len (i->buffer) && i->index !=
UNFORMAT_END_OF_INPUT)
(gdb)
179 _unformat_fill_input (i);
(gdb) s
_unformat_fill_input (i=0xfffffffff4f0) at
/home/lijian/tasks/vpp.upstream/vpp/src/vppinfra/unformat.c:43
43 {
(gdb) n
46 if (i->index == UNFORMAT_END_OF_INPUT)
(gdb)
49 first_mark = l = vec_len (i->buffer);
(gdb)
50 if (vec_len (i->buffer_marks) > 0)
(gdb)
54 if (first_mark > 0)
(gdb)
57 i->index = vec_len (i->buffer);
(gdb)
58 for (l = 0; l < vec_len (i->buffer_marks); l++)
(gdb)
62 if (i->fill_buffer)
(gdb)
63 i->index = i->fill_buffer (i);
(gdb) s
clib_file_fill_buffer (input=0xfffffffff4f0) at
/home/lijian/tasks/vpp.upstream/vpp/src/vppinfra/unformat.c:1041
1041 {
(gdb) n
1042 int fd = pointer_to_uword (input->fill_buffer_arg);
(gdb)
1045 l = vec_len (input->buffer);
(gdb)
1046 vec_resize (input->buffer, 4096);
(gdb) p input->buffer
$2 = (u8 *) 0x0
(gdb) s
_vec_resize_inline (v=0x0, length_increment=4096, data_bytes=4096,
header_bytes=0, data_align=1) at
/home/lijian/tasks/vpp.upstream/vpp/src/vppinfra/vec.h:121
121 {
(gdb) n
122 vec_header_t *vh = _vec_find (v);
(gdb)
125 aligned_header_bytes = vec_header_bytes (header_bytes);
(gdb)
127 new_data_bytes = data_bytes + aligned_header_bytes;
(gdb) p aligned_header_bytes
$3 = 8
(gdb) n
129 if (PREDICT_TRUE (v != 0))
(gdb)
147 clib_max (sizeof (vec_header_t),
(gdb)
145 return vec_resize_allocate_memory (v, length_increment, data_bytes,
(gdb) s
vec_resize_allocate_memory (v=0x0, length_increment=4096, data_bytes=4096,
header_bytes=0, data_align=8) at
/home/lijian/tasks/vpp.upstream/vpp/src/vppinfra/vec.c:48
48 {
(gdb) n
49 vec_header_t *vh = _vec_find (v);
(gdb)
53 header_bytes = vec_header_bytes (header_bytes);
(gdb)
55 data_bytes += header_bytes;
(gdb)
57 if (!v)
(gdb)
59 new = clib_mem_alloc_aligned_at_offset (data_bytes, data_align,
header_bytes, 1 /* yes, call os_out_of_memory */
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x0000ffffbea52f24 in ok_magic (m=0x0) at
/home/lijian/tasks/vpp.upstream/vpp/src/vppinfra/dlmalloc.c:1618
1618 return (m->magic == mparams.magic);
(gdb)
Thanks.
IMPORTANT NOTICE: The contents of this email and any attachments are
confidential and may also be privileged. If you are not the intended recipient,
please notify the sender immediately and do not disclose the contents to any
other person, use it for any purpose, or store or copy the information in any
medium. Thank you.
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#10667): https://lists.fd.io/g/vpp-dev/message/10667
Mute This Topic: https://lists.fd.io/mt/26229023/21656
Group Owner: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-