\select@language {english} \contentsline {chapter}{\numberline {1}Coccinelle}{3}{chapter.1} \contentsline {section}{\numberline {1.1}Getting Coccinelle}{3}{section.1.1} \contentsline {section}{\numberline {1.2}Supplemental documentation}{3}{section.1.2} \contentsline {section}{\numberline {1.3}Using Coccinelle on the Linux kernel}{4}{section.1.3} \contentsline {subsection}{\numberline {1.3.1}Examples}{4}{subsection.1.3.1} \contentsline {section}{\numberline {1.4}Coccinelle parallelization}{4}{section.1.4} \contentsline {section}{\numberline {1.5}Using Coccinelle with a single semantic patch}{5}{section.1.5} \contentsline {section}{\numberline {1.6}Controlling Which Files are Processed by Coccinelle}{5}{section.1.6} \contentsline {section}{\numberline {1.7}Debugging Coccinelle SmPL patches}{5}{section.1.7} \contentsline {section}{\numberline {1.8}.cocciconfig support}{6}{section.1.8} \contentsline {section}{\numberline {1.9}Additional flags}{7}{section.1.9} \contentsline {section}{\numberline {1.10}SmPL patch specific options}{7}{section.1.10} \contentsline {section}{\numberline {1.11}SmPL patch Coccinelle requirements}{7}{section.1.11} \contentsline {section}{\numberline {1.12}Proposing new semantic patches}{7}{section.1.12} \contentsline {section}{\numberline {1.13}Detailed description of the \texttt {report} mode}{7}{section.1.13} \contentsline {subsection}{\numberline {1.13.1}Example}{8}{subsection.1.13.1} \contentsline {section}{\numberline {1.14}Detailed description of the \texttt {patch} mode}{8}{section.1.14} \contentsline {subsection}{\numberline {1.14.1}Example}{8}{subsection.1.14.1} \contentsline {section}{\numberline {1.15}Detailed description of the \texttt {context} mode}{9}{section.1.15} \contentsline {subsection}{\numberline {1.15.1}Example}{9}{subsection.1.15.1} \contentsline {section}{\numberline {1.16}Detailed description of the \texttt {org} mode}{9}{section.1.16} \contentsline {subsection}{\numberline {1.16.1}Example}{10}{subsection.1.16.1} \contentsline {chapter}{\numberline {2}Sparse}{11}{chapter.2} \contentsline {section}{\numberline {2.1}Using sparse for typechecking}{11}{section.2.1} \contentsline {section}{\numberline {2.2}Using sparse for lock checking}{11}{section.2.2} \contentsline {section}{\numberline {2.3}Getting sparse}{12}{section.2.3} \contentsline {section}{\numberline {2.4}Using sparse}{12}{section.2.4} \contentsline {chapter}{\numberline {3}kcov: code coverage for fuzzing}{13}{chapter.3} \contentsline {section}{\numberline {3.1}Usage}{13}{section.3.1} \contentsline {chapter}{\numberline {4}Using gcov with the Linux kernel}{15}{chapter.4} \contentsline {section}{\numberline {4.1}Preparation}{15}{section.4.1} \contentsline {section}{\numberline {4.2}Customization}{15}{section.4.2} \contentsline {section}{\numberline {4.3}Files}{16}{section.4.3} \contentsline {section}{\numberline {4.4}Modules}{16}{section.4.4} \contentsline {section}{\numberline {4.5}Separated build and test machines}{16}{section.4.5} \contentsline {section}{\numberline {4.6}Troubleshooting}{17}{section.4.6} \contentsline {section}{\numberline {4.7}Appendix A: gather\_on\_build.sh}{17}{section.4.7} \contentsline {section}{\numberline {4.8}Appendix B: gather\_on\_test.sh}{18}{section.4.8} \contentsline {chapter}{\numberline {5}The Kernel Address Sanitizer (KASAN)}{19}{chapter.5} \contentsline {section}{\numberline {5.1}Overview}{19}{section.5.1} \contentsline {section}{\numberline {5.2}Usage}{19}{section.5.2} \contentsline {subsection}{\numberline {5.2.1}Error reports}{19}{subsection.5.2.1} \contentsline {section}{\numberline {5.3}Implementation details}{21}{section.5.3} \contentsline {chapter}{\numberline {6}The Undefined Behavior Sanitizer - UBSAN}{23}{chapter.6} \contentsline {section}{\numberline {6.1}Report example}{23}{section.6.1} \contentsline {section}{\numberline {6.2}Usage}{23}{section.6.2} \contentsline {section}{\numberline {6.3}References}{24}{section.6.3} \contentsline {chapter}{\numberline {7}Kernel Memory Leak Detector}{25}{chapter.7} \contentsline {section}{\numberline {7.1}Usage}{25}{section.7.1} \contentsline {section}{\numberline {7.2}Basic Algorithm}{26}{section.7.2} \contentsline {section}{\numberline {7.3}Testing specific sections with kmemleak}{26}{section.7.3} \contentsline {section}{\numberline {7.4}Freeing kmemleak internal objects}{27}{section.7.4} \contentsline {section}{\numberline {7.5}Kmemleak API}{27}{section.7.5} \contentsline {section}{\numberline {7.6}Dealing with false positives/negatives}{27}{section.7.6} \contentsline {section}{\numberline {7.7}Limitations and Drawbacks}{28}{section.7.7} \contentsline {chapter}{\numberline {8}Getting started with kmemcheck}{29}{chapter.8} \contentsline {section}{\numberline {8.1}Introduction}{29}{section.8.1} \contentsline {section}{\numberline {8.2}Downloading}{29}{section.8.2} \contentsline {section}{\numberline {8.3}Configuring and compiling}{29}{section.8.3} \contentsline {section}{\numberline {8.4}How to use}{31}{section.8.4} \contentsline {subsection}{\numberline {8.4.1}Booting}{31}{subsection.8.4.1} \contentsline {subsection}{\numberline {8.4.2}Run-time enable/disable}{31}{subsection.8.4.2} \contentsline {subsection}{\numberline {8.4.3}Debugging}{31}{subsection.8.4.3} \contentsline {subsection}{\numberline {8.4.4}Annotating false positives}{37}{subsection.8.4.4} \contentsline {section}{\numberline {8.5}Reporting errors}{38}{section.8.5} \contentsline {section}{\numberline {8.6}Technical description}{39}{section.8.6} \contentsline {chapter}{\numberline {9}Debugging kernel and modules via gdb}{41}{chapter.9} \contentsline {section}{\numberline {9.1}Requirements}{41}{section.9.1} \contentsline {section}{\numberline {9.2}Setup}{41}{section.9.2} \contentsline {section}{\numberline {9.3}Examples of using the Linux-provided gdb helpers}{42}{section.9.3} \contentsline {section}{\numberline {9.4}List of commands and functions}{43}{section.9.4} \contentsline {chapter}{\numberline {10}Using kgdb, kdb and the kernel debugger internals}{45}{chapter.10} \contentsline {section}{\numberline {10.1}Introduction}{45}{section.10.1} \contentsline {section}{\numberline {10.2}Compiling a kernel}{45}{section.10.2} \contentsline {subsection}{\numberline {10.2.1}Kernel config options for kgdb}{45}{subsection.10.2.1} \contentsline {subsection}{\numberline {10.2.2}Kernel config options for kdb}{46}{subsection.10.2.2} \contentsline {section}{\numberline {10.3}Kernel Debugger Boot Arguments}{46}{section.10.3} \contentsline {subsection}{\numberline {10.3.1}Kernel parameter: kgdboc}{46}{subsection.10.3.1} \contentsline {subsubsection}{kgdboc arguments}{47}{subsubsection*.3} \contentsline {paragraph}{Using loadable module or built-in}{47}{paragraph*.4} \contentsline {paragraph}{Configure kgdboc at runtime with sysfs}{47}{paragraph*.5} \contentsline {paragraph}{More examples}{48}{paragraph*.6} \contentsline {subsection}{\numberline {10.3.2}Kernel parameter: \texttt {kgdbwait}}{49}{subsection.10.3.2} \contentsline {subsection}{\numberline {10.3.3}Kernel parameter: \texttt {kgdbcon}}{49}{subsection.10.3.3} \contentsline {subsection}{\numberline {10.3.4}Run time parameter: \texttt {kgdbreboot}}{49}{subsection.10.3.4} \contentsline {subsection}{\numberline {10.3.5}Kernel parameter: \texttt {nokaslr}}{50}{subsection.10.3.5} \contentsline {section}{\numberline {10.4}Using kdb}{50}{section.10.4} \contentsline {subsection}{\numberline {10.4.1}Quick start for kdb on a serial port}{50}{subsection.10.4.1} \contentsline {subsection}{\numberline {10.4.2}Quick start for kdb using a keyboard connected console}{51}{subsection.10.4.2} \contentsline {section}{\numberline {10.5}Using kgdb / gdb}{51}{section.10.5} \contentsline {subsection}{\numberline {10.5.1}Connecting with gdb to a serial port}{52}{subsection.10.5.1} \contentsline {section}{\numberline {10.6}kgdb and kdb interoperability}{52}{section.10.6} \contentsline {subsection}{\numberline {10.6.1}Switching between kdb and kgdb}{53}{subsection.10.6.1} \contentsline {subsubsection}{Switching from kgdb to kdb}{53}{subsubsection*.7} \contentsline {subsubsection}{Change from kdb to kgdb}{53}{subsubsection*.8} \contentsline {subsection}{\numberline {10.6.2}Running kdb commands from gdb}{53}{subsection.10.6.2} \contentsline {section}{\numberline {10.7}kgdb Test Suite}{54}{section.10.7} \contentsline {section}{\numberline {10.8}Kernel Debugger Internals}{54}{section.10.8} \contentsline {subsection}{\numberline {10.8.1}Architecture Specifics}{54}{subsection.10.8.1} \contentsline {subsection}{\numberline {10.8.2}kgdboc internals}{59}{subsection.10.8.2} \contentsline {subsubsection}{kgdboc and uarts}{59}{subsubsection*.22} \contentsline {subsubsection}{kgdboc and keyboards}{59}{subsubsection*.23} \contentsline {subsubsection}{kgdboc and kms}{60}{subsubsection*.24} \contentsline {section}{\numberline {10.9}Credits}{60}{section.10.9} \contentsline {chapter}{\numberline {11}Linux Kernel Selftests}{61}{chapter.11} \contentsline {section}{\numberline {11.1}Running the selftests (hotplug tests are run in limited mode)}{61}{section.11.1} \contentsline {section}{\numberline {11.2}Running a subset of selftests}{61}{section.11.2} \contentsline {section}{\numberline {11.3}Running the full range hotplug selftests}{62}{section.11.3} \contentsline {section}{\numberline {11.4}Install selftests}{62}{section.11.4} \contentsline {section}{\numberline {11.5}Running installed selftests}{62}{section.11.5} \contentsline {section}{\numberline {11.6}Contributing new tests}{62}{section.11.6} \contentsline {section}{\numberline {11.7}Contributing new tests (details)}{62}{section.11.7} \contentsline {section}{\numberline {11.8}Test Harness}{63}{section.11.8} \contentsline {subsection}{\numberline {11.8.1}Example}{63}{subsection.11.8.1} \contentsline {subsection}{\numberline {11.8.2}Helpers}{63}{subsection.11.8.2} \contentsline {subsection}{\numberline {11.8.3}Operators}{65}{subsection.11.8.3} \contentsline {chapter}{Index}{71}{section*.56}