summary refs log tree commit diff stats
path: root/gitlab/issues_text/target_i386/host_x86/accel_TCG
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab/issues_text/target_i386/host_x86/accel_TCG')
-rw-r--r--gitlab/issues_text/target_i386/host_x86/accel_TCG/184625
-rw-r--r--gitlab/issues_text/target_i386/host_x86/accel_TCG/2159177
-rw-r--r--gitlab/issues_text/target_i386/host_x86/accel_TCG/241333
-rw-r--r--gitlab/issues_text/target_i386/host_x86/accel_TCG/2784217
4 files changed, 452 insertions, 0 deletions
diff --git a/gitlab/issues_text/target_i386/host_x86/accel_TCG/1846 b/gitlab/issues_text/target_i386/host_x86/accel_TCG/1846
new file mode 100644
index 000000000..7ef87d6c2
--- /dev/null
+++ b/gitlab/issues_text/target_i386/host_x86/accel_TCG/1846
@@ -0,0 +1,25 @@
+Regression in q35 avocado tests due to fix for misaligned IO access
+Description of problem:
+Generally I'm seeing intermittent hangs, somewhere after the clock initialisation.
+
+```
+[    4.137020] ALSA device list:                                                                                                                                             
+[    4.137861]   No soundcards found.                                                                                                                                        
+[    4.634128] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input3                                                                         
+[   24.085574] rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
+[   24.085712] rcu:     0-...!: (0 ticks this GP) idle=4d18/0/0x0 softirq=54/54 fqs=0 (false positive?)
+[   24.085712]  (detected by 1, t=21004 jiffies, g=-1003, q=2151 ncpus=2)
+[   24.085712] Sending NMI from CPU 1 to CPUs 0:                                                                                                                             
+[    4.647507] NMI backtrace for cpu 0                                                                                                                                       
+[    4.647507] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 6.0.11 #5                                                                                                           
+[    4.647507] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org 04/01/2014                                              
+[    4.647507] RIP: 0010:amd_e400_idle+0x39/0x40                                                                                                                             
+[    4.647507] Code: 00 e8 fb ab 0d 00 eb 07 0f 00 2d c2 7d 1d 01 fb f4 fa 31 ff e8 e8 ab 0d 00 fb c3 cc cc cc cc eb 07 0f 00 2d a9 7d 1d 01 fb f4 <c3> cc cc cc cc 66 90 bf 
+01 00 00 00 e8 a6 e4 06 00 65 48 8b 04 25
+```
+
+In avocado the hang generally times out and the test fails.
+Steps to reproduce:
+See above command line. It's racy.
+Additional information:
+
diff --git a/gitlab/issues_text/target_i386/host_x86/accel_TCG/2159 b/gitlab/issues_text/target_i386/host_x86/accel_TCG/2159
new file mode 100644
index 000000000..8bc3d3f05
--- /dev/null
+++ b/gitlab/issues_text/target_i386/host_x86/accel_TCG/2159
@@ -0,0 +1,177 @@
+qemu-system-x86_64 crashes in temp_load (tcg) on i686 host
+Description of problem:
+qemu crashes early
+Steps to reproduce:
+1. compile qemu git (commit commit 5d1fc614413b10dd94858b07a1b2e26b1aa0296c (origin/master, origin/HEAD)
+) with line
+../configure --prefix=/usr  --enable-virglrenderer --libdir=lib --audio-drv-list=alsa,oss --enable-opengl --extra-cflags="-I/usr/X11R7/include -O2 -march=i686 -mtune=native -m32 -Wno-maybe-uninitialized -Wno-nested-externs -Wno-implicit-function-declaration" --disable-werror        
+
+2. setarch i686 ninja (kernel is x86_64 on host)
+3. try to boot 64-bit x86 Salix/Slackel (Slackware live images)
+Additional information:
+```
+ gdb  x86_64-softmmu/qemu-system-x86_64
+GNU gdb (GDB) 11.2
+Copyright (C) 2022 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 "i586-slackware-linux".
+Type "show configuration" for configuration details.
+For bug reporting instructions, please see:
+<https://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 x86_64-softmmu/qemu-system-x86_64...
+warning: File "/dev/shm/qemu/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
+To enable execution of this file add
+        add-auto-load-safe-path /dev/shm/qemu/.gdbinit
+line to your configuration file "/root/.config/gdb/gdbinit".
+To completely disable this security protection add
+        set auto-load safe-path /
+line to your configuration file "/root/.config/gdb/gdbinit".
+For more information about this security protection see the
+--Type <RET> for more, q to quit, c to continue without paging--
+"Auto-loading safe path" section in the GDB manual.  E.g., run from the shell:
+        info "(gdb)Auto-loading safe path"
+(gdb) r  -m 1000 -cdrom /home/guest/ISO/sla
+slackellive64-openbox-7.7.1.iso  slackware-8.0-install-d1.iso
+(gdb) r  -m 1000 -cdrom /home/guest/ISO/slackellive64-openbox-7.7.1.iso
+Starting program: /dev/shm/qemu/build/x86_64-softmmu/qemu-system-x86_64 -m 1000 -cdrom /home/guest/ISO/slackellive64-openbox-7.7.1.iso
+[Thread debugging using libthread_db enabled]
+Using host libthread_db library "/lib/libthread_db.so.1".
+[New Thread 0xf3e79b00 (LWP 27354)]
+[New Thread 0xf2f09b00 (LWP 27355)]
+[New Thread 0xb1917b00 (LWP 27356)]
+[New Thread 0xaf60cb00 (LWP 27357)]
+[Thread 0xaf60cb00 (LWP 27357) exited]
+[New Thread 0xaf60cb00 (LWP 27358)]
+[New Thread 0xaec86b00 (LWP 27359)]
+[Thread 0xaf60cb00 (LWP 27358) exited]
+[Thread 0xaec86b00 (LWP 27359) exited]
+[New Thread 0xaec86b00 (LWP 27360)]
+[New Thread 0xaf60cb00 (LWP 27361)]
+[Thread 0xaec86b00 (LWP 27360) exited]
+[Thread 0xaf60cb00 (LWP 27361) exited]
+[Thread 0xf2f09b00 (LWP 27355) exited]
+
+Thread 4 "qemu-system-x86" received signal SIGSEGV, Segmentation fault.
+[Switching to Thread 0xb1917b00 (LWP 27356)]
+0x56d08a95 in temp_load (s=0xb1000610, ts=ts@entry=0xb1001f40, desired_regs=<optimized out>, allocated_regs=2097200, preferred_regs=0) at ../tcg/tcg.c:4441
+4441            tcg_out_ld(s, ts->type, reg, ts->mem_base->reg, ts->mem_offset);
+(gdb) bt full
+#0  0x56d08a95 in temp_load
+    (s=0xb1000610, ts=ts@entry=0xb1001f40, desired_regs=<optimized out>, allocated_regs=2097200, preferred_regs=0) at ../tcg/tcg.c:4441
+        reg = TCG_REG_ECX
+        __func__ = "temp_load"
+#1  0x56d0fe23 in tcg_reg_alloc_op (op=<optimized out>, s=<optimized out>)
+    at ../tcg/tcg.c:4881
+        i_required_regs = <optimized out>
+        copyto_new_reg = false
+        ts2 = <optimized out>
+        i1 = <optimized out>
+        i_preferred_regs = <optimized out>
+        allocate_new_reg = <optimized out>
+        i2 = <optimized out>
+        i = 0
+        new_args =
+          {1, 5, 2852, 0, 64, 0, 0, 1467284236, 4149882880, 2829350448, 1, 1456305553, 4149882880, 2969568784, 2969568920, 2969568944}
+        arg_life = <optimized out>
+        i_allocated_regs = <optimized out>
+        nb_oargs = <optimized out>
+        arg = <optimized out>
+        const_args =
+--Type <RET> for more, q to quit, c to continue without paging--
+          {0, 0, 0, 0, 1, 1, 1467284236, -1315870200, 1487331864, -1069806704, 0, 1467284236, 1456520351, 1489883472, 2, -1325347776}
+        k = <optimized out>
+        arg_ct = <optimized out>
+        o_allocated_regs = <optimized out>
+        nb_iargs = <optimized out>
+        reg = <optimized out>
+        ts = 0xb1001f40
+        op_cond = <optimized out>
+        opc = <optimized out>
+        i = <optimized out>
+        start_words = <optimized out>
+        num_insns = <optimized out>
+        op = <optimized out>
+        __PRETTY_FUNCTION__ = "tcg_gen_code"
+#2  tcg_gen_code
+    (s=<optimized out>, tb=<optimized out>, pc_start=<optimized out>)
+    at ../tcg/tcg.c:6216
+        opc = <optimized out>
+        i = <optimized out>
+        start_words = <optimized out>
+        num_insns = <optimized out>
+        op = <optimized out>
+--Type <RET> for more, q to quit, c to continue without paging--
+        __PRETTY_FUNCTION__ = "tcg_gen_code"
+#3  0x56af0118 in setjmp_gen_code
+    (env=env@entry=0x57afab90, tb=tb@entry=0xf0b7d580 <code_gen_buffer+8389982>, pc=18446744072243800976, host_pc=0xc03c0b90, max_insns=0xb1916acc, ti=<optimized out>) at ../accel/tcg/translate-all.c:284
+        ret = <optimized out>
+        __PRETTY_FUNCTION__ = "setjmp_gen_code"
+#4  0x56af06e2 in tb_gen_code
+    (cpu=0x57af8860, pc=18446744072243800976, cs_base=0, flags=4244144, cflags=<optimized out>) at ../accel/tcg/translate-all.c:359
+        env = 0x57afab90
+        tb = 0xf0b7d580 <code_gen_buffer+8389982>
+        existing_tb = <optimized out>
+        phys_pc = 245525392
+        phys_p2 = <optimized out>
+        gen_code_buf = 0xf0b7d600 <code_gen_buffer+8390110> "‹]ш…Ы\017Њр"
+        gen_code_size = <optimized out>
+        search_size = <optimized out>
+        max_insns = 64
+        host_pc = 0xc03c0b90
+        __PRETTY_FUNCTION__ = "tb_gen_code"
+        __func__ = "tb_gen_code"
+#5  0x56ae75bd in cpu_exec_loop
+--Type <RET> for more, q to quit, c to continue without paging--
+    (cpu=cpu@entry=0x57af8860, sc=sc@entry=0xb1916c24)
+    at ../accel/tcg/cpu-exec.c:982
+        jc = <optimized out>
+        h = <optimized out>
+        tb = 0x0
+        flags = <optimized out>
+        cflags = 4278321152
+        pc = <optimized out>
+        cs_base = <optimized out>
+        last_tb = <optimized out>
+        tb_exit = 0
+        ret = <optimized out>
+#6  0x56ae7a70 in cpu_exec_setjmp
+    (cpu=cpu@entry=0x57af8860, sc=sc@entry=0xb1916c24)
+    at ../accel/tcg/cpu-exec.c:1028
+#7  0x56ae83a8 in cpu_exec (cpu=<optimized out>)
+    at ../accel/tcg/cpu-exec.c:1054
+        ret = <optimized out>
+        sc = {diff_clk = 0, last_cpu_icount = 0, realtime_clock = 0}
+        _rcu_read_auto = 0x1
+#8  0x56b0ff5e in tcg_cpu_exec (cpu=0x57af8860)
+    at ../accel/tcg/tcg-accel-ops.c:76
+        ret = <optimized out>
+--Type <RET> for more, q to quit, c to continue without paging--
+        __PRETTY_FUNCTION__ = "tcg_cpu_exec"
+#9  0x56b10a47 in rr_cpu_thread_fn (arg=<optimized out>)
+    at ../accel/tcg/tcg-accel-ops-rr.c:261
+        r = <optimized out>
+        cpu_budget = <optimized out>
+        force_rcu =
+            {notify = 0x56b106e0 <rr_force_rcu>, node = {le_next = 0x0, le_prev = 0xb19179b0}}
+        cpu = 0x57af8860
+        __PRETTY_FUNCTION__ = "rr_cpu_thread_fn"
+#10 0x56cc77e5 in qemu_thread_start (args=0x57b51ce0)
+    at ../util/qemu-thread-posix.c:541
+        __cancel_buf =
+            {__cancel_jmp_buf = {{__cancel_jmp_buf = {1467284236, 1471487200, 1471152128, -1315869272, 1617656260, -631423478}, __mask_was_saved = 0}}, __pad = {0xb1916d64, 0x0, 0x0, 0x0}}
+        __cancel_routine = 0x56cc7840 <qemu_thread_atexit_notify>
+        __not_first_call = <optimized out>
+        start_routine = 0x56b10818 <rr_cpu_thread_fn>
+        arg = 0x57af8860
+        r = <optimized out>
+#11 0xf63d5328 in start_thread () at /lib/libpthread.so.0
+#12 0xf604ef06 in clone () at /lib/libc.so.6
+```
diff --git a/gitlab/issues_text/target_i386/host_x86/accel_TCG/2413 b/gitlab/issues_text/target_i386/host_x86/accel_TCG/2413
new file mode 100644
index 000000000..4f645b213
--- /dev/null
+++ b/gitlab/issues_text/target_i386/host_x86/accel_TCG/2413
@@ -0,0 +1,33 @@
+Use of TSTEQ/TSTNE has regressed the cdrom test when running a 32 bit build of qemu-system-x86_64 using TCG
+Description of problem:
+The test freezes, eventually timing out. The bisect was confused by other SEV related things so I had to whittle down the config to --disable-kvm.
+Steps to reproduce:
+1. '../../configure' '--disable-docs' '--disable-user' '--cross-prefix=i686-linux-gnu-' '--target-list=x86_64-softmmu' '--enable-debug' '--disable-kvm'
+2. ninja
+3. meson test -t 0.05 qtest-x86_64/cdrom-test V=1
+Additional information:
+Bisect run pointed at:
+
+```
+commit 15957eb9efe2da67c796612cead95cba28ba9bda
+Author: Paolo Bonzini <pbonzini@redhat.com>
+Date:   Fri Oct 27 05:57:31 2023 +0200
+
+    target/i386: use TSTEQ/TSTNE to test low bits
+    
+    When testing the sign bit or equality to zero of a partial register, it
+    is useful to use a single TSTEQ or TSTNE operation.  It can also be used
+    to test the parity flag, using bit 0 of the population count.
+    
+    Do not do this for target_ulong-sized values however; the optimizer would
+    produce a comparison against zero anyway, and it avoids shifts by 64
+    which are undefined behavior.
+    
+    Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
+    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+
+ target/i386/tcg/translate.c | 28 ++++++++++++++++++++--------
+ target/i386/tcg/emit.c.inc  |  5 ++---
+ 2 files changed, 22 insertions(+), 11 deletions(-)
+bisect found first bad commit⏎                                                          
+```
diff --git a/gitlab/issues_text/target_i386/host_x86/accel_TCG/2784 b/gitlab/issues_text/target_i386/host_x86/accel_TCG/2784
new file mode 100644
index 000000000..685b1a74e
--- /dev/null
+++ b/gitlab/issues_text/target_i386/host_x86/accel_TCG/2784
@@ -0,0 +1,217 @@
+SIGILL during DPDK e1000e device initialization - VMOVD instruction fails in QEMU
+Description of problem:
+I think it's a QEMU issue, but it could be rather a DPDK issue.
+When using DPDK with QEMU's e1000e device, the initialization fails with SIGILL (Illegal Instruction) during the LED initialization phase. The issue occurs specifically with the e1000e device and not with other network devices.
+
+Output from GDB:
+```
+Starting DPDK initialization...
+EAL: Detected CPU lcores: 4
+EAL: Detected NUMA nodes: 1
+EAL: Auto-detected process type: PRIMARY
+EAL: Detected shared linkage of DPDK
+EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
+EAL: Selected IOVA mode 'PA'
+EAL: VFIO support initialized
+EAL: Using IOMMU type 1 (Type 1)
+EAL: Ignore mapping IO port bar(2)
+EAL: Probe PCI driver: net_e1000_em (8086:10d3) device: 0000:01:00.0 (socket -1)
+
+Thread 1 "hello" received signal SIGILL, Illegal instruction.
+0x00007ffff1d4f63e in e1000_id_led_init_generic ()
+   from /usr/local/lib/x86_64-linux-gnu/dpdk/pmds-24.0/librte_net_e1000.so.24.0
+
+1: x/i $pc
+=> 0x7ffff1d4f63e <e1000_id_led_init_generic+94>:	vmovd  0xe00(%rax),%xmm0
+```
+
+PCI device information:
+```
+01:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
+    Subsystem: Intel Corporation 82574L Gigabit Network Connection
+    Physical Slot: 0
+    Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
+    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
+    Interrupt: pin A routed to IRQ 22
+    IOMMU group: 6
+    Region 0: Memory at fe840000 (32-bit, non-prefetchable) [size=128K]
+    Region 1: Memory at fe860000 (32-bit, non-prefetchable) [size=128K]
+    Region 2: I/O ports at c000 [size=32]
+    Region 3: Memory at fe880000 (32-bit, non-prefetchable) [size=16K]
+    Expansion ROM at fe800000 [disabled] [size=256K]
+```
+
+GDB Analysis:
+The crash occurs during LED initialization when attempting to execute a VMOVD instruction. The register RAX contains value 0x1 at the time of crash, which appears incorrect as it should contain the base address of the device's memory-mapped region (around 0xfe840000 based on PCI info).
+
+Both host and guest have AVX/AVX2 support
+- The issue appears to be related to memory mapping or address translation
+- The SIGILL occurs consistently at the same point during device initialization
+- This issue only occurs with e1000e device; other network devices work correctly
+
+Please let me know if you need any additional information.
+Additional information:
+Test program:
+```c
+#include <rte_eal.h>
+#include <rte_debug.h>
+#include <rte_lcore.h>
+#include <rte_memory.h>
+#include <rte_log.h>
+#include <rte_dev.h>
+#include <rte_bus.h>
+#include <rte_ethdev.h>
+#include <rte_kvargs.h>
+
+// Callback function for memory segment walking
+static int dump_memseg(const struct rte_memseg_list *msl, 
+                      const struct rte_memseg *ms, void *arg) {
+    size_t *total_mem = arg;
+    *total_mem += ms->len;
+    return 0;
+}
+
+static void print_device_info(uint16_t port_id) {
+    struct rte_eth_dev_info dev_info;
+    int ret = rte_eth_dev_info_get(port_id, &dev_info);
+    if (ret != 0) {
+        printf("Error getting device info for port %u: %s\n", 
+               port_id, rte_strerror(-ret));
+        return;
+    }
+
+    printf("\nDevice Info for Port %u:\n", port_id);
+    printf("  Driver name: %s\n", dev_info.driver_name);
+    
+    // Get device capabilities
+    printf("  Capabilities:\n");
+    printf("    Maximum RX queues: %u\n", dev_info.max_rx_queues);
+    printf("    Maximum TX queues: %u\n", dev_info.max_tx_queues);
+    printf("    Maximum MTU: %u\n", dev_info.max_mtu);
+    printf("    Minimum RX buffers: %u\n", dev_info.min_rx_bufsize);
+    printf("    Maximum RX descriptors: %u\n", dev_info.rx_desc_lim.nb_max);
+    printf("    Maximum TX descriptors: %u\n", dev_info.tx_desc_lim.nb_max);
+
+    // Get and print link status
+    struct rte_eth_link link;
+    ret = rte_eth_link_get_nowait(port_id, &link);
+    if (ret < 0) {
+        printf("  Link status: unknown\n");
+    } else {
+        printf("  Link status: %s\n", link.link_status ? "up" : "down");
+        if (link.link_status) {
+            printf("    Speed: %u Mbps\n", link.link_speed);
+            printf("    Duplex: %s\n", 
+                   link.link_duplex == RTE_ETH_LINK_FULL_DUPLEX ? 
+                   "full" : "half");
+        }
+    }
+    
+    // Get and print MAC address
+    struct rte_ether_addr mac_addr;
+    ret = rte_eth_macaddr_get(port_id, &mac_addr);
+    if (ret < 0) {
+        printf("  MAC address: unknown\n");
+    } else {
+        printf("  MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n",
+               mac_addr.addr_bytes[0], mac_addr.addr_bytes[1],
+               mac_addr.addr_bytes[2], mac_addr.addr_bytes[3],
+               mac_addr.addr_bytes[4], mac_addr.addr_bytes[5]);
+    }
+
+    // Get statistics
+    struct rte_eth_stats stats;
+    ret = rte_eth_stats_get(port_id, &stats);
+    if (ret == 0) {
+        printf("  Statistics:\n");
+        printf("    RX packets: %" PRIu64 "\n", stats.ipackets);
+        printf("    TX packets: %" PRIu64 "\n", stats.opackets);
+        printf("    RX bytes: %" PRIu64 "\n", stats.ibytes);
+        printf("    TX bytes: %" PRIu64 "\n", stats.obytes);
+        printf("    RX errors: %" PRIu64 "\n", stats.ierrors);
+        printf("    TX errors: %" PRIu64 "\n", stats.oerrors);
+    }
+}
+
+// Print runtime configurations
+void print_runtime_config(void) {
+    // Core and NUMA information
+    printf("\n=== CPU and Memory Configuration ===\n");
+    printf("Main lcore ID: %u\n", rte_get_main_lcore());
+    printf("Number of available lcores: %u\n", rte_lcore_count());
+    
+    // Print available lcores and their status
+    printf("\nLcore status:\n");
+    unsigned int lcore_id;
+    RTE_LCORE_FOREACH(lcore_id) {
+        printf("  Lcore %u - Role: %s, Socket: %d\n", 
+               lcore_id,
+               lcore_id == rte_get_main_lcore() ? "Main" : "Worker",
+               rte_lcore_to_socket_id(lcore_id));
+    }
+    
+    // Memory and NUMA information
+    printf("\n=== Memory Configuration ===\n");
+    printf("Number of NUMA nodes: %u\n", rte_socket_count());
+    printf("IOVA mode: %s\n", rte_eal_iova_mode() == RTE_IOVA_PA ? "PA" : "VA");
+    
+    // Service and Process information
+    printf("\n=== Process Information ===\n");
+    printf("Process type: %s\n", 
+           rte_eal_process_type() == RTE_PROC_PRIMARY ? "Primary" :
+           rte_eal_process_type() == RTE_PROC_SECONDARY ? "Secondary" : "Invalid");
+    
+    // Runtime options
+    printf("\n=== Runtime Options ===\n");
+    printf("Current log level: %d\n", rte_log_get_global_level());
+    
+    // Memory allocation policy
+    printf("Hugepage info: %s\n", 
+           rte_eal_has_hugepages() ? "Using hugepages" : "Not using hugepages");
+    
+    // Memory segments info
+    printf("\n=== Memory Segments ===\n");
+    size_t total_memory = 0;
+    
+    // Walk through all memory segments
+    int ret = rte_memseg_walk(dump_memseg, &total_memory);
+    if (ret < 0) {
+        printf("Failed to walk memory segments\n");
+    } else {
+        printf("Total memory: %zu MB\n", total_memory >> 20);
+    }
+}
+
+int main(int argc, char **argv) {
+    printf("Starting DPDK initialization...\n");
+
+    // Set log level to debug
+    rte_log_set_global_level(RTE_LOG_DEBUG);
+
+    int ret = rte_eal_init(argc, argv);
+    if (ret < 0) {
+        rte_panic("Cannot init EAL: %s\n", rte_strerror(-ret));
+    }
+    printf("EAL initialization successful\n");
+
+    // Get number of available ports
+    uint16_t nb_ports = rte_eth_dev_count_avail();
+    printf("\nNumber of available ethernet ports: %u\n", nb_ports);
+
+    // Print info for each port
+    uint16_t port_id;
+    RTE_ETH_FOREACH_DEV(port_id) {
+        print_device_info(port_id);
+    }
+
+    printf("\nProceeding with runtime configuration...\n");
+    print_runtime_config();
+
+    printf("\nCleaning up...\n");
+    rte_eal_cleanup();
+    return 0;
+}
+```
+Compile command: `gcc -o hello hello.c $(pkg-config --cflags libdpdk) $(pkg-config --libs libdpdk) -DRTE_LOG_LEVEL=RTE_LOG_DEBUG`
+
+Launch command: `sudo gdb --args ./hello -l 0 -n 1 --proc-type=auto -m 256 --iova-mode=pa --log-level=8 --match-allocations -a 0000:01:00.0`