aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjack <[email protected]>2024-05-23 02:03:35 -0600
committerjack <[email protected]>2024-05-23 02:03:35 -0600
commit6ab890ea6463d9202fcf7cd670ba98f3911a845b (patch)
tree00ef1c6074d8abf3403b4f19dccac03a86c3fbe2
parent8bd07541f8c60c757ab4cfafd14d83421aa30649 (diff)
downloaddots-kepler.tar.gz
dots-kepler.zip
updateskepler
-rwxr-xr-xboot/grub/grub.cfg16
-rw-r--r--etc/hosts8
-rw-r--r--etc/img/dmenu.png (renamed from home/jack/.img/dmenu.png)bin367432 -> 367432 bytes
-rw-r--r--etc/img/fetch.png (renamed from home/jack/.img/fetch.png)bin373463 -> 373463 bytes
-rw-r--r--etc/img/gotop.png (renamed from home/jack/.img/gotop.png)bin287353 -> 287353 bytes
-rw-r--r--etc/img/nvim.png (renamed from home/jack/.img/nvim.png)bin318870 -> 318870 bytes
-rw-r--r--etc/img/wallpaper/cave.png (renamed from home/jack/.img/wallpaper/cave.png)bin1170002 -> 1170002 bytes
-rw-r--r--etc/img/wallpaper/grid.png (renamed from home/jack/.img/wallpaper/grid.png)bin12759 -> 12759 bytes
-rw-r--r--etc/img/wallpaper/maze.png (renamed from home/jack/.img/wallpaper/maze.png)bin944484 -> 944484 bytes
-rw-r--r--etc/img/zathura.png (renamed from home/jack/.img/zathura.png)bin332555 -> 332555 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/background.pngbin3636 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/font.pf2bin2405285 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/icons/lfs.pngbin1639 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/logo.pngbin14415 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/select_c.pngbin1766 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/select_e.pngbin1766 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/select_n.pngbin1766 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/select_ne.pngbin1796 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/select_nw.pngbin1803 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/select_s.pngbin1766 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/select_se.pngbin1789 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/select_sw.pngbin1791 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/select_w.pngbin1766 -> 0 bytes
-rw-r--r--home/jack/.config/grub_gruvbox/theme.txt40
-rw-r--r--home/jack/.config/kernel.config177
-rw-r--r--home/jack/.config/keyd.conf6
-rw-r--r--home/jack/.config/lsd/colors.yaml18
-rw-r--r--home/jack/.config/lsd/config.yaml15
-rw-r--r--home/jack/.config/nvchad/chadrc.lua24
-rw-r--r--home/jack/.config/nvchad/configs/lspconfig.lua14
-rw-r--r--home/jack/.config/nvchad/configs/luasnip.lua54
-rw-r--r--home/jack/.config/nvchad/configs/null-ls.lua37
-rw-r--r--home/jack/.config/nvchad/configs/overrides.lua38
-rw-r--r--home/jack/.config/nvchad/configs/vimtex.lua5
-rw-r--r--home/jack/.config/nvchad/plugins.lua63
-rw-r--r--home/jack/.config/starship.toml2
-rw-r--r--home/jack/.gdbinit2382
-rw-r--r--home/jack/.gitconfig6
-rw-r--r--home/jack/.gitignore4
-rw-r--r--home/jack/.xinitrc2
-rw-r--r--home/jack/.zshrc14
l---------[-rw-r--r--]home/jack/readme.md11
-rw-r--r--readme.md10
43 files changed, 2578 insertions, 368 deletions
diff --git a/boot/grub/grub.cfg b/boot/grub/grub.cfg
deleted file mode 100755
index f3ffb987..00000000
--- a/boot/grub/grub.cfg
+++ /dev/null
@@ -1,16 +0,0 @@
-set default=0
-set timeout=10
-insmod all_video
-insmod part_gpt
-insmod ext2
-insmod png
-set root=(hd1,gpt1)
-#loadfont (hd1,gpt3)/jack/.config/grub_gruvbox/font.pf2
-#set theme=(hd1,gpt3)/jack/.config/grub_gruvbox/theme.txt
-#export theme
-menuentry "GNU/Linux, Linux" {
- linux /vmlinuz root=/dev/sdb3 ro
-}
-menuentry "GNU/Linux, Linux OLD" {
- linux /vmlinuz.old root=/dev/sdb3 ro
-}
diff --git a/etc/hosts b/etc/hosts
index 3cff4424..921bb9dc 100644
--- a/etc/hosts
+++ b/etc/hosts
@@ -1,2 +1,10 @@
127.0.0.1 localhost
127.0.1.1 kepler
+10.224.78.150 csci3753
+100.64.58.1 machinea
+100.64.58.2 machineb
+100.64.58.3 machinec
+100.64.58.4 machined
+10.21.32.2 machinee
+100.64.58.6 machinef
+100.64.58.7 machinex
diff --git a/home/jack/.img/dmenu.png b/etc/img/dmenu.png
index f7c026ba..f7c026ba 100644
--- a/home/jack/.img/dmenu.png
+++ b/etc/img/dmenu.png
Binary files differ
diff --git a/home/jack/.img/fetch.png b/etc/img/fetch.png
index dcaa3448..dcaa3448 100644
--- a/home/jack/.img/fetch.png
+++ b/etc/img/fetch.png
Binary files differ
diff --git a/home/jack/.img/gotop.png b/etc/img/gotop.png
index 91a2a25b..91a2a25b 100644
--- a/home/jack/.img/gotop.png
+++ b/etc/img/gotop.png
Binary files differ
diff --git a/home/jack/.img/nvim.png b/etc/img/nvim.png
index 27d4d7e4..27d4d7e4 100644
--- a/home/jack/.img/nvim.png
+++ b/etc/img/nvim.png
Binary files differ
diff --git a/home/jack/.img/wallpaper/cave.png b/etc/img/wallpaper/cave.png
index 6a53111f..6a53111f 100644
--- a/home/jack/.img/wallpaper/cave.png
+++ b/etc/img/wallpaper/cave.png
Binary files differ
diff --git a/home/jack/.img/wallpaper/grid.png b/etc/img/wallpaper/grid.png
index f1c96405..f1c96405 100644
--- a/home/jack/.img/wallpaper/grid.png
+++ b/etc/img/wallpaper/grid.png
Binary files differ
diff --git a/home/jack/.img/wallpaper/maze.png b/etc/img/wallpaper/maze.png
index 265c6212..265c6212 100644
--- a/home/jack/.img/wallpaper/maze.png
+++ b/etc/img/wallpaper/maze.png
Binary files differ
diff --git a/home/jack/.img/zathura.png b/etc/img/zathura.png
index 21829c55..21829c55 100644
--- a/home/jack/.img/zathura.png
+++ b/etc/img/zathura.png
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/background.png b/home/jack/.config/grub_gruvbox/background.png
deleted file mode 100644
index 64dfd7d6..00000000
--- a/home/jack/.config/grub_gruvbox/background.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/font.pf2 b/home/jack/.config/grub_gruvbox/font.pf2
deleted file mode 100644
index b87a7767..00000000
--- a/home/jack/.config/grub_gruvbox/font.pf2
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/icons/lfs.png b/home/jack/.config/grub_gruvbox/icons/lfs.png
deleted file mode 100644
index a6551966..00000000
--- a/home/jack/.config/grub_gruvbox/icons/lfs.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/logo.png b/home/jack/.config/grub_gruvbox/logo.png
deleted file mode 100644
index 45bf8f5c..00000000
--- a/home/jack/.config/grub_gruvbox/logo.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/select_c.png b/home/jack/.config/grub_gruvbox/select_c.png
deleted file mode 100644
index 93ebe598..00000000
--- a/home/jack/.config/grub_gruvbox/select_c.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/select_e.png b/home/jack/.config/grub_gruvbox/select_e.png
deleted file mode 100644
index 7a0b3467..00000000
--- a/home/jack/.config/grub_gruvbox/select_e.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/select_n.png b/home/jack/.config/grub_gruvbox/select_n.png
deleted file mode 100644
index b656f224..00000000
--- a/home/jack/.config/grub_gruvbox/select_n.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/select_ne.png b/home/jack/.config/grub_gruvbox/select_ne.png
deleted file mode 100644
index 89081347..00000000
--- a/home/jack/.config/grub_gruvbox/select_ne.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/select_nw.png b/home/jack/.config/grub_gruvbox/select_nw.png
deleted file mode 100644
index 5beb55cc..00000000
--- a/home/jack/.config/grub_gruvbox/select_nw.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/select_s.png b/home/jack/.config/grub_gruvbox/select_s.png
deleted file mode 100644
index 8b92c864..00000000
--- a/home/jack/.config/grub_gruvbox/select_s.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/select_se.png b/home/jack/.config/grub_gruvbox/select_se.png
deleted file mode 100644
index bddcfc9d..00000000
--- a/home/jack/.config/grub_gruvbox/select_se.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/select_sw.png b/home/jack/.config/grub_gruvbox/select_sw.png
deleted file mode 100644
index a7d82bbb..00000000
--- a/home/jack/.config/grub_gruvbox/select_sw.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/select_w.png b/home/jack/.config/grub_gruvbox/select_w.png
deleted file mode 100644
index 2d82004e..00000000
--- a/home/jack/.config/grub_gruvbox/select_w.png
+++ /dev/null
Binary files differ
diff --git a/home/jack/.config/grub_gruvbox/theme.txt b/home/jack/.config/grub_gruvbox/theme.txt
deleted file mode 100644
index 8bfc40ed..00000000
--- a/home/jack/.config/grub_gruvbox/theme.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-# Global Property
-title-text: ""
-desktop-image: "background.png"
-desktop-image-scale-method: "stretch"
-desktop-color: "#282828"
-terminal-font: "Unifont Regular 16"
-terminal-left: "0"
-terminal-top: "0"
-terminal-width: "100%"
-terminal-height: "100%"
-terminal-border: "0"
-
-+ image {
- left = 50%-63
- top = 50%-208
- file = "logo.png"
-}
-
-+ boot_menu {
- left = 50%-240
- top = 60%
- width = 480
- height = 30%
- item_font = "Unifont Regular 16"
- item_color = "#d4be98"
- selected_item_color = "#d4be98"
- item_height = 32
- item_spacing = 24
- selected_item_pixmap_style = "select_*.png"
-}
-
-+ label {
- top = 82%
- left = 35%
- width = 30%
- align = "center"
- id = "__timeout__"
- text = "Booting in %d seconds"
- color = "#d4be98"
-}
diff --git a/home/jack/.config/kernel.config b/home/jack/.config/kernel.config
index 9e8ef6e0..986676c7 100644
--- a/home/jack/.config/kernel.config
+++ b/home/jack/.config/kernel.config
@@ -1,6 +1,6 @@
#
# Automatically generated file; DO NOT EDIT.
-# Linux/x86 6.6.4 Kernel Configuration
+# Linux/x86 6.9.1 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="gcc (GCC) 13.2.0"
CONFIG_CC_IS_GCC=y
@@ -15,6 +15,7 @@ CONFIG_CC_CAN_LINK=y
CONFIG_CC_CAN_LINK_STATIC=y
CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
+CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
CONFIG_TOOLS_SUPPORT_RELR=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
@@ -82,6 +83,7 @@ CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST_IDLE=y
CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y
@@ -163,8 +165,10 @@ CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y
CONFIG_CC_HAS_INT128=y
CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
-CONFIG_GCC11_NO_ARRAY_BOUNDS=y
+CONFIG_GCC10_NO_ARRAY_BOUNDS=y
CONFIG_CC_NO_ARRAY_BOUNDS=y
+CONFIG_GCC_NO_STRINGOP_OVERFLOW=y
+CONFIG_CC_NO_STRINGOP_OVERFLOW=y
CONFIG_ARCH_SUPPORTS_INT128=y
CONFIG_CGROUPS=y
# CONFIG_CGROUP_FAVOR_DYNMODS is not set
@@ -226,14 +230,14 @@ CONFIG_AIO=y
CONFIG_IO_URING=y
CONFIG_ADVISE_SYSCALLS=y
CONFIG_MEMBARRIER=y
+CONFIG_KCMP=y
+CONFIG_RSEQ=y
+CONFIG_CACHESTAT_SYSCALL=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_SELFTEST is not set
CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y
CONFIG_KALLSYMS_BASE_RELATIVE=y
CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
-CONFIG_KCMP=y
-CONFIG_RSEQ=y
-CONFIG_CACHESTAT_SYSCALL=y
CONFIG_HAVE_PERF_EVENTS=y
#
@@ -250,7 +254,6 @@ CONFIG_SYSTEM_DATA_VERIFICATION=y
#
# CONFIG_KEXEC is not set
# CONFIG_KEXEC_FILE is not set
-# CONFIG_CRASH_DUMP is not set
# end of Kexec and crash features
# end of General setup
@@ -287,8 +290,8 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y
#
CONFIG_SMP=y
# CONFIG_X86_MPPARSE is not set
-# CONFIG_GOLDFISH is not set
# CONFIG_X86_CPU_RESCTRL is not set
+# CONFIG_X86_FRED is not set
# CONFIG_X86_EXTENDED_PLATFORM is not set
# CONFIG_X86_INTEL_LPSS is not set
# CONFIG_X86_AMD_PLATFORM_DEVICE is not set
@@ -307,6 +310,7 @@ CONFIG_X86_INTEL_USERCOPY=y
CONFIG_X86_USE_PPRO_CHECKSUM=y
CONFIG_X86_P6_NOP=y
CONFIG_X86_TSC=y
+CONFIG_X86_HAVE_PAE=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
@@ -361,6 +365,7 @@ CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
# CONFIG_X86_5LEVEL is not set
CONFIG_X86_DIRECT_GBPAGES=y
+# CONFIG_AMD_MEM_ENCRYPT is not set
# CONFIG_NUMA is not set
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
@@ -381,7 +386,9 @@ CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y
CONFIG_X86_INTEL_TSX_MODE_AUTO=y
# CONFIG_X86_USER_SHADOW_STACK is not set
CONFIG_EFI=y
-# CONFIG_EFI_STUB is not set
+CONFIG_EFI_STUB=y
+# CONFIG_EFI_HANDOVER_PROTOCOL is not set
+# CONFIG_EFI_MIXED is not set
# CONFIG_EFI_FAKE_MEMMAP is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
@@ -391,6 +398,7 @@ CONFIG_HZ=300
CONFIG_SCHED_HRTICK=y
CONFIG_ARCH_SUPPORTS_KEXEC=y
CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y
+CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y
CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y
CONFIG_ARCH_SUPPORTS_KEXEC_SIG_FORCE=y
CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y
@@ -409,12 +417,16 @@ CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0
CONFIG_HOTPLUG_CPU=y
# CONFIG_LEGACY_VSYSCALL_XONLY is not set
CONFIG_LEGACY_VSYSCALL_NONE=y
-# CONFIG_CMDLINE_BOOL is not set
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE="root=PARTUUID=bc4c83fe-67c3-8a4b-bb33-9a05f6ac99d6 ro"
+# CONFIG_CMDLINE_OVERRIDE is not set
CONFIG_MODIFY_LDT_SYSCALL=y
# CONFIG_STRICT_SIGALTSTACK_SIZE is not set
CONFIG_HAVE_LIVEPATCH=y
# end of Processor type and features
+CONFIG_CC_HAS_NAMED_AS=y
+CONFIG_USE_X86_SEG_SUPPORT=y
CONFIG_CC_HAS_SLS=y
CONFIG_CC_HAS_RETURN_THUNK=y
CONFIG_CC_HAS_ENTRY_PADDING=y
@@ -424,18 +436,20 @@ CONFIG_CALL_PADDING=y
CONFIG_HAVE_CALL_THUNKS=y
CONFIG_CALL_THUNKS=y
CONFIG_PREFIX_SYMBOLS=y
-CONFIG_SPECULATION_MITIGATIONS=y
-CONFIG_PAGE_TABLE_ISOLATION=y
-CONFIG_RETPOLINE=y
-CONFIG_RETHUNK=y
-CONFIG_CPU_UNRET_ENTRY=y
-CONFIG_CALL_DEPTH_TRACKING=y
+CONFIG_CPU_MITIGATIONS=y
+CONFIG_MITIGATION_PAGE_TABLE_ISOLATION=y
+CONFIG_MITIGATION_RETPOLINE=y
+CONFIG_MITIGATION_RETHUNK=y
+CONFIG_MITIGATION_UNRET_ENTRY=y
+CONFIG_MITIGATION_CALL_DEPTH_TRACKING=y
# CONFIG_CALL_THUNKS_DEBUG is not set
-CONFIG_CPU_IBPB_ENTRY=y
-CONFIG_CPU_IBRS_ENTRY=y
-CONFIG_CPU_SRSO=y
-# CONFIG_SLS is not set
-# CONFIG_GDS_FORCE_MITIGATION is not set
+CONFIG_MITIGATION_IBPB_ENTRY=y
+CONFIG_MITIGATION_IBRS_ENTRY=y
+CONFIG_MITIGATION_SRSO=y
+# CONFIG_MITIGATION_SLS is not set
+# CONFIG_MITIGATION_GDS_FORCE is not set
+CONFIG_MITIGATION_RFDS=y
+CONFIG_MITIGATION_SPECTRE_BHI=y
CONFIG_ARCH_HAS_ADD_PAGES=y
#
@@ -459,6 +473,7 @@ CONFIG_ACPI=y
CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
+CONFIG_ACPI_THERMAL_LIB=y
# CONFIG_ACPI_DEBUGGER is not set
# CONFIG_ACPI_SPCR_TABLE is not set
CONFIG_ACPI_FPDT=y
@@ -529,7 +544,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
#
CONFIG_X86_INTEL_PSTATE=y
# CONFIG_X86_PCC_CPUFREQ is not set
-# CONFIG_X86_AMD_PSTATE is not set
+CONFIG_X86_AMD_PSTATE=y
+CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
# CONFIG_X86_AMD_PSTATE_UT is not set
CONFIG_X86_ACPI_CPUFREQ=y
# CONFIG_X86_ACPI_CPUFREQ_CPB is not set
@@ -571,7 +587,6 @@ CONFIG_AMD_NB=y
# CONFIG_X86_X32_ABI is not set
# end of Binary Emulations
-CONFIG_HAVE_KVM=y
# CONFIG_VIRTUALIZATION is not set
CONFIG_AS_AVX512=y
CONFIG_AS_SHA1_NI=y
@@ -579,6 +594,7 @@ CONFIG_AS_SHA256_NI=y
CONFIG_AS_TPAUSE=y
CONFIG_AS_GFNI=y
CONFIG_AS_WRUSS=y
+CONFIG_ARCH_CONFIGURES_CPU_MITIGATIONS=y
#
# General architecture-dependent options
@@ -672,8 +688,11 @@ CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
CONFIG_HAVE_EXIT_THREAD=y
CONFIG_ARCH_MMAP_RND_BITS=28
+CONFIG_HAVE_PAGE_SIZE_4KB=y
+CONFIG_PAGE_SIZE_4KB=y
CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
+CONFIG_PAGE_SHIFT=12
CONFIG_HAVE_OBJTOOL=y
CONFIG_HAVE_JUMP_LABEL_HACK=y
CONFIG_HAVE_NOINSTR_HACK=y
@@ -704,6 +723,7 @@ CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y
CONFIG_ARCH_HAS_ELFCORE_COMPAT=y
CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y
CONFIG_DYNAMIC_SIGFRAME=y
+CONFIG_ARCH_HAS_HW_PTE_YOUNG=y
CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y
#
@@ -734,6 +754,7 @@ CONFIG_MODULE_COMPRESS_ZSTD=y
# CONFIG_MODULE_DECOMPRESS is not set
# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
CONFIG_MODPROBE_PATH="/sbin/modprobe"
+# CONFIG_TRIM_UNUSED_KSYMS is not set
CONFIG_MODULES_TREE_LOOKUP=y
CONFIG_BLOCK=y
# CONFIG_BLOCK_LEGACY_AUTOLOAD is not set
@@ -742,6 +763,7 @@ CONFIG_BLK_DEV_BSG_COMMON=y
CONFIG_BLK_ICQ=y
CONFIG_BLK_DEV_BSGLIB=y
# CONFIG_BLK_DEV_INTEGRITY is not set
+CONFIG_BLK_DEV_WRITE_MOUNTED=y
# CONFIG_BLK_DEV_ZONED is not set
# CONFIG_BLK_DEV_THROTTLING is not set
# CONFIG_BLK_WBT is not set
@@ -822,9 +844,8 @@ CONFIG_SWAP=y
# CONFIG_ZSWAP is not set
#
-# SLAB allocator options
+# Slab allocator options
#
-# CONFIG_SLAB_DEPRECATED is not set
CONFIG_SLUB=y
CONFIG_SLAB_MERGE_DEFAULT=y
CONFIG_SLAB_FREELIST_RANDOM=y
@@ -832,7 +853,7 @@ CONFIG_SLAB_FREELIST_HARDENED=y
# CONFIG_SLUB_STATS is not set
CONFIG_SLUB_CPU_PARTIAL=y
# CONFIG_RANDOM_KMALLOC_CACHES is not set
-# end of SLAB allocator options
+# end of Slab allocator options
CONFIG_SHUFFLE_PAGE_ALLOCATOR=y
# CONFIG_COMPAT_BRK is not set
@@ -853,6 +874,7 @@ CONFIG_COMPACTION=y
CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
# CONFIG_PAGE_REPORTING is not set
CONFIG_MIGRATION=y
+CONFIG_PCP_BATCH_SCALE_MAX=5
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_MMU_NOTIFIER=y
# CONFIG_KSM is not set
@@ -912,7 +934,6 @@ CONFIG_SKB_EXTENSIONS=y
CONFIG_PACKET=y
CONFIG_PACKET_DIAG=y
CONFIG_UNIX=y
-CONFIG_UNIX_SCM=y
CONFIG_AF_UNIX_OOB=y
CONFIG_UNIX_DIAG=y
# CONFIG_TLS is not set
@@ -948,6 +969,7 @@ CONFIG_INET_TUNNEL=y
# CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_CUBIC=y
CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_AO is not set
# CONFIG_TCP_MD5SIG is not set
CONFIG_IPV6=y
# CONFIG_IPV6_ROUTER_PREF is not set
@@ -1065,7 +1087,7 @@ CONFIG_NF_LOG_ARP=y
CONFIG_NF_LOG_IPV4=y
CONFIG_NF_REJECT_IPV4=y
# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_ARPTABLES is not set
+# CONFIG_IP_NF_ARPFILTER is not set
# end of IP: Netfilter Configuration
#
@@ -1079,7 +1101,6 @@ CONFIG_NF_LOG_IPV6=y
# CONFIG_IP6_NF_IPTABLES is not set
# end of IPv6: Netfilter Configuration
-# CONFIG_BPFILTER is not set
# CONFIG_IP_DCCP is not set
# CONFIG_IP_SCTP is not set
# CONFIG_RDS is not set
@@ -1137,7 +1158,6 @@ CONFIG_BT_RFCOMM=y
# CONFIG_BT_RFCOMM_TTY is not set
# CONFIG_BT_BNEP is not set
CONFIG_BT_HIDP=y
-CONFIG_BT_HS=y
CONFIG_BT_LE=y
CONFIG_BT_LE_L2CAP_ECRED=y
# CONFIG_BT_LEDS is not set
@@ -1209,6 +1229,7 @@ CONFIG_GRO_CELLS=y
CONFIG_HAVE_EISA=y
# CONFIG_EISA is not set
CONFIG_HAVE_PCI=y
+CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y
CONFIG_PCIEPORTBUS=y
@@ -1301,6 +1322,7 @@ CONFIG_FW_CACHE=y
CONFIG_ALLOW_DEV_COREDUMP=y
# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
+CONFIG_GENERIC_CPU_DEVICES=y
CONFIG_GENERIC_CPU_AUTOPROBE=y
CONFIG_GENERIC_CPU_VULNERABILITIES=y
CONFIG_REGMAP=y
@@ -1349,10 +1371,13 @@ CONFIG_SYSFB_SIMPLEFB=y
CONFIG_EFI_ESRT=y
CONFIG_EFI_VARS_PSTORE=y
# CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set
+CONFIG_EFI_DXE_MEM_ATTRIBUTES=y
CONFIG_EFI_RUNTIME_WRAPPERS=y
# CONFIG_EFI_BOOTLOADER_CONTROL is not set
# CONFIG_EFI_CAPSULE_LOADER is not set
# CONFIG_EFI_TEST is not set
+# CONFIG_APPLE_PROPERTIES is not set
+# CONFIG_RESET_ATTACK_MITIGATION is not set
# CONFIG_EFI_RCI2_TABLE is not set
# CONFIG_EFI_DISABLE_PCI_DMA is not set
CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y
@@ -1364,6 +1389,11 @@ CONFIG_UEFI_CPER=y
CONFIG_UEFI_CPER_X86=y
#
+# Qualcomm firmware drivers
+#
+# end of Qualcomm firmware drivers
+
+#
# Tegra firmware driver
#
# end of Tegra firmware driver
@@ -1393,7 +1423,7 @@ CONFIG_BLK_DEV_NVME=y
CONFIG_NVME_HWMON=y
# CONFIG_NVME_FC is not set
# CONFIG_NVME_TCP is not set
-# CONFIG_NVME_AUTH is not set
+# CONFIG_NVME_HOST_AUTH is not set
# end of NVME Support
#
@@ -1425,7 +1455,6 @@ CONFIG_NVME_HWMON=y
# EEPROM support
#
# CONFIG_EEPROM_AT24 is not set
-# CONFIG_EEPROM_LEGACY is not set
# CONFIG_EEPROM_MAX6875 is not set
# CONFIG_EEPROM_93CX6 is not set
# CONFIG_EEPROM_IDT_89HPESX is not set
@@ -1550,7 +1579,6 @@ CONFIG_WLAN=y
# CONFIG_WLAN_VENDOR_ATH is not set
# CONFIG_WLAN_VENDOR_ATMEL is not set
# CONFIG_WLAN_VENDOR_BROADCOM is not set
-# CONFIG_WLAN_VENDOR_CISCO is not set
# CONFIG_WLAN_VENDOR_INTEL is not set
# CONFIG_WLAN_VENDOR_INTERSIL is not set
# CONFIG_WLAN_VENDOR_MARVELL is not set
@@ -1565,7 +1593,6 @@ CONFIG_WLAN=y
# CONFIG_WLAN_VENDOR_TI is not set
# CONFIG_WLAN_VENDOR_ZYDAS is not set
# CONFIG_WLAN_VENDOR_QUANTENNA is not set
-# CONFIG_USB_NET_RNDIS_WLAN is not set
# CONFIG_MAC80211_HWSIM is not set
# CONFIG_VIRT_WIFI is not set
# CONFIG_WAN is not set
@@ -1686,7 +1713,6 @@ CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_VT_CONSOLE_SLEEP=y
-CONFIG_HW_CONSOLE=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not set
@@ -1869,7 +1895,6 @@ CONFIG_POWER_SUPPLY_HWMON=y
# CONFIG_BATTERY_SBS is not set
# CONFIG_CHARGER_SBS is not set
# CONFIG_BATTERY_BQ27XXX is not set
-# CONFIG_BATTERY_MAX17040 is not set
# CONFIG_BATTERY_MAX17042 is not set
# CONFIG_CHARGER_MAX8903 is not set
# CONFIG_CHARGER_LP8727 is not set
@@ -1881,6 +1906,7 @@ CONFIG_POWER_SUPPLY_HWMON=y
# CONFIG_BATTERY_RT5033 is not set
# CONFIG_CHARGER_BD99954 is not set
# CONFIG_BATTERY_UG3105 is not set
+# CONFIG_FUEL_GAUGE_MM8013 is not set
CONFIG_HWMON=y
# CONFIG_HWMON_DEBUG_CHIP is not set
@@ -1907,6 +1933,7 @@ CONFIG_HWMON=y
# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set
# CONFIG_SENSORS_AS370 is not set
# CONFIG_SENSORS_ASC7621 is not set
+# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set
# CONFIG_SENSORS_AXI_FAN_CONTROL is not set
# CONFIG_SENSORS_K8TEMP is not set
# CONFIG_SENSORS_K10TEMP is not set
@@ -1914,6 +1941,7 @@ CONFIG_HWMON=y
CONFIG_SENSORS_APPLESMC=y
# CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_CHIPCAP2 is not set
# CONFIG_SENSORS_CORSAIR_CPRO is not set
# CONFIG_SENSORS_CORSAIR_PSU is not set
# CONFIG_SENSORS_DRIVETEMP is not set
@@ -1925,6 +1953,7 @@ CONFIG_SENSORS_APPLESMC=y
# CONFIG_SENSORS_F71882FG is not set
# CONFIG_SENSORS_F75375S is not set
# CONFIG_SENSORS_FSCHMD is not set
+# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set
# CONFIG_SENSORS_GL518SM is not set
# CONFIG_SENSORS_GL520SM is not set
# CONFIG_SENSORS_G760A is not set
@@ -1935,17 +1964,20 @@ CONFIG_SENSORS_APPLESMC=y
CONFIG_SENSORS_CORETEMP=y
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_JC42 is not set
+# CONFIG_SENSORS_POWERZ is not set
# CONFIG_SENSORS_POWR1220 is not set
# CONFIG_SENSORS_LINEAGE is not set
# CONFIG_SENSORS_LTC2945 is not set
# CONFIG_SENSORS_LTC2947_I2C is not set
# CONFIG_SENSORS_LTC2990 is not set
+# CONFIG_SENSORS_LTC2991 is not set
# CONFIG_SENSORS_LTC4151 is not set
# CONFIG_SENSORS_LTC4215 is not set
# CONFIG_SENSORS_LTC4222 is not set
# CONFIG_SENSORS_LTC4245 is not set
# CONFIG_SENSORS_LTC4260 is not set
# CONFIG_SENSORS_LTC4261 is not set
+# CONFIG_SENSORS_LTC4282 is not set
# CONFIG_SENSORS_MAX127 is not set
# CONFIG_SENSORS_MAX16065 is not set
# CONFIG_SENSORS_MAX1619 is not set
@@ -1989,11 +2021,13 @@ CONFIG_SENSORS_CORETEMP=y
# CONFIG_SENSORS_NCT7802 is not set
# CONFIG_SENSORS_NPCM7XX is not set
# CONFIG_SENSORS_NZXT_KRAKEN2 is not set
+# CONFIG_SENSORS_NZXT_KRAKEN3 is not set
# CONFIG_SENSORS_NZXT_SMART2 is not set
# CONFIG_SENSORS_OCC_P8_I2C is not set
# CONFIG_SENSORS_OXP is not set
# CONFIG_SENSORS_PCF8591 is not set
# CONFIG_PMBUS is not set
+# CONFIG_SENSORS_PT5161L is not set
# CONFIG_SENSORS_SBTSI is not set
# CONFIG_SENSORS_SBRMI is not set
# CONFIG_SENSORS_SHT21 is not set
@@ -2055,8 +2089,6 @@ CONFIG_THERMAL_NETLINK=y
# CONFIG_THERMAL_STATISTICS is not set
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
CONFIG_THERMAL_HWMON=y
-CONFIG_THERMAL_ACPI=y
-CONFIG_THERMAL_WRITABLE_TRIPS=y
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
@@ -2156,7 +2188,6 @@ CONFIG_LPC_ICH=y
# CONFIG_MFD_SM501 is not set
# CONFIG_MFD_SKY81452 is not set
# CONFIG_MFD_SYSCON is not set
-# CONFIG_MFD_TI_AM335X_TSCADC is not set
# CONFIG_MFD_LP3943 is not set
# CONFIG_MFD_LP8788 is not set
# CONFIG_MFD_TI_LMU is not set
@@ -2198,8 +2229,8 @@ CONFIG_LPC_ICH=y
# Graphics support
#
CONFIG_APERTURE_HELPERS=y
-CONFIG_VIDEO_CMDLINE=y
-CONFIG_VIDEO_NOMODESET=y
+CONFIG_SCREEN_INFO=y
+CONFIG_VIDEO=y
# CONFIG_AUXDISPLAY is not set
CONFIG_AGP=y
# CONFIG_AGP_AMD64 is not set
@@ -2256,6 +2287,7 @@ CONFIG_DRM_I915_PREEMPT_TIMEOUT_COMPUTE=7500
CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000
CONFIG_DRM_I915_STOP_TIMEOUT=100
CONFIG_DRM_I915_TIMESLICE_DURATION=1
+# CONFIG_DRM_XE is not set
# CONFIG_DRM_VGEM is not set
# CONFIG_DRM_VKMS is not set
# CONFIG_DRM_VMWGFX is not set
@@ -2281,7 +2313,6 @@ CONFIG_DRM_PANEL_BRIDGE=y
# CONFIG_DRM_ANALOGIX_ANX78XX is not set
# end of Display Interface Bridges
-# CONFIG_DRM_LOONGSON is not set
# CONFIG_DRM_ETNAVIV is not set
# CONFIG_DRM_BOCHS is not set
# CONFIG_DRM_CIRRUS_QEMU is not set
@@ -2290,7 +2321,6 @@ CONFIG_DRM_PANEL_BRIDGE=y
# CONFIG_DRM_VBOXVIDEO is not set
# CONFIG_DRM_GUD is not set
# CONFIG_DRM_SSD130X is not set
-# CONFIG_DRM_LEGACY is not set
CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
#
@@ -2314,7 +2344,6 @@ CONFIG_FB_EFI=y
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_I740 is not set
-# CONFIG_FB_LE80578 is not set
# CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON is not set
# CONFIG_FB_ATY128 is not set
@@ -2350,8 +2379,9 @@ CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_IMAGEBLIT=y
# CONFIG_FB_FOREIGN_ENDIAN is not set
-CONFIG_FB_SYS_FOPS=y
+CONFIG_FB_SYSMEM_FOPS=y
CONFIG_FB_DEFERRED_IO=y
+CONFIG_FB_IOMEM_FOPS=y
CONFIG_FB_IOMEM_HELPERS=y
CONFIG_FB_SYSMEM_HELPERS=y
CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y
@@ -2364,6 +2394,7 @@ CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y
#
# CONFIG_LCD_CLASS_DEVICE is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_KTD2801 is not set
# CONFIG_BACKLIGHT_KTZ8866 is not set
CONFIG_BACKLIGHT_APPLE=y
# CONFIG_BACKLIGHT_QCOM_WLED is not set
@@ -2669,6 +2700,7 @@ CONFIG_USB_COMMON=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=y
CONFIG_USB_PCI=y
+# CONFIG_USB_PCI_AMD is not set
# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
#
@@ -2680,6 +2712,7 @@ CONFIG_USB_DEFAULT_PERSIST=y
# CONFIG_USB_OTG is not set
# CONFIG_USB_OTG_PRODUCTLIST is not set
CONFIG_USB_AUTOSUSPEND_DELAY=2
+CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1
# CONFIG_USB_MON is not set
#
@@ -2774,6 +2807,7 @@ CONFIG_USB_STORAGE=y
# CONFIG_USB_IDMOUSE is not set
# CONFIG_USB_APPLEDISPLAY is not set
# CONFIG_APPLE_MFI_FASTCHARGE is not set
+# CONFIG_USB_LJCA is not set
# CONFIG_USB_SISUSBVGA is not set
# CONFIG_USB_LD is not set
# CONFIG_USB_TRANCEVIBRATOR is not set
@@ -2886,6 +2920,7 @@ CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_MAX31335 is not set
# CONFIG_RTC_DRV_RS5C372 is not set
# CONFIG_RTC_DRV_ISL1208 is not set
# CONFIG_RTC_DRV_ISL12022 is not set
@@ -2976,6 +3011,7 @@ CONFIG_SYNC_FILE=y
# CONFIG_GREYBUS is not set
# CONFIG_COMEDI is not set
# CONFIG_STAGING is not set
+# CONFIG_GOLDFISH is not set
# CONFIG_CHROME_PLATFORMS is not set
# CONFIG_MELLANOX_PLATFORM is not set
# CONFIG_SURFACE_PLATFORMS is not set
@@ -2991,9 +3027,9 @@ CONFIG_ACPI_WMI=y
# CONFIG_ACERHDF is not set
# CONFIG_ACER_WIRELESS is not set
# CONFIG_ACER_WMI is not set
-# CONFIG_AMD_PMF is not set
# CONFIG_AMD_PMC is not set
# CONFIG_AMD_HSMP is not set
+# CONFIG_AMD_WBRF is not set
# CONFIG_ADV_SWBUTTON is not set
# CONFIG_APPLE_GMUX is not set
# CONFIG_ASUS_LAPTOP is not set
@@ -3012,7 +3048,6 @@ CONFIG_ACPI_WMI=y
# CONFIG_INTEL_ATOMISP2_PM is not set
# CONFIG_INTEL_IFS is not set
# CONFIG_INTEL_SAR_INT1092 is not set
-# CONFIG_INTEL_PMC_CORE is not set
#
# Intel Speed Select Technology interface support
@@ -3049,6 +3084,7 @@ CONFIG_ACPI_WMI=y
# CONFIG_SYSTEM76_ACPI is not set
# CONFIG_TOPSTAR_LAPTOP is not set
# CONFIG_MLX_PLATFORM is not set
+# CONFIG_INSPUR_PLATFORM_PROFILE is not set
# CONFIG_INTEL_IPS is not set
# CONFIG_INTEL_SCU_PCI is not set
# CONFIG_INTEL_SCU_PLATFORM is not set
@@ -3166,6 +3202,31 @@ CONFIG_INTEL_IOMMU_PERF_EVENTS=y
# end of Xilinx SoC drivers
# end of SOC (System On Chip) specific Drivers
+#
+# PM Domains
+#
+
+#
+# Amlogic PM Domains
+#
+# end of Amlogic PM Domains
+
+#
+# Broadcom PM Domains
+#
+# end of Broadcom PM Domains
+
+#
+# i.MX PM Domains
+#
+# end of i.MX PM Domains
+
+#
+# Qualcomm PM Domains
+#
+# end of Qualcomm PM Domains
+# end of PM Domains
+
# CONFIG_PM_DEVFREQ is not set
# CONFIG_EXTCON is not set
# CONFIG_MEMORY is not set
@@ -3207,6 +3268,7 @@ CONFIG_IDLE_INJECT=y
#
# Performance monitor support
#
+# CONFIG_DWC_PCIE_PMU is not set
# end of Performance monitor support
CONFIG_RAS=y
@@ -3244,6 +3306,7 @@ CONFIG_RAS=y
CONFIG_DCACHE_WORD_ACCESS=y
# CONFIG_VALIDATE_FS_PARSER is not set
CONFIG_FS_IOMAP=y
+CONFIG_FS_STACK=y
CONFIG_BUFFER_HEAD=y
CONFIG_LEGACY_DIRECT_IO=y
# CONFIG_EXT2_FS is not set
@@ -3263,6 +3326,7 @@ CONFIG_FS_MBCACHE=y
# CONFIG_BTRFS_FS is not set
# CONFIG_NILFS2_FS is not set
# CONFIG_F2FS_FS is not set
+# CONFIG_BCACHEFS_FS is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_EXPORTFS=y
# CONFIG_EXPORTFS_BLOCK_OPS is not set
@@ -3279,12 +3343,12 @@ CONFIG_FANOTIFY=y
CONFIG_FUSE_FS=y
# CONFIG_CUSE is not set
# CONFIG_VIRTIO_FS is not set
+CONFIG_FUSE_PASSTHROUGH=y
# CONFIG_OVERLAY_FS is not set
#
# Caches
#
-# CONFIG_FSCACHE is not set
# end of Caches
#
@@ -3304,8 +3368,8 @@ CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
# CONFIG_FAT_DEFAULT_UTF8 is not set
# CONFIG_EXFAT_FS is not set
-# CONFIG_NTFS_FS is not set
# CONFIG_NTFS3_FS is not set
+# CONFIG_NTFS_FS is not set
# end of DOS/FAT/EXFAT/NT Filesystems
#
@@ -3547,14 +3611,12 @@ CONFIG_CRYPTO_AES=y
# CONFIG_CRYPTO_ADIANTUM is not set
# CONFIG_CRYPTO_CHACHA20 is not set
CONFIG_CRYPTO_CBC=y
-# CONFIG_CRYPTO_CFB is not set
CONFIG_CRYPTO_CTR=y
# CONFIG_CRYPTO_CTS is not set
CONFIG_CRYPTO_ECB=y
# CONFIG_CRYPTO_HCTR2 is not set
# CONFIG_CRYPTO_KEYWRAP is not set
# CONFIG_CRYPTO_LRW is not set
-# CONFIG_CRYPTO_OFB is not set
# CONFIG_CRYPTO_PCBC is not set
# CONFIG_CRYPTO_XTS is not set
# end of Length-preserving ciphers and modes
@@ -3626,7 +3688,9 @@ CONFIG_CRYPTO_DRBG_HMAC=y
# CONFIG_CRYPTO_DRBG_CTR is not set
CONFIG_CRYPTO_DRBG=y
CONFIG_CRYPTO_JITTERENTROPY=y
-# CONFIG_CRYPTO_JITTERENTROPY_TESTINTERFACE is not set
+CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64
+CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32
+CONFIG_CRYPTO_JITTERENTROPY_OSR=1
# end of Random number generation
#
@@ -3690,6 +3754,7 @@ CONFIG_CRYPTO_HW=y
# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set
# CONFIG_CRYPTO_DEV_QAT_C62X is not set
# CONFIG_CRYPTO_DEV_QAT_4XXX is not set
+# CONFIG_CRYPTO_DEV_QAT_420XX is not set
# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set
# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set
# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set
@@ -3725,7 +3790,6 @@ CONFIG_GENERIC_NET_UTILS=y
CONFIG_CORDIC=y
# CONFIG_PRIME_NUMBERS is not set
CONFIG_RATIONAL=y
-CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_GENERIC_IOMAP=y
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
@@ -3773,7 +3837,6 @@ CONFIG_ZSTD_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
CONFIG_XZ_DEC_POWERPC=y
-CONFIG_XZ_DEC_IA64=y
CONFIG_XZ_DEC_ARM=y
CONFIG_XZ_DEC_ARMTHUMB=y
CONFIG_XZ_DEC_SPARC=y
@@ -3822,9 +3885,13 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y
CONFIG_ARCH_HAS_COPY_MC=y
CONFIG_ARCH_STACKWALK=y
CONFIG_STACKDEPOT=y
+CONFIG_STACKDEPOT_MAX_FRAMES=64
CONFIG_SBITMAP=y
+# CONFIG_LWQ_TEST is not set
# end of Library routines
+CONFIG_FIRMWARE_TABLE=y
+
#
# Kernel hacking
#
@@ -3849,7 +3916,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
#
# Compile-time checks and compiler options
#
-CONFIG_AS_HAS_NON_CONST_LEB128=y
+CONFIG_AS_HAS_NON_CONST_ULEB128=y
CONFIG_FRAME_WARN=2048
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_HEADERS_INSTALL is not set
@@ -3864,7 +3931,7 @@ CONFIG_OBJTOOL=y
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_DEBUG_FS is not set
CONFIG_HAVE_ARCH_KGDB=y
-CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
+CONFIG_ARCH_HAS_UBSAN=y
# CONFIG_UBSAN is not set
CONFIG_HAVE_ARCH_KCSAN=y
CONFIG_HAVE_KCSAN_COMPILER=y
diff --git a/home/jack/.config/keyd.conf b/home/jack/.config/keyd.conf
index aa4e8156..fe95aa0c 100644
--- a/home/jack/.config/keyd.conf
+++ b/home/jack/.config/keyd.conf
@@ -18,7 +18,6 @@ l = overloadt(meta, l, 170)
# other
[ = backspace
-capslock = macro(C-t 100ms https://github.com/qmk/qmk_firmware/find/develop enter)
leftmeta = esc
space = overloadt(lower, space, 170)
rightmeta = C-S-v
@@ -35,11 +34,6 @@ c+, = +
v+m = -
b+n = _
-# disable keys
-- = noop
-= = noop
-\ = noop
-
[lower]
q = 1
w = 2
diff --git a/home/jack/.config/lsd/colors.yaml b/home/jack/.config/lsd/colors.yaml
new file mode 100644
index 00000000..dfd10c15
--- /dev/null
+++ b/home/jack/.config/lsd/colors.yaml
@@ -0,0 +1,18 @@
+permission:
+ read: "#A3BE8C"
+ write: "#EBCB8B"
+ exec: "#BF616A"
+ no-access: "#4C566A"
+size:
+ none: "#4C566A"
+ small: "#A3BE8C"
+ medium: "#EBCB8B"
+ large: "#D08770"
+user: "#B48EAD"
+date:
+ hour-old: "#88C0D0"
+ day-old: "#5E81AC"
+ older: "#81A1C1"
+links:
+ valid: "#A3BE8C"
+ invalid: "#BF616A"
diff --git a/home/jack/.config/lsd/config.yaml b/home/jack/.config/lsd/config.yaml
new file mode 100644
index 00000000..7a08ede6
--- /dev/null
+++ b/home/jack/.config/lsd/config.yaml
@@ -0,0 +1,15 @@
+# lsd configuration
+
+blocks:
+ - permission
+ - size
+ - user
+ - date
+ - name
+
+color:
+ theme: custom
+
+date: '+%d %b %Y %H:%M'
+
+size: short
diff --git a/home/jack/.config/nvchad/chadrc.lua b/home/jack/.config/nvchad/chadrc.lua
deleted file mode 100644
index 8554c60a..00000000
--- a/home/jack/.config/nvchad/chadrc.lua
+++ /dev/null
@@ -1,24 +0,0 @@
----@type ChadrcConfig
-local M = {}
-
-M.ui = {
- statusline = {
- theme = "vscode_colored",
- },
- theme = "gruvbox",
- theme_toggle = { "gruvbox", "one_light" },
- changed_themes = {
- gruvbox = {
- base_16 = {
- base00 = "#1D2021",
- },
- },
- },
- tabufline = {
- lazyload = true,
- },
-}
-
-M.plugins = "custom.plugins"
-
-return M
diff --git a/home/jack/.config/nvchad/configs/lspconfig.lua b/home/jack/.config/nvchad/configs/lspconfig.lua
deleted file mode 100644
index 349c191d..00000000
--- a/home/jack/.config/nvchad/configs/lspconfig.lua
+++ /dev/null
@@ -1,14 +0,0 @@
-local on_attach = require("plugins.configs.lspconfig").on_attach
-local capabilities = require("plugins.configs.lspconfig").capabilities
-
-local lspconfig = require "lspconfig"
-
--- local servers = { "cssls", "pylsp", "clangd" }
-local servers = { "pylsp", "clangd" }
-
-for _, lsp in ipairs(servers) do
- lspconfig[lsp].setup {
- on_attach = on_attach,
- capabilities = capabilities,
- }
-end
diff --git a/home/jack/.config/nvchad/configs/luasnip.lua b/home/jack/.config/nvchad/configs/luasnip.lua
deleted file mode 100644
index c8642e64..00000000
--- a/home/jack/.config/nvchad/configs/luasnip.lua
+++ /dev/null
@@ -1,54 +0,0 @@
-require("luasnip.loaders.from_vscode").load {
- exclude = {
- "cobol",
- "csharp",
- "css",
- "docker",
- "frameworks",
- "java",
- "javascript",
- "lua",
- "php",
- "PowerShell",
- "dart",
- "eelixir",
- "elixir",
- "erb",
- "erlang",
- "fennel",
- "fortran",
- "fsh",
- "gdscript",
- "gitcommit",
- "global",
- "glsl",
- "go",
- "haskell",
- "html",
- "julia",
- "kotlin",
- "kubernetes",
- "license",
- "liquid",
- "make",
- "mint",
- "norg",
- "nushell",
- "objc",
- "org",
- "plantuml",
- "quarto",
- "r",
- "rescript",
- "rmarkdown",
- "ruby",
- "scala",
- "solidity",
- "sql",
- "svelte",
- "swift",
- "systemverilog",
- "verilog",
- "vhdl",
- },
-}
diff --git a/home/jack/.config/nvchad/configs/null-ls.lua b/home/jack/.config/nvchad/configs/null-ls.lua
deleted file mode 100644
index 1b4b81a4..00000000
--- a/home/jack/.config/nvchad/configs/null-ls.lua
+++ /dev/null
@@ -1,37 +0,0 @@
-local present, null_ls = pcall(require, "null-ls")
-
-if not present then
- return
-end
-
-local b = null_ls.builtins
-
-local sources = {
- -- lua
- b.formatting.stylua,
-
- -- cpp
- b.formatting.clang_format,
-
- -- rust
- b.formatting.rustfmt,
-
- -- python
- b.formatting.black,
-
- -- latex
- b.formatting.latexindent,
-}
-
-null_ls.setup({
- debug = true,
- sources = sources,
-})
-
-local notify = vim.notify
-vim.notify = function(msg, ...)
- if msg:match("warning: multiple different client offset_encodings") then
- return
- end
- notify(msg, ...)
-end
diff --git a/home/jack/.config/nvchad/configs/overrides.lua b/home/jack/.config/nvchad/configs/overrides.lua
deleted file mode 100644
index 36d320b7..00000000
--- a/home/jack/.config/nvchad/configs/overrides.lua
+++ /dev/null
@@ -1,38 +0,0 @@
-local M = {}
-
-M.treesitter = {
- ensure_installed = {
- "vim",
- "cpp",
- "c",
- "markdown",
- "python",
- "rust"
- },
- indent = {
- enable = true,
- },
-}
-
-M.mason = {
- ensure_installed = {
- "clangd",
- "clang-format",
- },
-}
-
-M.nvimtree = {
- git = {
- enable = true,
- },
- renderer = {
- highlight_git = true,
- icons = {
- show = {
- git = true,
- },
- },
- },
-}
-
-return M
diff --git a/home/jack/.config/nvchad/configs/vimtex.lua b/home/jack/.config/nvchad/configs/vimtex.lua
deleted file mode 100644
index c25558d5..00000000
--- a/home/jack/.config/nvchad/configs/vimtex.lua
+++ /dev/null
@@ -1,5 +0,0 @@
-vim.g.tex_flavor='latex'
-vim.g.vimtex_view_method='zathura'
-vim.g.vimtex_quickfix_mode=0
-vim.opt.conceallevel = 1
-vim.g.tex_conceal='abdmg'
diff --git a/home/jack/.config/nvchad/plugins.lua b/home/jack/.config/nvchad/plugins.lua
deleted file mode 100644
index b51fcbf1..00000000
--- a/home/jack/.config/nvchad/plugins.lua
+++ /dev/null
@@ -1,63 +0,0 @@
-local overrides = require("custom.configs.overrides")
-
----@type NvPluginSpec[]
-local plugins = {
-
- {
- "neovim/nvim-lspconfig",
- dependencies = {
- {
- "jose-elias-alvarez/null-ls.nvim",
- config = function()
- require "custom.configs.null-ls"
- end,
- },
- },
- config = function()
- require "plugins.configs.lspconfig"
- require "custom.configs.lspconfig"
- end,
- },
-
- {
- "williamboman/mason.nvim",
- opts = overrides.mason
- },
-
- {
- "nvim-treesitter/nvim-treesitter",
- opts = overrides.treesitter,
- },
-
- {
- "nvim-tree/nvim-tree.lua",
- opts = overrides.nvimtree,
- },
-
- {
- "max397574/better-escape.nvim",
- event = "InsertEnter",
- config = function()
- require("better_escape").setup()
- end,
- },
-
- {
- "lervag/vimtex",
- lazy = false,
- config = function()
- require("custom.configs.vimtex")
- end,
- },
-
- {
- "L3MON4D3/LuaSnip",
- dependencies = { "rafamadriz/friendly-snippets" },
- config = function()
- require("custom.configs.luasnip")
- end,
- lazy = false,
- },
-}
-
-return plugins
diff --git a/home/jack/.config/starship.toml b/home/jack/.config/starship.toml
index 2dad1182..caf625b4 100644
--- a/home/jack/.config/starship.toml
+++ b/home/jack/.config/starship.toml
@@ -16,3 +16,5 @@ disabled = true
disabled = true
[c]
disabled = true
+[rlang]
+disabled = true
diff --git a/home/jack/.gdbinit b/home/jack/.gdbinit
new file mode 100644
index 00000000..5e6c6cb8
--- /dev/null
+++ b/home/jack/.gdbinit
@@ -0,0 +1,2382 @@
+python
+
+# GDB dashboard - Modular visual interface for GDB in Python.
+#
+# https://github.com/cyrus-and/gdb-dashboard
+
+# License ----------------------------------------------------------------------
+
+# Copyright (c) 2015-2024 Andrea Cardaci <[email protected]>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+# Imports ----------------------------------------------------------------------
+
+import ast
+import io
+import itertools
+import math
+import os
+import re
+import struct
+import traceback
+
+# Common attributes ------------------------------------------------------------
+
+class R():
+
+ @staticmethod
+ def attributes():
+ return {
+ # miscellaneous
+ 'ansi': {
+ 'doc': 'Control the ANSI output of the dashboard.',
+ 'default': True,
+ 'type': bool
+ },
+ 'syntax_highlighting': {
+ 'doc': '''Pygments style to use for syntax highlighting.
+
+Using an empty string (or a name not in the list) disables this feature. The
+list of all the available styles can be obtained with (from GDB itself):
+
+ python from pygments.styles import *
+ python for style in get_all_styles(): print(style)''',
+ 'default': 'monokai'
+ },
+ 'discard_scrollback': {
+ 'doc': '''Discard the scrollback buffer at each redraw.
+
+This makes scrolling less confusing by discarding the previously printed
+dashboards but only works with certain terminals.''',
+ 'default': True,
+ 'type': bool
+ },
+ # values formatting
+ 'compact_values': {
+ 'doc': 'Display complex objects in a single line.',
+ 'default': True,
+ 'type': bool
+ },
+ 'max_value_length': {
+ 'doc': 'Maximum length of displayed values before truncation.',
+ 'default': 100,
+ 'type': int
+ },
+ 'value_truncation_string': {
+ 'doc': 'String to use to mark value truncation.',
+ 'default': 'โ€ฆ',
+ },
+ 'dereference': {
+ 'doc': 'Annotate pointers with the pointed value.',
+ 'default': True,
+ 'type': bool
+ },
+ # prompt
+ 'prompt': {
+ 'doc': '''GDB prompt.
+
+This value is used as a Python format string where `{status}` is expanded with
+the substitution of either `prompt_running` or `prompt_not_running` attributes,
+according to the target program status. The resulting string must be a valid GDB
+prompt, see the command `python print(gdb.prompt.prompt_help())`''',
+ 'default': '{status}'
+ },
+ 'prompt_running': {
+ 'doc': '''Define the value of `{status}` when the target program is running.
+
+See the `prompt` attribute. This value is used as a Python format string where
+`{pid}` is expanded with the process identifier of the target program.''',
+ 'default': r'\[\e[1;35m\]>>>\[\e[0m\]'
+ },
+ 'prompt_not_running': {
+ 'doc': '''Define the value of `{status}` when the target program is running.
+
+See the `prompt` attribute. This value is used as a Python format string.''',
+ 'default': r'\[\e[90m\]>>>\[\e[0m\]'
+ },
+ # divider
+ 'omit_divider': {
+ 'doc': 'Omit the divider in external outputs when only one module is displayed.',
+ 'default': False,
+ 'type': bool
+ },
+ 'divider_fill_char_primary': {
+ 'doc': 'Filler around the label for primary dividers',
+ 'default': 'โ”€'
+ },
+ 'divider_fill_char_secondary': {
+ 'doc': 'Filler around the label for secondary dividers',
+ 'default': 'โ”€'
+ },
+ 'divider_fill_style_primary': {
+ 'doc': 'Style for `divider_fill_char_primary`',
+ 'default': '36'
+ },
+ 'divider_fill_style_secondary': {
+ 'doc': 'Style for `divider_fill_char_secondary`',
+ 'default': '90'
+ },
+ 'divider_label_style_on_primary': {
+ 'doc': 'Label style for non-empty primary dividers',
+ 'default': '1;33'
+ },
+ 'divider_label_style_on_secondary': {
+ 'doc': 'Label style for non-empty secondary dividers',
+ 'default': '1;37'
+ },
+ 'divider_label_style_off_primary': {
+ 'doc': 'Label style for empty primary dividers',
+ 'default': '33'
+ },
+ 'divider_label_style_off_secondary': {
+ 'doc': 'Label style for empty secondary dividers',
+ 'default': '90'
+ },
+ 'divider_label_skip': {
+ 'doc': 'Gap between the aligning border and the label.',
+ 'default': 3,
+ 'type': int,
+ 'check': check_ge_zero
+ },
+ 'divider_label_margin': {
+ 'doc': 'Number of spaces around the label.',
+ 'default': 1,
+ 'type': int,
+ 'check': check_ge_zero
+ },
+ 'divider_label_align_right': {
+ 'doc': 'Label alignment flag.',
+ 'default': False,
+ 'type': bool
+ },
+ # common styles
+ 'style_selected_1': {
+ 'default': '1;32'
+ },
+ 'style_selected_2': {
+ 'default': '32'
+ },
+ 'style_low': {
+ 'default': '90'
+ },
+ 'style_high': {
+ 'default': '1;37'
+ },
+ 'style_error': {
+ 'default': '31'
+ },
+ 'style_critical': {
+ 'default': '0;41'
+ }
+ }
+
+# Common -----------------------------------------------------------------------
+
+class Beautifier():
+
+ def __init__(self, hint, tab_size=4):
+ self.tab_spaces = ' ' * tab_size if tab_size else None
+ self.active = False
+ if not R.ansi or not R.syntax_highlighting:
+ return
+ # attempt to set up Pygments
+ try:
+ import pygments
+ from pygments.lexers import GasLexer, NasmLexer
+ from pygments.formatters import Terminal256Formatter
+ if hint == 'att':
+ self.lexer = GasLexer()
+ elif hint == 'intel':
+ self.lexer = NasmLexer()
+ else:
+ from pygments.lexers import get_lexer_for_filename
+ self.lexer = get_lexer_for_filename(hint, stripnl=False)
+ self.formatter = Terminal256Formatter(style=R.syntax_highlighting)
+ self.active = True
+ except ImportError:
+ # Pygments not available
+ pass
+ except pygments.util.ClassNotFound:
+ # no lexer for this file or invalid style
+ pass
+
+ def process(self, source):
+ # convert tabs if requested
+ if self.tab_spaces:
+ source = source.replace('\t', self.tab_spaces)
+ if self.active:
+ import pygments
+ source = pygments.highlight(source, self.lexer, self.formatter)
+ return source.rstrip('\n')
+
+def run(command):
+ return gdb.execute(command, to_string=True)
+
+def ansi(string, style):
+ if R.ansi:
+ return '\x1b[{}m{}\x1b[0m'.format(style, string)
+ else:
+ return string
+
+def divider(width, label='', primary=False, active=True):
+ if primary:
+ divider_fill_style = R.divider_fill_style_primary
+ divider_fill_char = R.divider_fill_char_primary
+ divider_label_style_on = R.divider_label_style_on_primary
+ divider_label_style_off = R.divider_label_style_off_primary
+ else:
+ divider_fill_style = R.divider_fill_style_secondary
+ divider_fill_char = R.divider_fill_char_secondary
+ divider_label_style_on = R.divider_label_style_on_secondary
+ divider_label_style_off = R.divider_label_style_off_secondary
+ if label:
+ if active:
+ divider_label_style = divider_label_style_on
+ else:
+ divider_label_style = divider_label_style_off
+ skip = R.divider_label_skip
+ margin = R.divider_label_margin
+ before = ansi(divider_fill_char * skip, divider_fill_style)
+ middle = ansi(label, divider_label_style)
+ after_length = width - len(label) - skip - 2 * margin
+ after = ansi(divider_fill_char * after_length, divider_fill_style)
+ if R.divider_label_align_right:
+ before, after = after, before
+ return ''.join([before, ' ' * margin, middle, ' ' * margin, after])
+ else:
+ return ansi(divider_fill_char * width, divider_fill_style)
+
+def check_gt_zero(x):
+ return x > 0
+
+def check_ge_zero(x):
+ return x >= 0
+
+def to_unsigned(value, size=8):
+ # values from GDB can be used transparently but are not suitable for
+ # being printed as unsigned integers, so a conversion is needed
+ mask = (2 ** (size * 8)) - 1
+ return int(value.cast(gdb.Value(mask).type)) & mask
+
+def to_string(value):
+ # attempt to convert an inferior value to string; OK when (Python 3 ||
+ # simple ASCII); otherwise (Python 2.7 && not ASCII) encode the string as
+ # utf8
+ try:
+ value_string = str(value)
+ except UnicodeEncodeError:
+ value_string = unicode(value).encode('utf8')
+ except gdb.error as e:
+ value_string = ansi(e, R.style_error)
+ return value_string
+
+def format_address(address):
+ pointer_size = gdb.parse_and_eval('$pc').type.sizeof
+ return ('0x{{:0{}x}}').format(pointer_size * 2).format(address)
+
+def format_value(value, compact=None):
+ # format references as referenced values
+ # (TYPE_CODE_RVALUE_REF is not supported by old GDB)
+ if value.type.code in (getattr(gdb, 'TYPE_CODE_REF', None),
+ getattr(gdb, 'TYPE_CODE_RVALUE_REF', None)):
+ try:
+ value = value.referenced_value()
+ except gdb.error as e:
+ return ansi(e, R.style_error)
+ # format the value
+ out = to_string(value)
+ # dereference up to the actual value if requested
+ if R.dereference and value.type.code == gdb.TYPE_CODE_PTR:
+ while value.type.code == gdb.TYPE_CODE_PTR:
+ try:
+ value = value.dereference()
+ except gdb.error as e:
+ break
+ else:
+ formatted = to_string(value)
+ out += '{} {}'.format(ansi(':', R.style_low), formatted)
+ # compact the value
+ if compact is not None and compact or R.compact_values:
+ out = re.sub(r'$\s*', '', out, flags=re.MULTILINE)
+ # truncate the value
+ if R.max_value_length > 0 and len(out) > R.max_value_length:
+ out = out[0:R.max_value_length] + ansi(R.value_truncation_string, R.style_critical)
+ return out
+
+# XXX parsing the output of `info breakpoints` is apparently the best option
+# right now, see: https://sourceware.org/bugzilla/show_bug.cgi?id=18385
+# XXX GDB version 7.11 (quire recent) does not have the pending field, so
+# fall back to the parsed information
+def fetch_breakpoints(watchpoints=False, pending=False):
+ # fetch breakpoints addresses
+ parsed_breakpoints = dict()
+ catch_what_regex = re.compile(r'([^,]+".*")?[^,]*')
+ for line in run('info breakpoints').split('\n'):
+ # just keep numbered lines
+ if not line or not line[0].isdigit():
+ continue
+ # extract breakpoint number, address and pending status
+ fields = line.split()
+ number = int(fields[0].split('.')[0])
+ try:
+ if len(fields) >= 5 and fields[1] == 'breakpoint':
+ # multiple breakpoints have no address yet
+ is_pending = fields[4] == '<PENDING>'
+ is_multiple = fields[4] == '<MULTIPLE>'
+ address = None if is_multiple or is_pending else int(fields[4], 16)
+ is_enabled = fields[3] == 'y'
+ address_info = address, is_enabled
+ parsed_breakpoints[number] = [address_info], is_pending, ''
+ elif len(fields) >= 5 and fields[1] == 'catchpoint':
+ # only take before comma, but ignore commas in quotes
+ what = catch_what_regex.search(' '.join(fields[4:]))[0].strip()
+ parsed_breakpoints[number] = [], False, what
+ elif len(fields) >= 3 and number in parsed_breakpoints:
+ # add this address to the list of multiple locations
+ address = int(fields[2], 16)
+ is_enabled = fields[1] == 'y'
+ address_info = address, is_enabled
+ parsed_breakpoints[number][0].append(address_info)
+ else:
+ # watchpoints
+ parsed_breakpoints[number] = [], False, ''
+ except ValueError:
+ pass
+ # fetch breakpoints from the API and complement with address and source
+ # information
+ breakpoints = []
+ # XXX in older versions gdb.breakpoints() returns None
+ for gdb_breakpoint in gdb.breakpoints() or []:
+ # skip internal breakpoints
+ if gdb_breakpoint.number < 0:
+ continue
+ addresses, is_pending, what = parsed_breakpoints[gdb_breakpoint.number]
+ is_pending = getattr(gdb_breakpoint, 'pending', is_pending)
+ if not pending and is_pending:
+ continue
+ if not watchpoints and gdb_breakpoint.type != gdb.BP_BREAKPOINT:
+ continue
+ # add useful fields to the object
+ breakpoint = dict()
+ breakpoint['number'] = gdb_breakpoint.number
+ breakpoint['type'] = gdb_breakpoint.type
+ breakpoint['enabled'] = gdb_breakpoint.enabled
+ breakpoint['location'] = gdb_breakpoint.location
+ breakpoint['expression'] = gdb_breakpoint.expression
+ breakpoint['condition'] = gdb_breakpoint.condition
+ breakpoint['temporary'] = gdb_breakpoint.temporary
+ breakpoint['hit_count'] = gdb_breakpoint.hit_count
+ breakpoint['pending'] = is_pending
+ breakpoint['what'] = what
+ # add addresses and source information
+ breakpoint['addresses'] = []
+ for address, is_enabled in addresses:
+ if address:
+ sal = gdb.find_pc_line(address)
+ breakpoint['addresses'].append({
+ 'address': address,
+ 'enabled': is_enabled,
+ 'file_name': sal.symtab.filename if address and sal.symtab else None,
+ 'file_line': sal.line if address else None
+ })
+ breakpoints.append(breakpoint)
+ return breakpoints
+
+# Dashboard --------------------------------------------------------------------
+
+class Dashboard(gdb.Command):
+ '''Redisplay the dashboard.'''
+
+ def __init__(self):
+ gdb.Command.__init__(self, 'dashboard', gdb.COMMAND_USER, gdb.COMPLETE_NONE, True)
+ # setup subcommands
+ Dashboard.ConfigurationCommand(self)
+ Dashboard.OutputCommand(self)
+ Dashboard.EnabledCommand(self)
+ Dashboard.LayoutCommand(self)
+ # setup style commands
+ Dashboard.StyleCommand(self, 'dashboard', R, R.attributes())
+ # main terminal
+ self.output = None
+ # used to inhibit redisplays during init parsing
+ self.inhibited = None
+ # enabled by default
+ self.enabled = None
+ self.enable()
+
+ def on_continue(self, _):
+ # try to contain the GDB messages in a specified area unless the
+ # dashboard is printed to a separate file (dashboard -output ...)
+ # or there are no modules to display in the main terminal
+ enabled_modules = list(filter(lambda m: not m.output and m.enabled, self.modules))
+ if self.is_running() and not self.output and len(enabled_modules) > 0:
+ width, _ = Dashboard.get_term_size()
+ gdb.write(Dashboard.clear_screen())
+ gdb.write(divider(width, 'Output/messages', True))
+ gdb.write('\n')
+ gdb.flush()
+
+ def on_stop(self, _):
+ if self.is_running():
+ self.render(clear_screen=False)
+
+ def on_exit(self, _):
+ if not self.is_running():
+ return
+ # collect all the outputs
+ outputs = set()
+ outputs.add(self.output)
+ outputs.update(module.output for module in self.modules)
+ outputs.remove(None)
+ # reset the terminal status
+ for output in outputs:
+ try:
+ with open(output, 'w') as fs:
+ fs.write(Dashboard.reset_terminal())
+ except:
+ # skip cleanup for invalid outputs
+ pass
+
+ def enable(self):
+ if self.enabled:
+ return
+ self.enabled = True
+ # setup events
+ gdb.events.cont.connect(self.on_continue)
+ gdb.events.stop.connect(self.on_stop)
+ gdb.events.exited.connect(self.on_exit)
+
+ def disable(self):
+ if not self.enabled:
+ return
+ self.enabled = False
+ # setup events
+ gdb.events.cont.disconnect(self.on_continue)
+ gdb.events.stop.disconnect(self.on_stop)
+ gdb.events.exited.disconnect(self.on_exit)
+
+ def load_modules(self, modules):
+ self.modules = []
+ for module in modules:
+ info = Dashboard.ModuleInfo(self, module)
+ self.modules.append(info)
+
+ def redisplay(self, style_changed=False):
+ # manually redisplay the dashboard
+ if self.is_running() and not self.inhibited:
+ self.render(True, style_changed)
+
+ def inferior_pid(self):
+ return gdb.selected_inferior().pid
+
+ def is_running(self):
+ return self.inferior_pid() != 0
+
+ def render(self, clear_screen, style_changed=False):
+ # fetch module content and info
+ all_disabled = True
+ display_map = dict()
+ for module in self.modules:
+ # fall back to the global value
+ output = module.output or self.output
+ # add the instance or None if disabled
+ if module.enabled:
+ all_disabled = False
+ instance = module.instance
+ else:
+ instance = None
+ display_map.setdefault(output, []).append(instance)
+ # process each display info
+ for output, instances in display_map.items():
+ try:
+ buf = ''
+ # use GDB stream by default
+ fs = None
+ if output:
+ fs = open(output, 'w')
+ fd = fs.fileno()
+ fs.write(Dashboard.setup_terminal())
+ else:
+ fs = gdb
+ fd = 1 # stdout
+ # get the terminal size (default main terminal if either the
+ # output is not a file)
+ try:
+ width, height = Dashboard.get_term_size(fd)
+ except:
+ width, height = Dashboard.get_term_size()
+ # clear the "screen" if requested for the main terminal,
+ # auxiliary terminals are always cleared
+ if fs is not gdb or clear_screen:
+ buf += Dashboard.clear_screen()
+ # show message if all the modules in this output are disabled
+ if not any(instances):
+ # skip the main terminal
+ if fs is gdb:
+ continue
+ # write the error message
+ buf += divider(width, 'Warning', True)
+ buf += '\n'
+ if self.modules:
+ buf += 'No module to display (see `dashboard -layout`)'
+ else:
+ buf += 'No module loaded'
+ buf += '\n'
+ fs.write(buf)
+ continue
+ # process all the modules for that output
+ for n, instance in enumerate(instances, 1):
+ # skip disabled modules
+ if not instance:
+ continue
+ try:
+ # ask the module to generate the content
+ lines = instance.lines(width, height, style_changed)
+ except Exception as e:
+ # allow to continue on exceptions in modules
+ stacktrace = traceback.format_exc().strip()
+ lines = [ansi(stacktrace, R.style_error)]
+ # create the divider if needed
+ div = []
+ if not R.omit_divider or len(instances) > 1 or fs is gdb:
+ div = [divider(width, instance.label(), True, lines)]
+ # write the data
+ buf += '\n'.join(div + lines)
+ # write the newline for all but last unless main terminal
+ if n != len(instances) or fs is gdb:
+ buf += '\n'
+ # write the final newline and the terminator only if it is the
+ # main terminal to allow the prompt to display correctly (unless
+ # there are no modules to display)
+ if fs is gdb and not all_disabled:
+ buf += divider(width, primary=True)
+ buf += '\n'
+ fs.write(buf)
+ except Exception as e:
+ cause = traceback.format_exc().strip()
+ Dashboard.err('Cannot write the dashboard\n{}'.format(cause))
+ finally:
+ # don't close gdb stream
+ if fs and fs is not gdb:
+ fs.close()
+
+# Utility methods --------------------------------------------------------------
+
+ @staticmethod
+ def start():
+ # save the instance for customization convenience
+ global dashboard
+ # initialize the dashboard
+ dashboard = Dashboard()
+ Dashboard.set_custom_prompt(dashboard)
+ # parse Python inits, load modules then parse GDB inits
+ dashboard.inhibited = True
+ Dashboard.parse_inits(True)
+ modules = Dashboard.get_modules()
+ dashboard.load_modules(modules)
+ Dashboard.parse_inits(False)
+ dashboard.inhibited = False
+ # GDB overrides
+ run('set pagination off')
+ # display if possible (program running and not explicitly disabled by
+ # some configuration file)
+ if dashboard.enabled:
+ dashboard.redisplay()
+
+ @staticmethod
+ def get_term_size(fd=1): # defaults to the main terminal
+ try:
+ if sys.platform == 'win32':
+ import curses
+ # XXX always neglects the fd parameter
+ height, width = curses.initscr().getmaxyx()
+ curses.endwin()
+ return int(width), int(height)
+ else:
+ import termios
+ import fcntl
+ # first 2 shorts (4 byte) of struct winsize
+ raw = fcntl.ioctl(fd, termios.TIOCGWINSZ, ' ' * 4)
+ height, width = struct.unpack('hh', raw)
+ return int(width), int(height)
+ except (ImportError, OSError):
+ # this happens when no curses library is found on windows or when
+ # the terminal is not properly configured
+ return 80, 24 # hardcoded fallback value
+
+ @staticmethod
+ def set_custom_prompt(dashboard):
+ def custom_prompt(_):
+ # render thread status indicator
+ if dashboard.is_running():
+ pid = dashboard.inferior_pid()
+ status = R.prompt_running.format(pid=pid)
+ else:
+ status = R.prompt_not_running
+ # build prompt
+ prompt = R.prompt.format(status=status)
+ prompt = gdb.prompt.substitute_prompt(prompt)
+ return prompt + ' ' # force trailing space
+ gdb.prompt_hook = custom_prompt
+
+ @staticmethod
+ def parse_inits(python):
+ # paths where the .gdbinit.d directory might be
+ search_paths = [
+ '/etc/gdb-dashboard',
+ '{}/gdb-dashboard'.format(os.getenv('XDG_CONFIG_HOME', '~/.config')),
+ '~/Library/Preferences/gdb-dashboard',
+ '~/.gdbinit.d'
+ ]
+ # expand the tilde and walk the paths
+ inits_dirs = (os.walk(os.path.expanduser(path)) for path in search_paths)
+ # process all the init files in order
+ for root, dirs, files in itertools.chain.from_iterable(inits_dirs):
+ dirs.sort()
+ # skipping dotfiles
+ for init in sorted(file for file in files if not file.startswith('.')):
+ path = os.path.join(root, init)
+ _, ext = os.path.splitext(path)
+ # either load Python files or GDB
+ if python == (ext == '.py'):
+ gdb.execute('source ' + path)
+
+ @staticmethod
+ def get_modules():
+ # scan the scope for modules
+ modules = []
+ for name in globals():
+ obj = globals()[name]
+ try:
+ if issubclass(obj, Dashboard.Module):
+ modules.append(obj)
+ except TypeError:
+ continue
+ # sort modules alphabetically
+ modules.sort(key=lambda x: x.__name__)
+ return modules
+
+ @staticmethod
+ def create_command(name, invoke, doc, is_prefix, complete=None):
+ if callable(complete):
+ Class = type('', (gdb.Command,), {
+ '__doc__': doc,
+ 'invoke': invoke,
+ 'complete': complete
+ })
+ Class(name, gdb.COMMAND_USER, prefix=is_prefix)
+ else:
+ Class = type('', (gdb.Command,), {
+ '__doc__': doc,
+ 'invoke': invoke
+ })
+ Class(name, gdb.COMMAND_USER, complete or gdb.COMPLETE_NONE, is_prefix)
+
+ @staticmethod
+ def err(string):
+ print(ansi(string, R.style_error))
+
+ @staticmethod
+ def complete(word, candidates):
+ return filter(lambda candidate: candidate.startswith(word), candidates)
+
+ @staticmethod
+ def parse_arg(arg):
+ # encode unicode GDB command arguments as utf8 in Python 2.7
+ if type(arg) is not str:
+ arg = arg.encode('utf8')
+ return arg
+
+ @staticmethod
+ def clear_screen():
+ # ANSI: move the cursor to top-left corner and clear the screen
+ # (optionally also clear the scrollback buffer if supported by the
+ # terminal)
+ return '\x1b[H\x1b[2J' + ('\x1b[3J' if R.discard_scrollback else '')
+
+ @staticmethod
+ def setup_terminal():
+ # ANSI: enable alternative screen buffer and hide cursor
+ return '\x1b[?1049h\x1b[?25l'
+
+ @staticmethod
+ def reset_terminal():
+ # ANSI: disable alternative screen buffer and show cursor
+ return '\x1b[?1049l\x1b[?25h'
+
+# Module descriptor ------------------------------------------------------------
+
+ class ModuleInfo:
+
+ def __init__(self, dashboard, module):
+ self.name = module.__name__.lower() # from class to module name
+ self.enabled = True
+ self.output = None # value from the dashboard by default
+ self.instance = module()
+ self.doc = self.instance.__doc__ or '(no documentation)'
+ self.prefix = 'dashboard {}'.format(self.name)
+ # add GDB commands
+ self.add_main_command(dashboard)
+ self.add_output_command(dashboard)
+ self.add_style_command(dashboard)
+ self.add_subcommands(dashboard)
+
+ def add_main_command(self, dashboard):
+ module = self
+ def invoke(self, arg, from_tty, info=self):
+ arg = Dashboard.parse_arg(arg)
+ if arg == '':
+ info.enabled ^= True
+ if dashboard.is_running():
+ dashboard.redisplay()
+ else:
+ status = 'enabled' if info.enabled else 'disabled'
+ print('{} module {}'.format(module.name, status))
+ else:
+ Dashboard.err('Wrong argument "{}"'.format(arg))
+ doc_brief = 'Configure the {} module, with no arguments toggles its visibility.'.format(self.name)
+ doc = '{}\n\n{}'.format(doc_brief, self.doc)
+ Dashboard.create_command(self.prefix, invoke, doc, True)
+
+ def add_output_command(self, dashboard):
+ Dashboard.OutputCommand(dashboard, self.prefix, self)
+
+ def add_style_command(self, dashboard):
+ Dashboard.StyleCommand(dashboard, self.prefix, self.instance, self.instance.attributes())
+
+ def add_subcommands(self, dashboard):
+ for name, command in self.instance.commands().items():
+ self.add_subcommand(dashboard, name, command)
+
+ def add_subcommand(self, dashboard, name, command):
+ action = command['action']
+ doc = command['doc']
+ complete = command.get('complete')
+ def invoke(self, arg, from_tty, info=self):
+ arg = Dashboard.parse_arg(arg)
+ if info.enabled:
+ try:
+ action(arg)
+ except Exception as e:
+ Dashboard.err(e)
+ return
+ # don't catch redisplay errors
+ dashboard.redisplay()
+ else:
+ Dashboard.err('Module disabled')
+ prefix = '{} {}'.format(self.prefix, name)
+ Dashboard.create_command(prefix, invoke, doc, False, complete)
+
+# GDB commands -----------------------------------------------------------------
+
+ # handler for the `dashboard` command itself
+ def invoke(self, arg, from_tty):
+ arg = Dashboard.parse_arg(arg)
+ # show messages for checks in redisplay
+ if arg != '':
+ Dashboard.err('Wrong argument "{}"'.format(arg))
+ elif not self.is_running():
+ Dashboard.err('Is the target program running?')
+ else:
+ self.redisplay()
+
+ class ConfigurationCommand(gdb.Command):
+ '''Dump or save the dashboard configuration.
+
+With an optional argument the configuration will be written to the specified
+file.
+
+This command allows to configure the dashboard live then make the changes
+permanent, for example:
+
+ dashboard -configuration ~/.gdbinit.d/init
+
+At startup the `~/.gdbinit.d/` directory tree is walked and files are evaluated
+in alphabetical order but giving priority to Python files. This is where user
+configuration files must be placed.'''
+
+ def __init__(self, dashboard):
+ gdb.Command.__init__(self, 'dashboard -configuration',
+ gdb.COMMAND_USER, gdb.COMPLETE_FILENAME)
+ self.dashboard = dashboard
+
+ def invoke(self, arg, from_tty):
+ arg = Dashboard.parse_arg(arg)
+ if arg:
+ with open(os.path.expanduser(arg), 'w') as fs:
+ fs.write('# auto generated by GDB dashboard\n\n')
+ self.dump(fs)
+ self.dump(gdb)
+
+ def dump(self, fs):
+ # dump layout
+ self.dump_layout(fs)
+ # dump styles
+ self.dump_style(fs, R)
+ for module in self.dashboard.modules:
+ self.dump_style(fs, module.instance, module.prefix)
+ # dump outputs
+ self.dump_output(fs, self.dashboard)
+ for module in self.dashboard.modules:
+ self.dump_output(fs, module, module.prefix)
+
+ def dump_layout(self, fs):
+ layout = ['dashboard -layout']
+ for module in self.dashboard.modules:
+ mark = '' if module.enabled else '!'
+ layout.append('{}{}'.format(mark, module.name))
+ fs.write(' '.join(layout))
+ fs.write('\n')
+
+ def dump_style(self, fs, obj, prefix='dashboard'):
+ attributes = getattr(obj, 'attributes', lambda: dict())()
+ for name, attribute in attributes.items():
+ real_name = attribute.get('name', name)
+ default = attribute.get('default')
+ value = getattr(obj, real_name)
+ if value != default:
+ fs.write('{} -style {} {!r}\n'.format(prefix, name, value))
+
+ def dump_output(self, fs, obj, prefix='dashboard'):
+ output = getattr(obj, 'output')
+ if output:
+ fs.write('{} -output {}\n'.format(prefix, output))
+
+ class OutputCommand(gdb.Command):
+ '''Set the output file/TTY for the whole dashboard or single modules.
+
+The dashboard/module will be written to the specified file, which will be
+created if it does not exist. If the specified file identifies a terminal then
+its geometry will be used, otherwise it falls back to the geometry of the main
+GDB terminal.
+
+When invoked without argument on the dashboard, the output/messages and modules
+which do not specify an output themselves will be printed on standard output
+(default).
+
+When invoked without argument on a module, it will be printed where the
+dashboard will be printed.
+
+An overview of all the outputs can be obtained with the `dashboard -layout`
+command.'''
+
+ def __init__(self, dashboard, prefix=None, obj=None):
+ if not prefix:
+ prefix = 'dashboard'
+ if not obj:
+ obj = dashboard
+ prefix = prefix + ' -output'
+ gdb.Command.__init__(self, prefix, gdb.COMMAND_USER, gdb.COMPLETE_FILENAME)
+ self.dashboard = dashboard
+ self.obj = obj # None means the dashboard itself
+
+ def invoke(self, arg, from_tty):
+ arg = Dashboard.parse_arg(arg)
+ # reset the terminal status
+ if self.obj.output:
+ try:
+ with open(self.obj.output, 'w') as fs:
+ fs.write(Dashboard.reset_terminal())
+ except:
+ # just do nothing if the file is not writable
+ pass
+ # set or open the output file
+ if arg == '':
+ self.obj.output = None
+ else:
+ self.obj.output = arg
+ # redisplay the dashboard in the new output
+ self.dashboard.redisplay()
+
+ class EnabledCommand(gdb.Command):
+ '''Enable or disable the dashboard.
+
+The current status is printed if no argument is present.'''
+
+ def __init__(self, dashboard):
+ gdb.Command.__init__(self, 'dashboard -enabled', gdb.COMMAND_USER)
+ self.dashboard = dashboard
+
+ def invoke(self, arg, from_tty):
+ arg = Dashboard.parse_arg(arg)
+ if arg == '':
+ status = 'enabled' if self.dashboard.enabled else 'disabled'
+ print('The dashboard is {}'.format(status))
+ elif arg == 'on':
+ self.dashboard.enable()
+ self.dashboard.redisplay()
+ elif arg == 'off':
+ self.dashboard.disable()
+ else:
+ msg = 'Wrong argument "{}"; expecting "on" or "off"'
+ Dashboard.err(msg.format(arg))
+
+ def complete(self, text, word):
+ return Dashboard.complete(word, ['on', 'off'])
+
+ class LayoutCommand(gdb.Command):
+ '''Set or show the dashboard layout.
+
+Accepts a space-separated list of directive. Each directive is in the form
+"[!]<module>". Modules in the list are placed in the dashboard in the same order
+as they appear and those prefixed by "!" are disabled by default. Omitted
+modules are hidden and placed at the bottom in alphabetical order.
+
+Without arguments the current layout is shown where the first line uses the same
+form expected by the input while the remaining depict the current status of
+output files.
+
+Passing `!` as a single argument resets the dashboard original layout.'''
+
+ def __init__(self, dashboard):
+ gdb.Command.__init__(self, 'dashboard -layout', gdb.COMMAND_USER)
+ self.dashboard = dashboard
+
+ def invoke(self, arg, from_tty):
+ arg = Dashboard.parse_arg(arg)
+ directives = str(arg).split()
+ if directives:
+ # apply the layout
+ if directives == ['!']:
+ self.reset()
+ else:
+ if not self.layout(directives):
+ return # in case of errors
+ # redisplay or otherwise notify
+ if from_tty:
+ if self.dashboard.is_running():
+ self.dashboard.redisplay()
+ else:
+ self.show()
+ else:
+ self.show()
+
+ def reset(self):
+ modules = self.dashboard.modules
+ modules.sort(key=lambda module: module.name)
+ for module in modules:
+ module.enabled = True
+
+ def show(self):
+ global_str = 'Dashboard'
+ default = '(default TTY)'
+ max_name_len = max(len(module.name) for module in self.dashboard.modules)
+ max_name_len = max(max_name_len, len(global_str))
+ fmt = '{{}}{{:{}s}}{{}}'.format(max_name_len + 2)
+ print((fmt + '\n').format(' ', global_str, self.dashboard.output or default))
+ for module in self.dashboard.modules:
+ mark = ' ' if module.enabled else '!'
+ style = R.style_high if module.enabled else R.style_low
+ line = fmt.format(mark, module.name, module.output or default)
+ print(ansi(line, style))
+
+ def layout(self, directives):
+ modules = self.dashboard.modules
+ # parse and check directives
+ parsed_directives = []
+ selected_modules = set()
+ for directive in directives:
+ enabled = (directive[0] != '!')
+ name = directive[not enabled:]
+ if name in selected_modules:
+ Dashboard.err('Module "{}" already set'.format(name))
+ return False
+ if next((False for module in modules if module.name == name), True):
+ Dashboard.err('Cannot find module "{}"'.format(name))
+ return False
+ parsed_directives.append((name, enabled))
+ selected_modules.add(name)
+ # reset visibility
+ for module in modules:
+ module.enabled = False
+ # move and enable the selected modules on top
+ last = 0
+ for name, enabled in parsed_directives:
+ todo = enumerate(modules[last:], start=last)
+ index = next(index for index, module in todo if name == module.name)
+ modules[index].enabled = enabled
+ modules.insert(last, modules.pop(index))
+ last += 1
+ return True
+
+ def complete(self, text, word):
+ all_modules = (m.name for m in self.dashboard.modules)
+ return Dashboard.complete(word, all_modules)
+
+ class StyleCommand(gdb.Command):
+ '''Access the stylable attributes.
+
+Without arguments print all the stylable attributes.
+
+When only the name is specified show the current value.
+
+With name and value set the stylable attribute. Values are parsed as Python
+literals and converted to the proper type. '''
+
+ def __init__(self, dashboard, prefix, obj, attributes):
+ self.prefix = prefix + ' -style'
+ gdb.Command.__init__(self, self.prefix, gdb.COMMAND_USER, gdb.COMPLETE_NONE, True)
+ self.dashboard = dashboard
+ self.obj = obj
+ self.attributes = attributes
+ self.add_styles()
+
+ def add_styles(self):
+ this = self
+ for name, attribute in self.attributes.items():
+ # fetch fields
+ attr_name = attribute.get('name', name)
+ attr_type = attribute.get('type', str)
+ attr_check = attribute.get('check', lambda _: True)
+ attr_default = attribute['default']
+ # set the default value (coerced to the type)
+ value = attr_type(attr_default)
+ setattr(self.obj, attr_name, value)
+ # create the command
+ def invoke(self, arg, from_tty,
+ name=name,
+ attr_name=attr_name,
+ attr_type=attr_type,
+ attr_check=attr_check):
+ new_value = Dashboard.parse_arg(arg)
+ if new_value == '':
+ # print the current value
+ value = getattr(this.obj, attr_name)
+ print('{} = {!r}'.format(name, value))
+ else:
+ try:
+ # convert and check the new value
+ parsed = ast.literal_eval(new_value)
+ value = attr_type(parsed)
+ if not attr_check(value):
+ msg = 'Invalid value "{}" for "{}"'
+ raise Exception(msg.format(new_value, name))
+ except Exception as e:
+ Dashboard.err(e)
+ else:
+ # set and redisplay
+ setattr(this.obj, attr_name, value)
+ this.dashboard.redisplay(True)
+ prefix = self.prefix + ' ' + name
+ doc = attribute.get('doc', 'This style is self-documenting')
+ Dashboard.create_command(prefix, invoke, doc, False)
+
+ def invoke(self, arg, from_tty):
+ # an argument here means that the provided attribute is invalid
+ if arg:
+ Dashboard.err('Invalid argument "{}"'.format(arg))
+ return
+ # print all the pairs
+ for name, attribute in self.attributes.items():
+ attr_name = attribute.get('name', name)
+ value = getattr(self.obj, attr_name)
+ print('{} = {!r}'.format(name, value))
+
+# Base module ------------------------------------------------------------------
+
+ # just a tag
+ class Module():
+ '''Base class for GDB dashboard modules.
+
+ Modules are instantiated once at initialization time and kept during the
+ whole the GDB session.
+
+ The name of a module is automatically obtained by the class name.
+
+ Optionally, a module may include a description which will appear in the
+ GDB help system by specifying a Python docstring for the class. By
+ convention the first line should contain a brief description.'''
+
+ def label(self):
+ '''Return the module label which will appear in the divider.'''
+ pass
+
+ def lines(self, term_width, term_height, style_changed):
+ '''Return a list of strings which will form the module content.
+
+ When a module is temporarily unable to produce its content, it
+ should return an empty list; its divider will then use the styles
+ with the "off" qualifier.
+
+ term_width and term_height are the dimension of the terminal where
+ this module will be displayed. If `style_changed` is `True` then
+ some attributes have changed since the last time so the
+ implementation may want to update its status.'''
+ pass
+
+ def attributes(self):
+ '''Return the dictionary of available attributes.
+
+ The key is the attribute name and the value is another dictionary
+ with items:
+
+ - `default` is the initial value for this attribute;
+
+ - `doc` is the optional documentation of this attribute which will
+ appear in the GDB help system;
+
+ - `name` is the name of the attribute of the Python object (defaults
+ to the key value);
+
+ - `type` is the Python type of this attribute defaulting to the
+ `str` type, it is used to coerce the value passed as an argument
+ to the proper type, or raise an exception;
+
+ - `check` is an optional control callback which accept the coerced
+ value and returns `True` if the value satisfies the constraint and
+ `False` otherwise.
+
+ Those attributes can be accessed from the implementation using
+ instance variables named `name`.'''
+ return {}
+
+ def commands(self):
+ '''Return the dictionary of available commands.
+
+ The key is the attribute name and the value is another dictionary
+ with items:
+
+ - `action` is the callback to be executed which accepts the raw
+ input string from the GDB prompt, exceptions in these functions
+ will be shown automatically to the user;
+
+ - `doc` is the documentation of this command which will appear in
+ the GDB help system;
+
+ - `completion` is the optional completion policy, one of the
+ `gdb.COMPLETE_*` constants defined in the GDB reference manual
+ (https://sourceware.org/gdb/onlinedocs/gdb/Commands-In-Python.html).'''
+ return {}
+
+# Default modules --------------------------------------------------------------
+
+class Source(Dashboard.Module):
+ '''Show the program source code, if available.'''
+
+ def __init__(self):
+ self.file_name = None
+ self.source_lines = []
+ self.ts = None
+ self.highlighted = False
+ self.offset = 0
+
+ def label(self):
+ label = 'Source'
+ if self.show_path and self.file_name:
+ label += ': {}'.format(self.file_name)
+ return label
+
+ def lines(self, term_width, term_height, style_changed):
+ # skip if the current thread is not stopped
+ if not gdb.selected_thread().is_stopped():
+ return []
+ # try to fetch the current line (skip if no line information)
+ sal = gdb.selected_frame().find_sal()
+ current_line = sal.line
+ if current_line == 0:
+ self.file_name = None
+ return []
+ # try to lookup the source file
+ candidates = [
+ sal.symtab.fullname(),
+ sal.symtab.filename,
+ # XXX GDB also uses absolute filename but it is harder to implement
+ # properly and IMHO useless
+ os.path.basename(sal.symtab.filename)]
+ for candidate in candidates:
+ file_name = candidate
+ ts = None
+ try:
+ ts = os.path.getmtime(file_name)
+ break
+ except:
+ # try another or delay error check to open()
+ continue
+ # style changed, different file name or file modified in the meanwhile
+ if style_changed or file_name != self.file_name or ts and ts > self.ts:
+ try:
+ # reload the source file if changed
+ with io.open(file_name, errors='replace') as source_file:
+ highlighter = Beautifier(file_name, self.tab_size)
+ self.highlighted = highlighter.active
+ source = highlighter.process(source_file.read())
+ self.source_lines = source.split('\n')
+ # store file name and timestamp only if success to have
+ # persistent errors
+ self.file_name = file_name
+ self.ts = ts
+ except IOError as e:
+ msg = 'Cannot display "{}"'.format(file_name)
+ return [ansi(msg, R.style_error)]
+ # compute the line range
+ height = self.height or (term_height - 1)
+ start = current_line - 1 - int(height / 2) + self.offset
+ end = start + height
+ # extra at start
+ extra_start = 0
+ if start < 0:
+ extra_start = min(-start, height)
+ start = 0
+ # extra at end
+ extra_end = 0
+ if end > len(self.source_lines):
+ extra_end = min(end - len(self.source_lines), height)
+ end = len(self.source_lines)
+ else:
+ end = max(end, 0)
+ # return the source code listing
+ breakpoints = fetch_breakpoints()
+ out = []
+ number_format = '{{:>{}}}'.format(len(str(end)))
+ for number, line in enumerate(self.source_lines[start:end], start + 1):
+ # properly handle UTF-8 source files
+ line = to_string(line)
+ if int(number) == current_line:
+ # the current line has a different style without ANSI
+ if R.ansi:
+ if self.highlighted and not self.highlight_line:
+ line_format = '{}' + ansi(number_format, R.style_selected_1) + ' {}'
+ else:
+ line_format = '{}' + ansi(number_format + ' {}', R.style_selected_1)
+ else:
+ # just show a plain text indicator
+ line_format = '{}' + number_format + '> {}'
+ else:
+ line_format = '{}' + ansi(number_format, R.style_low) + ' {}'
+ # check for breakpoint presence
+ enabled = None
+ for breakpoint in breakpoints:
+ addresses = breakpoint['addresses']
+ is_root_enabled = addresses[0]['enabled']
+ for address in addresses:
+ # note, despite the lookup path always use the relative
+ # (sal.symtab.filename) file name to match source files with
+ # breakpoints
+ if address['file_line'] == number and address['file_name'] == sal.symtab.filename:
+ enabled = enabled or (address['enabled'] and is_root_enabled)
+ if enabled is None:
+ breakpoint = ' '
+ else:
+ breakpoint = ansi('!', R.style_critical) if enabled else ansi('-', R.style_low)
+ out.append(line_format.format(breakpoint, number, line.rstrip('\n')))
+ # return the output along with scroll indicators
+ if len(out) <= height:
+ extra = [ansi('~', R.style_low)]
+ return extra_start * extra + out + extra_end * extra
+ else:
+ return out
+
+ def commands(self):
+ return {
+ 'scroll': {
+ 'action': self.scroll,
+ 'doc': 'Scroll by relative steps or reset if invoked without argument.'
+ }
+ }
+
+ def attributes(self):
+ return {
+ 'height': {
+ 'doc': '''Height of the module.
+
+A value of 0 uses the whole height.''',
+ 'default': 10,
+ 'type': int,
+ 'check': check_ge_zero
+ },
+ 'tab-size': {
+ 'doc': 'Number of spaces used to display the tab character.',
+ 'default': 4,
+ 'name': 'tab_size',
+ 'type': int,
+ 'check': check_gt_zero
+ },
+ 'path': {
+ 'doc': 'Path visibility flag in the module label.',
+ 'default': False,
+ 'name': 'show_path',
+ 'type': bool
+ },
+ 'highlight-line': {
+ 'doc': 'Decide whether the whole current line should be highlighted.',
+ 'default': False,
+ 'name': 'highlight_line',
+ 'type': bool
+ }
+ }
+
+ def scroll(self, arg):
+ if arg:
+ self.offset += int(arg)
+ else:
+ self.offset = 0
+
+class Assembly(Dashboard.Module):
+ '''Show the disassembled code surrounding the program counter.
+
+The instructions constituting the current statement are marked, if available.'''
+
+ def __init__(self):
+ self.offset = 0
+ self.cache_key = None
+ self.cache_asm = None
+
+ def label(self):
+ return 'Assembly'
+
+ def lines(self, term_width, term_height, style_changed):
+ # skip if the current thread is not stopped
+ if not gdb.selected_thread().is_stopped():
+ return []
+ # flush the cache if the style is changed
+ if style_changed:
+ self.cache_key = None
+ # prepare the highlighter
+ try:
+ flavor = gdb.parameter('disassembly-flavor')
+ except:
+ flavor = 'att' # not always defined (see #36)
+ highlighter = Beautifier(flavor, tab_size=None)
+ # fetch the assembly code
+ line_info = None
+ frame = gdb.selected_frame() # PC is here
+ height = self.height or (term_height - 1)
+ try:
+ # disassemble the current block
+ asm_start, asm_end = self.fetch_function_boundaries()
+ asm = self.fetch_asm(asm_start, asm_end, False, highlighter)
+ # find the location of the PC
+ pc_index = next(index for index, instr in enumerate(asm)
+ if instr['addr'] == frame.pc())
+ # compute the instruction range
+ start = pc_index - int(height / 2) + self.offset
+ end = start + height
+ # extra at start
+ extra_start = 0
+ if start < 0:
+ extra_start = min(-start, height)
+ start = 0
+ # extra at end
+ extra_end = 0
+ if end > len(asm):
+ extra_end = min(end - len(asm), height)
+ end = len(asm)
+ else:
+ end = max(end, 0)
+ # fetch actual interval
+ asm = asm[start:end]
+ # if there are line information then use it, it may be that
+ # line_info is not None but line_info.last is None
+ line_info = gdb.find_pc_line(frame.pc())
+ line_info = line_info if line_info.last else None
+ except (gdb.error, RuntimeError, StopIteration):
+ # if it is not possible (stripped binary or the PC is not present in
+ # the output of `disassemble` as per issue #31) start from PC
+ try:
+ extra_start = 0
+ extra_end = 0
+ # allow to scroll down nevertheless
+ clamped_offset = min(self.offset, 0)
+ asm = self.fetch_asm(frame.pc(), height - clamped_offset, True, highlighter)
+ asm = asm[-clamped_offset:]
+ except gdb.error as e:
+ msg = '{}'.format(e)
+ return [ansi(msg, R.style_error)]
+ # fetch function start if available (e.g., not with @plt)
+ func_start = None
+ if self.show_function and frame.function():
+ func_start = to_unsigned(frame.function().value())
+ # compute the maximum offset size
+ if asm and func_start:
+ max_offset = max(len(str(abs(asm[0]['addr'] - func_start))),
+ len(str(abs(asm[-1]['addr'] - func_start))))
+ # return the machine code
+ breakpoints = fetch_breakpoints()
+ max_length = max(instr['length'] for instr in asm) if asm else 0
+ inferior = gdb.selected_inferior()
+ out = []
+ for index, instr in enumerate(asm):
+ addr = instr['addr']
+ length = instr['length']
+ text = instr['asm']
+ addr_str = format_address(addr)
+ if self.show_opcodes:
+ # fetch and format opcode
+ region = inferior.read_memory(addr, length)
+ opcodes = (' '.join('{:02x}'.format(ord(byte)) for byte in region))
+ opcodes += (max_length - len(region)) * 3 * ' ' + ' '
+ else:
+ opcodes = ''
+ # compute the offset if available
+ if self.show_function:
+ if func_start:
+ offset = '{:+d}'.format(addr - func_start)
+ offset = offset.ljust(max_offset + 1) # sign
+ func_info = '{}{}'.format(frame.function(), offset)
+ else:
+ func_info = '?'
+ else:
+ func_info = ''
+ format_string = '{}{}{}{}{}{}'
+ indicator = ' '
+ text = ' ' + text
+ if addr == frame.pc():
+ if not R.ansi:
+ indicator = '> '
+ addr_str = ansi(addr_str, R.style_selected_1)
+ indicator = ansi(indicator, R.style_selected_1)
+ opcodes = ansi(opcodes, R.style_selected_1)
+ func_info = ansi(func_info, R.style_selected_1)
+ if not highlighter.active or self.highlight_line:
+ text = ansi(text, R.style_selected_1)
+ elif line_info and line_info.pc <= addr < line_info.last:
+ if not R.ansi:
+ indicator = ': '
+ addr_str = ansi(addr_str, R.style_selected_2)
+ indicator = ansi(indicator, R.style_selected_2)
+ opcodes = ansi(opcodes, R.style_selected_2)
+ func_info = ansi(func_info, R.style_selected_2)
+ if not highlighter.active or self.highlight_line:
+ text = ansi(text, R.style_selected_2)
+ else:
+ addr_str = ansi(addr_str, R.style_low)
+ func_info = ansi(func_info, R.style_low)
+ # check for breakpoint presence
+ enabled = None
+ for breakpoint in breakpoints:
+ addresses = breakpoint['addresses']
+ is_root_enabled = addresses[0]['enabled']
+ for address in addresses:
+ if address['address'] == addr:
+ enabled = enabled or (address['enabled'] and is_root_enabled)
+ if enabled is None:
+ breakpoint = ' '
+ else:
+ breakpoint = ansi('!', R.style_critical) if enabled else ansi('-', R.style_low)
+ out.append(format_string.format(breakpoint, addr_str, indicator, opcodes, func_info, text))
+ # return the output along with scroll indicators
+ if len(out) <= height:
+ extra = [ansi('~', R.style_low)]
+ return extra_start * extra + out + extra_end * extra
+ else:
+ return out
+
+ def commands(self):
+ return {
+ 'scroll': {
+ 'action': self.scroll,
+ 'doc': 'Scroll by relative steps or reset if invoked without argument.'
+ }
+ }
+
+ def attributes(self):
+ return {
+ 'height': {
+ 'doc': '''Height of the module.
+
+A value of 0 uses the whole height.''',
+ 'default': 10,
+ 'type': int,
+ 'check': check_ge_zero
+ },
+ 'opcodes': {
+ 'doc': 'Opcodes visibility flag.',
+ 'default': False,
+ 'name': 'show_opcodes',
+ 'type': bool
+ },
+ 'function': {
+ 'doc': 'Function information visibility flag.',
+ 'default': True,
+ 'name': 'show_function',
+ 'type': bool
+ },
+ 'highlight-line': {
+ 'doc': 'Decide whether the whole current line should be highlighted.',
+ 'default': False,
+ 'name': 'highlight_line',
+ 'type': bool
+ }
+ }
+
+ def scroll(self, arg):
+ if arg:
+ self.offset += int(arg)
+ else:
+ self.offset = 0
+
+ def fetch_function_boundaries(self):
+ frame = gdb.selected_frame()
+ # parse the output of the disassemble GDB command to find the function
+ # boundaries, this should handle cases in which a function spans
+ # multiple discontinuous blocks
+ disassemble = run('disassemble')
+ for block_start, block_end in re.findall(r'Address range 0x([0-9a-f]+) to 0x([0-9a-f]+):', disassemble):
+ block_start = int(block_start, 16)
+ block_end = int(block_end, 16)
+ if block_start <= frame.pc() < block_end:
+ return block_start, block_end - 1 # need to be inclusive
+ # if function information is available then try to obtain the
+ # boundaries by looking at the superblocks
+ block = frame.block()
+ if frame.function():
+ while block and (not block.function or block.function.name != frame.function().name):
+ block = block.superblock
+ block = block or frame.block()
+ return block.start, block.end - 1
+
+ def fetch_asm(self, start, end_or_count, relative, highlighter):
+ # fetch asm from cache or disassemble
+ if self.cache_key == (start, end_or_count):
+ asm = self.cache_asm
+ else:
+ kwargs = {
+ 'start_pc': start,
+ 'count' if relative else 'end_pc': end_or_count
+ }
+ asm = gdb.selected_frame().architecture().disassemble(**kwargs)
+ self.cache_key = (start, end_or_count)
+ self.cache_asm = asm
+ # syntax highlight the cached entry
+ for instr in asm:
+ instr['asm'] = highlighter.process(instr['asm'])
+ return asm
+
+class Variables(Dashboard.Module):
+ '''Show arguments and locals of the selected frame.'''
+
+ def label(self):
+ return 'Variables'
+
+ def lines(self, term_width, term_height, style_changed):
+ return Variables.format_frame(
+ gdb.selected_frame(), self.show_arguments, self.show_locals, self.compact, self.align, self.sort)
+
+ def attributes(self):
+ return {
+ 'arguments': {
+ 'doc': 'Frame arguments visibility flag.',
+ 'default': True,
+ 'name': 'show_arguments',
+ 'type': bool
+ },
+ 'locals': {
+ 'doc': 'Frame locals visibility flag.',
+ 'default': True,
+ 'name': 'show_locals',
+ 'type': bool
+ },
+ 'compact': {
+ 'doc': 'Single-line display flag.',
+ 'default': True,
+ 'type': bool
+ },
+ 'align': {
+ 'doc': 'Align variables in column flag (only if not compact).',
+ 'default': False,
+ 'type': bool
+ },
+ 'sort': {
+ 'doc': 'Sort variables by name.',
+ 'default': False,
+ 'type': bool
+ }
+ }
+
+ @staticmethod
+ def format_frame(frame, show_arguments, show_locals, compact, align, sort):
+ out = []
+ # fetch frame arguments and locals
+ decorator = gdb.FrameDecorator.FrameDecorator(frame)
+ separator = ansi(', ', R.style_low)
+ if show_arguments:
+ def prefix(line):
+ return Stack.format_line('arg', line)
+ frame_args = decorator.frame_args()
+ args_lines = Variables.fetch(frame, frame_args, compact, align, sort)
+ if args_lines:
+ if compact:
+ args_line = separator.join(args_lines)
+ single_line = prefix(args_line)
+ out.append(single_line)
+ else:
+ out.extend(map(prefix, args_lines))
+ if show_locals:
+ def prefix(line):
+ return Stack.format_line('loc', line)
+ frame_locals = decorator.frame_locals()
+ locals_lines = Variables.fetch(frame, frame_locals, compact, align, sort)
+ if locals_lines:
+ if compact:
+ locals_line = separator.join(locals_lines)
+ single_line = prefix(locals_line)
+ out.append(single_line)
+ else:
+ out.extend(map(prefix, locals_lines))
+ return out
+
+ @staticmethod
+ def fetch(frame, data, compact, align, sort):
+ lines = []
+ name_width = 0
+ if align and not compact:
+ name_width = max(len(str(elem.sym)) for elem in data) if data else 0
+ for elem in data or []:
+ name = ansi(elem.sym, R.style_high) + ' ' * (name_width - len(str(elem.sym)))
+ equal = ansi('=', R.style_low)
+ value = format_value(elem.sym.value(frame), compact)
+ lines.append('{} {} {}'.format(name, equal, value))
+ if sort:
+ lines.sort()
+ return lines
+
+class Stack(Dashboard.Module):
+ '''Show the current stack trace including the function name and the file location, if available.
+
+Optionally list the frame arguments and locals too.'''
+
+ def label(self):
+ return 'Stack'
+
+ def lines(self, term_width, term_height, style_changed):
+ # skip if the current thread is not stopped
+ if not gdb.selected_thread().is_stopped():
+ return []
+ # find the selected frame level (XXX Frame.level() is a recent addition)
+ start_level = 0
+ frame = gdb.newest_frame()
+ while frame:
+ if frame == gdb.selected_frame():
+ break
+ frame = frame.older()
+ start_level += 1
+ # gather the frames
+ more = False
+ frames = [gdb.selected_frame()]
+ going_down = True
+ while True:
+ # stack frames limit reached
+ if len(frames) == self.limit:
+ more = True
+ break
+ # zigzag the frames starting from the selected one
+ if going_down:
+ frame = frames[-1].older()
+ if frame:
+ frames.append(frame)
+ else:
+ frame = frames[0].newer()
+ if frame:
+ frames.insert(0, frame)
+ start_level -= 1
+ else:
+ break
+ else:
+ frame = frames[0].newer()
+ if frame:
+ frames.insert(0, frame)
+ start_level -= 1
+ else:
+ frame = frames[-1].older()
+ if frame:
+ frames.append(frame)
+ else:
+ break
+ # switch direction
+ going_down = not going_down
+ # format the output
+ lines = []
+ for number, frame in enumerate(frames, start=start_level):
+ selected = frame == gdb.selected_frame()
+ lines.extend(self.get_frame_lines(number, frame, selected))
+ # add the placeholder
+ if more:
+ lines.append('[{}]'.format(ansi('+', R.style_selected_2)))
+ return lines
+
+ def attributes(self):
+ return {
+ 'limit': {
+ 'doc': 'Maximum number of displayed frames (0 means no limit).',
+ 'default': 10,
+ 'type': int,
+ 'check': check_ge_zero
+ },
+ 'arguments': {
+ 'doc': 'Frame arguments visibility flag.',
+ 'default': False,
+ 'name': 'show_arguments',
+ 'type': bool
+ },
+ 'locals': {
+ 'doc': 'Frame locals visibility flag.',
+ 'default': False,
+ 'name': 'show_locals',
+ 'type': bool
+ },
+ 'compact': {
+ 'doc': 'Single-line display flag.',
+ 'default': False,
+ 'type': bool
+ },
+ 'align': {
+ 'doc': 'Align variables in column flag (only if not compact).',
+ 'default': False,
+ 'type': bool
+ },
+ 'sort': {
+ 'doc': 'Sort variables by name.',
+ 'default': False,
+ 'type': bool
+ }
+ }
+
+ def get_frame_lines(self, number, frame, selected=False):
+ # fetch frame info
+ style = R.style_selected_1 if selected else R.style_selected_2
+ frame_id = ansi(str(number), style)
+ info = Stack.get_pc_line(frame, style)
+ frame_lines = []
+ frame_lines.append('[{}] {}'.format(frame_id, info))
+ # add frame arguments and locals
+ variables = Variables.format_frame(
+ frame, self.show_arguments, self.show_locals, self.compact, self.align, self.sort)
+ frame_lines.extend(variables)
+ return frame_lines
+
+ @staticmethod
+ def format_line(prefix, line):
+ prefix = ansi(prefix, R.style_low)
+ return '{} {}'.format(prefix, line)
+
+ @staticmethod
+ def get_pc_line(frame, style):
+ frame_pc = ansi(format_address(frame.pc()), style)
+ info = 'from {}'.format(frame_pc)
+ # if a frame function symbol is available then use it to fetch the
+ # current function name and address, otherwise fall back relying on the
+ # frame name
+ if frame.function():
+ name = ansi(frame.function(), style)
+ func_start = to_unsigned(frame.function().value())
+ offset = ansi(str(frame.pc() - func_start), style)
+ info += ' in {}+{}'.format(name, offset)
+ elif frame.name():
+ name = ansi(frame.name(), style)
+ info += ' in {}'.format(name)
+ sal = frame.find_sal()
+ if sal and sal.symtab:
+ file_name = ansi(sal.symtab.filename, style)
+ file_line = ansi(str(sal.line), style)
+ info += ' at {}:{}'.format(file_name, file_line)
+ return info
+
+class History(Dashboard.Module):
+ '''List the last entries of the value history.'''
+
+ def label(self):
+ return 'History'
+
+ def lines(self, term_width, term_height, style_changed):
+ out = []
+ # fetch last entries
+ for i in range(-self.limit + 1, 1):
+ try:
+ value = format_value(gdb.history(i))
+ value_id = ansi('$${}', R.style_high).format(abs(i))
+ equal = ansi('=', R.style_low)
+ line = '{} {} {}'.format(value_id, equal, value)
+ out.append(line)
+ except gdb.error:
+ continue
+ return out
+
+ def attributes(self):
+ return {
+ 'limit': {
+ 'doc': 'Maximum number of values to show.',
+ 'default': 3,
+ 'type': int,
+ 'check': check_gt_zero
+ }
+ }
+
+class Memory(Dashboard.Module):
+ '''Allow to inspect memory regions.'''
+
+ DEFAULT_LENGTH = 16
+
+ class Region():
+ def __init__(self, expression, length, module):
+ self.expression = expression
+ self.length = length
+ self.module = module
+ self.original = None
+ self.latest = None
+
+ def reset(self):
+ self.original = None
+ self.latest = None
+
+ def format(self, per_line):
+ # fetch the memory content
+ try:
+ address = Memory.parse_as_address(self.expression)
+ inferior = gdb.selected_inferior()
+ memory = inferior.read_memory(address, self.length)
+ # set the original memory snapshot if needed
+ if not self.original:
+ self.original = memory
+ except gdb.error as e:
+ msg = 'Cannot access {} bytes starting at {}: {}'
+ msg = msg.format(self.length, self.expression, e)
+ return [ansi(msg, R.style_error)]
+ # format the memory content
+ out = []
+ for i in range(0, len(memory), per_line):
+ region = memory[i:i + per_line]
+ pad = per_line - len(region)
+ address_str = format_address(address + i)
+ # compute changes
+ hexa = []
+ text = []
+ for j in range(len(region)):
+ rel = i + j
+ byte = memory[rel]
+ hexa_byte = '{:02x}'.format(ord(byte))
+ text_byte = self.module.format_byte(byte)
+ # differences against the latest have the highest priority
+ if self.latest and memory[rel] != self.latest[rel]:
+ hexa_byte = ansi(hexa_byte, R.style_selected_1)
+ text_byte = ansi(text_byte, R.style_selected_1)
+ # cumulative changes if enabled
+ elif self.module.cumulative and memory[rel] != self.original[rel]:
+ hexa_byte = ansi(hexa_byte, R.style_selected_2)
+ text_byte = ansi(text_byte, R.style_selected_2)
+ # format the text differently for clarity
+ else:
+ text_byte = ansi(text_byte, R.style_high)
+ hexa.append(hexa_byte)
+ text.append(text_byte)
+ # output the formatted line
+ hexa_placeholder = ' {}'.format(self.module.placeholder[0] * 2)
+ text_placeholder = self.module.placeholder[0]
+ out.append('{} {}{} {}{}'.format(
+ ansi(address_str, R.style_low),
+ ' '.join(hexa), ansi(pad * hexa_placeholder, R.style_low),
+ ''.join(text), ansi(pad * text_placeholder, R.style_low)))
+ # update the latest memory snapshot
+ self.latest = memory
+ return out
+
+ def __init__(self):
+ self.table = {}
+
+ def label(self):
+ return 'Memory'
+
+ def lines(self, term_width, term_height, style_changed):
+ out = []
+ for expression, region in self.table.items():
+ out.append(divider(term_width, expression))
+ out.extend(region.format(self.get_per_line(term_width)))
+ return out
+
+ def commands(self):
+ return {
+ 'watch': {
+ 'action': self.watch,
+ 'doc': '''Watch a memory region by expression and length.
+
+The length defaults to 16 bytes.''',
+ 'complete': gdb.COMPLETE_EXPRESSION
+ },
+ 'unwatch': {
+ 'action': self.unwatch,
+ 'doc': 'Stop watching a memory region by expression.',
+ 'complete': gdb.COMPLETE_EXPRESSION
+ },
+ 'clear': {
+ 'action': self.clear,
+ 'doc': 'Clear all the watched regions.'
+ }
+ }
+
+ def attributes(self):
+ return {
+ 'cumulative': {
+ 'doc': 'Highlight changes cumulatively, watch again to reset.',
+ 'default': False,
+ 'type': bool
+ },
+ 'full': {
+ 'doc': 'Take the whole horizontal space.',
+ 'default': False,
+ 'type': bool
+ },
+ 'placeholder': {
+ 'doc': 'Placeholder used for missing items and unprintable characters.',
+ 'default': 'ยท'
+ }
+ }
+
+ def watch(self, arg):
+ if arg:
+ expression, _, length_str = arg.partition(' ')
+ length = Memory.parse_as_address(length_str) if length_str else Memory.DEFAULT_LENGTH
+ # keep the length when the memory is watched to reset the changes
+ region = self.table.get(expression)
+ if region and not length_str:
+ region.reset()
+ else:
+ self.table[expression] = Memory.Region(expression, length, self)
+ else:
+ raise Exception('Specify a memory location')
+
+ def unwatch(self, arg):
+ if arg:
+ try:
+ del self.table[arg]
+ except KeyError:
+ raise Exception('Memory expression not watched')
+ else:
+ raise Exception('Specify a matched memory expression')
+
+ def clear(self, arg):
+ self.table.clear()
+
+ def format_byte(self, byte):
+ # `type(byte) is bytes` in Python 3
+ if 0x20 < ord(byte) < 0x7f:
+ return chr(ord(byte))
+ else:
+ return self.placeholder[0]
+
+ def get_per_line(self, term_width):
+ if self.full:
+ padding = 3 # two double spaces separator (one is part of below)
+ elem_size = 4 # HH + 1 space + T
+ address_length = gdb.parse_and_eval('$pc').type.sizeof * 2 + 2 # 0x
+ return max(int((term_width - address_length - padding) / elem_size), 1)
+ else:
+ return Memory.DEFAULT_LENGTH
+
+ @staticmethod
+ def parse_as_address(expression):
+ value = gdb.parse_and_eval(expression)
+ return to_unsigned(value)
+
+class Registers(Dashboard.Module):
+ '''Show the CPU registers and their values.'''
+
+ def __init__(self):
+ self.table = {}
+
+ def label(self):
+ return 'Registers'
+
+ def lines(self, term_width, term_height, style_changed):
+ # skip if the current thread is not stopped
+ if not gdb.selected_thread().is_stopped():
+ return []
+ # obtain the registers to display
+ if style_changed:
+ self.table = {}
+ if self.register_list:
+ register_list = self.register_list.split()
+ else:
+ register_list = Registers.fetch_register_list()
+ # fetch registers status
+ registers = []
+ for name in register_list:
+ # exclude registers with a dot '.' or parse_and_eval() will fail
+ if '.' in name:
+ continue
+ value = gdb.parse_and_eval('${}'.format(name))
+ string_value = Registers.format_value(value)
+ # exclude unavailable registers (see #255)
+ if string_value == '<unavailable>':
+ continue
+ changed = self.table and (self.table.get(name, '') != string_value)
+ self.table[name] = string_value
+ registers.append((name, string_value, changed))
+ # handle the empty register list
+ if not registers:
+ msg = 'No registers to show (check the "dashboard registers -style list" attribute)'
+ return [ansi(msg, R.style_error)]
+ # compute lengths considering an extra space between and around the
+ # entries (hence the +2 and term_width - 1)
+ max_name = max(len(name) for name, _, _ in registers)
+ max_value = max(len(value) for _, value, _ in registers)
+ max_width = max_name + max_value + 2
+ columns = min(int((term_width - 1) / max_width) or 1, len(registers))
+ rows = int(math.ceil(float(len(registers)) / columns))
+ # build the registers matrix
+ if self.column_major:
+ matrix = list(registers[i:i + rows] for i in range(0, len(registers), rows))
+ else:
+ matrix = list(registers[i::columns] for i in range(columns))
+ # compute the lengths column wise
+ max_names_column = list(max(len(name) for name, _, _ in column) for column in matrix)
+ max_values_column = list(max(len(value) for _, value, _ in column) for column in matrix)
+ line_length = sum(max_names_column) + columns + sum(max_values_column)
+ extra = term_width - line_length
+ # compute padding as if there were one more column
+ base_padding = int(extra / (columns + 1))
+ padding_column = [base_padding] * columns
+ # distribute the remainder among columns giving the precedence to
+ # internal padding
+ rest = extra % (columns + 1)
+ while rest:
+ padding_column[rest % columns] += 1
+ rest -= 1
+ # format the registers
+ out = [''] * rows
+ for i, column in enumerate(matrix):
+ max_name = max_names_column[i]
+ max_value = max_values_column[i]
+ for j, (name, value, changed) in enumerate(column):
+ name = ' ' * (max_name - len(name)) + ansi(name, R.style_low)
+ style = R.style_selected_1 if changed else ''
+ value = ansi(value, style) + ' ' * (max_value - len(value))
+ padding = ' ' * padding_column[i]
+ item = '{}{} {}'.format(padding, name, value)
+ out[j] += item
+ return out
+
+ def attributes(self):
+ return {
+ 'column-major': {
+ 'doc': 'Show registers in columns instead of rows.',
+ 'default': False,
+ 'name': 'column_major',
+ 'type': bool
+ },
+ 'list': {
+ 'doc': '''String of space-separated register names to display.
+
+The empty list (default) causes to show all the available registers. For
+architectures different from x86 setting this attribute might be mandatory.''',
+ 'default': '',
+ 'name': 'register_list',
+ }
+ }
+
+ @staticmethod
+ def format_value(value):
+ try:
+ if value.type.code in [gdb.TYPE_CODE_INT, gdb.TYPE_CODE_PTR]:
+ int_value = to_unsigned(value, value.type.sizeof)
+ value_format = '0x{{:0{}x}}'.format(2 * value.type.sizeof)
+ return value_format.format(int_value)
+ except (gdb.error, ValueError):
+ # convert to unsigned but preserve code and flags information
+ pass
+ return str(value)
+
+ @staticmethod
+ def fetch_register_list(*match_groups):
+ names = []
+ for line in run('maintenance print register-groups').split('\n'):
+ fields = line.split()
+ if len(fields) != 7:
+ continue
+ name, _, _, _, _, _, groups = fields
+ if not re.match(r'\w', name):
+ continue
+ for group in groups.split(','):
+ if group in (match_groups or ('general',)):
+ names.append(name)
+ break
+ return names
+
+class Threads(Dashboard.Module):
+ '''List the currently available threads.'''
+
+ def label(self):
+ return 'Threads'
+
+ def lines(self, term_width, term_height, style_changed):
+ out = []
+ selected_thread = gdb.selected_thread()
+ # do not restore the selected frame if the thread is not stopped
+ restore_frame = gdb.selected_thread().is_stopped()
+ if restore_frame:
+ selected_frame = gdb.selected_frame()
+ # fetch the thread list
+ threads = []
+ for inferior in gdb.inferiors():
+ if self.all_inferiors or inferior == gdb.selected_inferior():
+ threads += gdb.Inferior.threads(inferior)
+ for thread in threads:
+ # skip running threads if requested
+ if self.skip_running and thread.is_running():
+ continue
+ is_selected = (thread.ptid == selected_thread.ptid)
+ style = R.style_selected_1 if is_selected else R.style_selected_2
+ if self.all_inferiors:
+ number = '{}.{}'.format(thread.inferior.num, thread.num)
+ else:
+ number = str(thread.num)
+ number = ansi(number, style)
+ tid = ansi(str(thread.ptid[1] or thread.ptid[2]), style)
+ info = '[{}] id {}'.format(number, tid)
+ if thread.name:
+ info += ' name {}'.format(ansi(thread.name, style))
+ # switch thread to fetch info (unless is running in non-stop mode)
+ try:
+ thread.switch()
+ frame = gdb.newest_frame()
+ info += ' ' + Stack.get_pc_line(frame, style)
+ except gdb.error:
+ info += ' (running)'
+ out.append(info)
+ # restore thread and frame
+ selected_thread.switch()
+ if restore_frame:
+ selected_frame.select()
+ return out
+
+ def attributes(self):
+ return {
+ 'skip-running': {
+ 'doc': 'Skip running threads.',
+ 'default': False,
+ 'name': 'skip_running',
+ 'type': bool
+ },
+ 'all-inferiors': {
+ 'doc': 'Show threads from all inferiors.',
+ 'default': False,
+ 'name': 'all_inferiors',
+ 'type': bool
+ },
+ }
+
+class Expressions(Dashboard.Module):
+ '''Watch user expressions.'''
+
+ def __init__(self):
+ self.table = []
+
+ def label(self):
+ return 'Expressions'
+
+ def lines(self, term_width, term_height, style_changed):
+ out = []
+ label_width = 0
+ if self.align:
+ label_width = max(len(expression) for expression in self.table) if self.table else 0
+ default_radix = Expressions.get_default_radix()
+ for number, expression in enumerate(self.table, start=1):
+ label = expression
+ match = re.match(r'^/(\d+) +(.+)$', expression)
+ try:
+ if match:
+ radix, expression = match.groups()
+ run('set output-radix {}'.format(radix))
+ value = format_value(gdb.parse_and_eval(expression))
+ except gdb.error as e:
+ value = ansi(e, R.style_error)
+ finally:
+ if match:
+ run('set output-radix {}'.format(default_radix))
+ number = ansi(str(number), R.style_selected_2)
+ label = ansi(expression, R.style_high) + ' ' * (label_width - len(expression))
+ equal = ansi('=', R.style_low)
+ out.append('[{}] {} {} {}'.format(number, label, equal, value))
+ return out
+
+ def commands(self):
+ return {
+ 'watch': {
+ 'action': self.watch,
+ 'doc': 'Watch an expression using the format `[/<radix>] <expression>`.',
+ 'complete': gdb.COMPLETE_EXPRESSION
+ },
+ 'unwatch': {
+ 'action': self.unwatch,
+ 'doc': 'Stop watching an expression by index.'
+ },
+ 'clear': {
+ 'action': self.clear,
+ 'doc': 'Clear all the watched expressions.'
+ }
+ }
+
+ def attributes(self):
+ return {
+ 'align': {
+ 'doc': 'Align variables in column flag.',
+ 'default': False,
+ 'type': bool
+ }
+ }
+
+ def watch(self, arg):
+ if arg:
+ if arg not in self.table:
+ self.table.append(arg)
+ else:
+ raise Exception('Expression already watched')
+ else:
+ raise Exception('Specify an expression')
+
+ def unwatch(self, arg):
+ if arg:
+ try:
+ number = int(arg) - 1
+ except:
+ number = -1
+ if 0 <= number < len(self.table):
+ self.table.pop(number)
+ else:
+ raise Exception('Expression not watched')
+ else:
+ raise Exception('Specify an expression')
+
+ def clear(self, arg):
+ self.table.clear()
+
+ @staticmethod
+ def get_default_radix():
+ try:
+ return gdb.parameter('output-radix')
+ except RuntimeError:
+ # XXX this is a fix for GDB <8.1.x see #161
+ message = run('show output-radix')
+ match = re.match(r'^Default output radix for printing of values is (\d+)\.$', message)
+ return match.groups()[0] if match else 10 # fallback
+
+# XXX workaround to support BP_BREAKPOINT in older GDB versions
+setattr(gdb, 'BP_CATCHPOINT', getattr(gdb, 'BP_CATCHPOINT', 26))
+
+class Breakpoints(Dashboard.Module):
+ '''Display the breakpoints list.'''
+
+ NAMES = {
+ gdb.BP_BREAKPOINT: 'break',
+ gdb.BP_WATCHPOINT: 'watch',
+ gdb.BP_HARDWARE_WATCHPOINT: 'write watch',
+ gdb.BP_READ_WATCHPOINT: 'read watch',
+ gdb.BP_ACCESS_WATCHPOINT: 'access watch',
+ gdb.BP_CATCHPOINT: 'catch'
+ }
+
+ def label(self):
+ return 'Breakpoints'
+
+ def lines(self, term_width, term_height, style_changed):
+ out = []
+ breakpoints = fetch_breakpoints(watchpoints=True, pending=self.show_pending)
+ for breakpoint in breakpoints:
+ sub_lines = []
+ # format common information
+ style = R.style_selected_1 if breakpoint['enabled'] else R.style_selected_2
+ number = ansi(breakpoint['number'], style)
+ bp_type = ansi(Breakpoints.NAMES[breakpoint['type']], style)
+ if breakpoint['temporary']:
+ bp_type = bp_type + ' {}'.format(ansi('once', style))
+ if not R.ansi and breakpoint['enabled']:
+ bp_type = 'disabled ' + bp_type
+ line = '[{}] {}'.format(number, bp_type)
+ if breakpoint['type'] == gdb.BP_BREAKPOINT:
+ for i, address in enumerate(breakpoint['addresses']):
+ addr = address['address']
+ if i == 0 and addr:
+ # this is a regular breakpoint
+ line += ' at {}'.format(ansi(format_address(addr), style))
+ # format source information
+ file_name = address.get('file_name')
+ file_line = address.get('file_line')
+ if file_name and file_line:
+ file_name = ansi(file_name, style)
+ file_line = ansi(file_line, style)
+ line += ' in {}:{}'.format(file_name, file_line)
+ elif i > 0:
+ # this is a sub breakpoint
+ sub_style = R.style_selected_1 if address['enabled'] else R.style_selected_2
+ sub_number = ansi('{}.{}'.format(breakpoint['number'], i), sub_style)
+ sub_line = '[{}]'.format(sub_number)
+ sub_line += ' at {}'.format(ansi(format_address(addr), sub_style))
+ # format source information
+ file_name = address.get('file_name')
+ file_line = address.get('file_line')
+ if file_name and file_line:
+ file_name = ansi(file_name, sub_style)
+ file_line = ansi(file_line, sub_style)
+ sub_line += ' in {}:{}'.format(file_name, file_line)
+ sub_lines += [sub_line]
+ # format user location
+ location = breakpoint['location']
+ line += ' for {}'.format(ansi(location, style))
+ elif breakpoint['type'] == gdb.BP_CATCHPOINT:
+ what = breakpoint['what']
+ line += ' {}'.format(ansi(what, style))
+ else:
+ # format user expression
+ expression = breakpoint['expression']
+ line += ' for {}'.format(ansi(expression, style))
+ # format condition
+ condition = breakpoint['condition']
+ if condition:
+ line += ' if {}'.format(ansi(condition, style))
+ # format hit count
+ hit_count = breakpoint['hit_count']
+ if hit_count:
+ word = 'time{}'.format('s' if hit_count > 1 else '')
+ line += ' hit {} {}'.format(ansi(breakpoint['hit_count'], style), word)
+ # append the main line and possibly sub breakpoints
+ out.append(line)
+ out.extend(sub_lines)
+ return out
+
+ def attributes(self):
+ return {
+ 'pending': {
+ 'doc': 'Also show pending breakpoints.',
+ 'default': True,
+ 'name': 'show_pending',
+ 'type': bool
+ }
+ }
+
+# XXX traceback line numbers in this Python block must be increased by 1
+end
+
+# Better GDB defaults ----------------------------------------------------------
+
+set history save
+set verbose off
+set print pretty on
+set print array off
+set print array-indexes on
+set python print-stack full
+
+# Start ------------------------------------------------------------------------
+
+python Dashboard.start()
+
+# File variables ---------------------------------------------------------------
+
+# vim: filetype=python
+# Local Variables:
+# mode: python
+# End:
diff --git a/home/jack/.gitconfig b/home/jack/.gitconfig
index a03a3feb..e7c9b4fc 100644
--- a/home/jack/.gitconfig
+++ b/home/jack/.gitconfig
@@ -7,6 +7,8 @@
[gpg]
program = /usr/bin/gpg
[core]
- editor = nvim
+ editor = nvim
+ pager = less -F -X
[advice]
- skippedCherryPicks = false
+ skippedCherryPicks = false
+ forceDeleteBranch = false
diff --git a/home/jack/.gitignore b/home/jack/.gitignore
index c57c9b8d..88c25147 100644
--- a/home/jack/.gitignore
+++ b/home/jack/.gitignore
@@ -1,5 +1,6 @@
.cache
.cargo
+.gdb_history
.gnupg
.lesshst
.local/bin
@@ -15,6 +16,7 @@
.local/share/zathura
.local/share/zoxide
.mozilla
+.npm
.serverauth*
.ssh
.wget-hsts
@@ -25,4 +27,4 @@
Documents
Downloads
Pictures
-waffle_git
+git
diff --git a/home/jack/.xinitrc b/home/jack/.xinitrc
index 643890d9..a4c940f8 100644
--- a/home/jack/.xinitrc
+++ b/home/jack/.xinitrc
@@ -1,3 +1,3 @@
#!/bin/sh
-feh --no-fehbg --bg-fill '/home/jack/.img/wallpaper/maze.png' &
+feh --no-fehbg --bg-fill '/etc/img/wallpaper/maze.png' &
exec /usr/bin/i3
diff --git a/home/jack/.zshrc b/home/jack/.zshrc
index 563d307c..9f7b9140 100644
--- a/home/jack/.zshrc
+++ b/home/jack/.zshrc
@@ -1,7 +1,17 @@
#!/bin/zsh
+
+if [ ! -S ~/.ssh/ssh_auth_sock ]; then
+ eval "$(ssh-agent)"
+ ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
+fi
+export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
+ssh-add -l > /dev/null || ssh-add
+
if [ "$(tty)" = "/dev/tty1" ]; then
+ rm ~/.serverauth.*
exec startx
fi
+
export HISTFILE=~/.zsh_history
export HISTSIZE=20000
export SAVEHIST=20000
@@ -10,8 +20,8 @@ export LC_CTYPE=en_US.UTF-8
export GPG_TTY=$TTY
export PROMPT_EOL_MARK=""
export BAT_THEME="gruvbox-dark"
-path+=(.local/bin)
-path+=(/usr/local/texlive/2023/bin/x86_64-linux)
+
+path+=(".local/bin" "/usr/local/texlive/2023/bin/x86_64-linux" "$path[@]")
export PATH
setopt HIST_IGNORE_ALL_DUPS
diff --git a/home/jack/readme.md b/home/jack/readme.md
index 6a643797..c8f8f5d7 100644..120000
--- a/home/jack/readme.md
+++ b/home/jack/readme.md
@@ -1,10 +1 @@
-### gruvbox dotfiles
-![fetch](.img/fetch.png)
-#### nvim
-![nvim](.img/nvim.png)
-#### gotop
-![gotop](.img/gotop.png)
-#### dmenu
-![dmenu](.img/dmenu.png)
-#### zathura
-![zathura](.img/zathura.png)
+/readme.md \ No newline at end of file
diff --git a/readme.md b/readme.md
new file mode 100644
index 00000000..c182edf8
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,10 @@
+### gruvbox dotfiles
+![fetch](/etc/img/fetch.png)
+#### nvim
+![nvim](/etc/img/nvim.png)
+#### gotop
+![gotop](/etc/img/gotop.png)
+#### dmenu
+![dmenu](/etc/img/dmenu.png)
+#### zathura
+![zathura](/etc/img/zathura.png)