From e7e2feb179082ec5e635191a400609155cebbc4d Mon Sep 17 00:00:00 2001 From: ChUrl Date: Wed, 8 Mar 2023 15:18:50 +0100 Subject: [PATCH] Sync after submission --- chap/background.aux | 235 ++++++++++++++++++++++++++++++ chap/background.tex | 14 +- chap/conclusion.aux | 202 ++++++++++++++++++++++++++ chap/figures.aux | 192 ++++++++++++++++++++++++ chap/implementation.aux | 290 +++++++++++++++++++++++++++++++++++++ chap/implementation.tex | 2 +- chap/interrupthandling.aux | 234 ++++++++++++++++++++++++++++++ chap/interrupthandling.tex | 30 ++-- chap/introduction.aux | 188 ++++++++++++++++++++++++ chap/tables.aux | 250 ++++++++++++++++++++++++++++++++ chap/testing.aux | 192 ++++++++++++++++++++++++ class/thesis.cls | 4 +- decl.pdf | Bin 0 -> 62238 bytes properties.tex | 2 +- 14 files changed, 1807 insertions(+), 28 deletions(-) create mode 100644 chap/background.aux create mode 100644 chap/conclusion.aux create mode 100644 chap/figures.aux create mode 100644 chap/implementation.aux create mode 100644 chap/interrupthandling.aux create mode 100644 chap/introduction.aux create mode 100644 chap/tables.aux create mode 100644 chap/testing.aux create mode 100644 decl.pdf diff --git a/chap/background.aux b/chap/background.aux new file mode 100644 index 0000000..0a5433d --- /dev/null +++ b/chap/background.aux @@ -0,0 +1,235 @@ +\relax +\providecommand{\transparent@use}[1]{} +\providecommand\hyper@newdestlabel[2]{} +\@writefile{listings}{\addvspace {10pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {2}Background}{3}{chapter.2}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{loa}{\addvspace {10\p@ }} +\newlabel{ch:background}{{2}{3}{Background}{chapter.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.1}Handling of External Events}{4}{section.2.1}\protected@file@percent } +\newlabel{sec:eventhandling}{{2.1}{4}{Handling of External Events}{section.2.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.2}Fundamental Concepts}{4}{section.2.2}\protected@file@percent } +\newlabel{sec:fundamentals}{{2.2}{4}{Fundamental Concepts}{section.2.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Interrupt}{4}{subsection.2.2.1}\protected@file@percent } +\newlabel{subsec:interrupt}{{2.2.1}{4}{Interrupt}{subsection.2.2.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.2}Interrupt Controller}{5}{subsection.2.2.2}\protected@file@percent } +\newlabel{subsec:controller}{{2.2.2}{5}{Interrupt Controller}{subsection.2.2.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.3}Interrupt Handler}{5}{subsection.2.2.3}\protected@file@percent } +\newlabel{subsec:handler}{{2.2.3}{5}{Interrupt Handler}{subsection.2.2.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Interrupt Handler Execution.\relax }}{6}{figure.2.1}\protected@file@percent } +\providecommand*\caption@xref[2]{\@setref\relax\@undefined{#1}} +\newlabel{fig:interruptexecution}{{2.1}{6}{Interrupt Handler Execution.\relax }{figure.2.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.4}Interrupt Trigger Mode}{6}{subsection.2.2.4}\protected@file@percent } +\newlabel{subsec:triggermode}{{2.2.4}{6}{Interrupt Trigger Mode}{subsection.2.2.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.5}Spurious Interrupt}{6}{subsection.2.2.5}\protected@file@percent } +\newlabel{subsec:spurious}{{2.2.5}{6}{Spurious Interrupt}{subsection.2.2.5}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.3}Used Technologies}{7}{section.2.3}\protected@file@percent } +\newlabel{sec:technologies}{{2.3}{7}{Used Technologies}{section.2.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3.1}Advanced Configuration and Power Interface}{7}{subsection.2.3.1}\protected@file@percent } +\newlabel{subsec:acpi}{{2.3.1}{7}{Advanced Configuration and Power Interface}{subsection.2.3.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3.2}CPU Identification}{7}{subsection.2.3.2}\protected@file@percent } +\newlabel{subsec:cpuid}{{2.3.2}{7}{CPU Identification}{subsection.2.3.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3.3}Symmetric Multiprocessing}{7}{subsection.2.3.3}\protected@file@percent } +\newlabel{subsec:smp}{{2.3.3}{7}{Symmetric Multiprocessing}{subsection.2.3.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3.4}Model Specific Register}{8}{subsection.2.3.4}\protected@file@percent } +\newlabel{subsec:msr}{{2.3.4}{8}{Model Specific Register}{subsection.2.3.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3.5}Memory Mapped I/O}{8}{subsection.2.3.5}\protected@file@percent } +\newlabel{subsec:mmio}{{2.3.5}{8}{Memory Mapped I/O}{subsection.2.3.5}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3.6}Programmable Interval Timer}{8}{subsection.2.3.6}\protected@file@percent } +\newlabel{subsec:pit}{{2.3.6}{8}{Programmable Interval Timer}{subsection.2.3.6}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.4}Intel's Interrupt Controllers}{8}{section.2.4}\protected@file@percent } +\newlabel{sec:intelcontrollers}{{2.4}{8}{Intel's Interrupt Controllers}{section.2.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4.1}Programmable Interrupt Controller}{8}{subsection.2.4.1}\protected@file@percent } +\newlabel{subsec:intelpic}{{2.4.1}{8}{Programmable Interrupt Controller}{subsection.2.4.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces The PC/AT PIC Architecture~\blx@tocontentsinit {0}\autocite [sec.~1.13]{pcat}.\relax }}{9}{figure.2.2}\protected@file@percent } +\newlabel{fig:pcatpic}{{2.2}{9}{The PC/AT PIC Architecture~\autocite [sec.~1.13]{pcat}.\relax }{figure.2.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4.2}Advanced Programmable Interrupt Controller}{10}{subsection.2.4.2}\protected@file@percent } +\newlabel{subsec:intelapic}{{2.4.2}{10}{Advanced Programmable Interrupt Controller}{subsection.2.4.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces The Discrete APIC Architecture~\blx@tocontentsinit {0}\autocite [sec.~5.1]{mpspec}.\relax }}{11}{figure.2.3}\protected@file@percent } +\newlabel{fig:discreteapic}{{2.3}{11}{The Discrete APIC Architecture~\autocite [sec.~5.1]{mpspec}.\relax }{figure.2.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces The Integrated APIC Architecture~\blx@tocontentsinit {0}\autocite [sec.~5.2]{mpspec}.\relax }}{12}{figure.2.4}\protected@file@percent } +\newlabel{fig:integratedapic}{{2.4}{12}{The Integrated APIC Architecture~\autocite [sec.~5.2]{mpspec}.\relax }{figure.2.4}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces System Bus vs APIC Bus~\blx@tocontentsinit {0}\autocite [sec.~3.11.1]{ia32}.\relax }}{13}{figure.2.5}\protected@file@percent } +\newlabel{fig:systemvsapicbus}{{2.5}{13}{System Bus vs APIC Bus~\autocite [sec.~3.11.1]{ia32}.\relax }{figure.2.5}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.5}PC/AT Compatibility}{13}{section.2.5}\protected@file@percent } +\newlabel{sec:pcatcompat}{{2.5}{13}{PC/AT Compatibility}{section.2.5}{}} +\@setckpt{chap/background}{ +\setcounter{page}{15} +\setcounter{equation}{0} +\setcounter{enumi}{5} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{16} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{2} +\setcounter{section}{5} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{5} +\setcounter{table}{0} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{4} +\setcounter{FancyVerbLine}{0} +\setcounter{linenumber}{1} +\setcounter{LN@truepage}{22} +\setcounter{FV@TrueTabGroupLevel}{0} +\setcounter{FV@TrueTabCounter}{0} +\setcounter{FV@HighlightLinesStart}{0} +\setcounter{FV@HighlightLinesStop}{0} +\setcounter{FancyVerbLineBreakLast}{0} +\setcounter{FV@BreakBufferDepth}{0} +\setcounter{float@type}{16} +\setcounter{minted@FancyVerbLineTemp}{0} +\setcounter{minted@pygmentizecounter}{0} +\setcounter{listing}{0} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{6} +\setcounter{continuedfloat}{0} +\setcounter{subfigure}{0} +\setcounter{subtable}{0} +\setcounter{section@level}{1} +\setcounter{Item}{10} +\setcounter{Hfootnote}{16} +\setcounter{bookmark@seq@number}{20} +\setcounter{AlgoLine}{0} +\setcounter{algocfline}{0} +\setcounter{algocfproc}{0} +\setcounter{algocf}{0} +\setcounter{lofdepth}{1} +\setcounter{lotdepth}{1} +\setcounter{svg@param@lastpage}{0} +\setcounter{svg@param@currpage}{-1} +\setcounter{su@anzahl}{0} +\setcounter{LT@tables}{0} +\setcounter{LT@chunks}{0} +\setcounter{@pps}{0} +\setcounter{@ppsavesec}{0} +\setcounter{@ppsaveapp}{0} +\setcounter{AM@survey}{0} +\setcounter{tabx@nest}{0} +\setcounter{listtotal}{0} +\setcounter{listcount}{0} +\setcounter{liststart}{0} +\setcounter{liststop}{0} +\setcounter{citecount}{0} +\setcounter{citetotal}{0} +\setcounter{multicitecount}{0} +\setcounter{multicitetotal}{0} +\setcounter{instcount}{30} +\setcounter{maxnames}{3} +\setcounter{minnames}{3} +\setcounter{maxitems}{3} +\setcounter{minitems}{1} +\setcounter{citecounter}{0} +\setcounter{maxcitecounter}{0} +\setcounter{savedcitecounter}{0} +\setcounter{uniquelist}{0} +\setcounter{uniquename}{0} +\setcounter{refsection}{0} +\setcounter{refsegment}{0} +\setcounter{maxextratitle}{0} +\setcounter{maxextratitleyear}{0} +\setcounter{maxextraname}{0} +\setcounter{maxextradate}{0} +\setcounter{maxextraalpha}{0} +\setcounter{abbrvpenalty}{50} +\setcounter{highnamepenalty}{50} +\setcounter{lownamepenalty}{25} +\setcounter{maxparens}{3} +\setcounter{parenlevel}{0} +\setcounter{blx@maxsection}{0} +\setcounter{mincomprange}{10} +\setcounter{maxcomprange}{100000} +\setcounter{mincompwidth}{1} +\setcounter{afterword}{0} +\setcounter{savedafterword}{0} +\setcounter{annotator}{0} +\setcounter{savedannotator}{0} +\setcounter{author}{0} +\setcounter{savedauthor}{0} +\setcounter{bookauthor}{0} +\setcounter{savedbookauthor}{0} +\setcounter{commentator}{0} +\setcounter{savedcommentator}{0} +\setcounter{editor}{0} +\setcounter{savededitor}{0} +\setcounter{editora}{0} +\setcounter{savededitora}{0} +\setcounter{editorb}{0} +\setcounter{savededitorb}{0} +\setcounter{editorc}{0} +\setcounter{savededitorc}{0} +\setcounter{foreword}{0} +\setcounter{savedforeword}{0} +\setcounter{holder}{0} +\setcounter{savedholder}{0} +\setcounter{introduction}{0} +\setcounter{savedintroduction}{0} +\setcounter{namea}{0} +\setcounter{savednamea}{0} +\setcounter{nameb}{0} +\setcounter{savednameb}{0} +\setcounter{namec}{0} +\setcounter{savednamec}{0} +\setcounter{translator}{0} +\setcounter{savedtranslator}{0} +\setcounter{shortauthor}{0} +\setcounter{savedshortauthor}{0} +\setcounter{shorteditor}{0} +\setcounter{savedshorteditor}{0} +\setcounter{labelname}{0} +\setcounter{savedlabelname}{0} +\setcounter{institution}{0} +\setcounter{savedinstitution}{0} +\setcounter{lista}{0} +\setcounter{savedlista}{0} +\setcounter{listb}{0} +\setcounter{savedlistb}{0} +\setcounter{listc}{0} +\setcounter{savedlistc}{0} +\setcounter{listd}{0} +\setcounter{savedlistd}{0} +\setcounter{liste}{0} +\setcounter{savedliste}{0} +\setcounter{listf}{0} +\setcounter{savedlistf}{0} +\setcounter{location}{0} +\setcounter{savedlocation}{0} +\setcounter{organization}{0} +\setcounter{savedorganization}{0} +\setcounter{origlocation}{0} +\setcounter{savedoriglocation}{0} +\setcounter{origpublisher}{0} +\setcounter{savedorigpublisher}{0} +\setcounter{publisher}{0} +\setcounter{savedpublisher}{0} +\setcounter{language}{0} +\setcounter{savedlanguage}{0} +\setcounter{origlanguage}{0} +\setcounter{savedoriglanguage}{0} +\setcounter{pageref}{0} +\setcounter{savedpageref}{0} +\setcounter{textcitecount}{0} +\setcounter{textcitetotal}{0} +\setcounter{textcitemaxnames}{0} +\setcounter{biburlbigbreakpenalty}{100} +\setcounter{biburlbreakpenalty}{200} +\setcounter{biburlnumpenalty}{0} +\setcounter{biburlucpenalty}{0} +\setcounter{biburllcpenalty}{0} +\setcounter{smartand}{1} +\setcounter{bbx:relatedcount}{0} +\setcounter{bbx:relatedtotal}{0} +\setcounter{cbx@tempcnta}{0} +\setcounter{cbx@tempcntb}{2} +\setcounter{cbx@tempcntc}{0} +\setcounter{cbx@tempcntd}{-1} +\setcounter{tcb@cnt@codeblock}{0} +} diff --git a/chap/background.tex b/chap/background.tex index 5ac0f77..e427e8b 100644 --- a/chap/background.tex +++ b/chap/background.tex @@ -1,7 +1,7 @@ \chapter{Background} \label{ch:background} -In this chapter, important domain-specific concepts will be explained, to create the necessary foundation to follow \autoref{ch:implementation}. +In this chapter, important domain-specific concepts will be explained, to create the necessary foundation to follow \autoref{ch:interrupthandling} and \autoref{ch:implementation}. Important terms present in the glossary are marked in \textbf{bold} on their first occurrence. \clearpage @@ -304,7 +304,7 @@ In comparison to the PIC, the external interrupt handling sequence changed: \item When the interrupt is being handled by the OS, it sends an EOI to the local APIC\footnote{ In case of edge-triggered interrupts. For level-triggered interrupts see \autoref{subsec:ioapiceoi}.}, \ which clears the corresponding bit in the ISR\@. - Note how the OS only interacts directly with the local APIC, not the I/O APIC. + Note how the OS only interacts directly with the local APIC, not the I/O APIC\@. \end{enumerate} To allow splitting the APIC architecture into local APICs of multiple CPU cores and I/O APICs, the individual components communicate over a bus. @@ -334,12 +334,12 @@ A notable difference between xApic and x2Apic architectures is the register acce \label{sec:pcatcompat} For compatibility with older computer systems, two cascaded PICs are usually present in current computer systems (see \autoref{fig:discreteapic}/\autoref{fig:integratedapic}). -The local APIC can be initialized to operate with these PICs instead of the I/O APIC, this is called \textbf{\gls{virtual wire mode}}. -It is possible to operate with both the PIC and I/O APIC as controllers for external interrupts in \textit{mixed mode}, but this is very uncommon. -Because the presence of a local APIC usually guarantees the presence of an I/O APIC, this thesis only focuses on interrupt handling with either two PICs (\textbf{\gls{pic mode}}), in case no APIC is available, or the full APIC architecture (local APIC and I/O APIC in \textbf{\gls{symmetric io mode}})\footnote{ - For more information on operating modes, consult the \textquote{MultiProcessor Specification}~\autocite[sec.~3.6.2.1]{mpspec}.}. +The local APIC can be initialized to operate with these PICs instead of the I/O APIC, this is called \textbf{\gls{virtual wire mode}}~\autocite[sec.~3.6.2.2]{mpspec}. +It is possible to operate with both the PIC and I/O APIC as controllers for external interrupts in \textit{mixed mode}~\autocite[sec.~3.6.2.3]{mpspec}, but this is very uncommon. +Because the presence of a local APIC usually guarantees the presence of an I/O APIC, this thesis only focuses on interrupt handling with either two PICs with a single processor (\textbf{\gls{pic mode}}~\autocite[sec.~3.6.2.1]{mpspec}), in case no APIC is available, or the full APIC architecture (local APIC and I/O APIC in \textbf{\gls{symmetric io mode}}~\cite[sec.~3.6.2.3]{mpspec}). +Hardware following the MultiProcessor Specification must either implement PIC mode or virtual wire mode for PC/AT compatibility. -To switch from PIC to symmetric I/O mode, some (older) hardware provides the \textbf{\gls{imcr}}, a special register that controls the physical connection of the PIC to the CPU\@. +To switch from PIC mode (if implemented) to symmetric I/O mode, the \textbf{\gls{imcr}}, a special register which controls the physical connection of the PIC to the CPU, has to be configured. In the original discrete APIC architecture, the IMCR can choose if either the PIC or local APIC is connected to the CPU (see \autoref{fig:discreteapic}), since the xApic architecture the IMCR only connects or disconnects the PIC to the local APIC's LINT0 INTI (see \autoref{fig:integratedapic}). When the IMCR is set to connect the PIC, and the xApic \textquote{global enable/disable} flag is unset (see \autoref{subsec:lapicenable}), the system is functionally equivalent to an IA-32 CPU without an integrated local APIC~\autocite[sec.~3.11.4.3]{ia32}. Modern systems (and QEMU) do not support PIC Mode and thus do not have the IMCR\@. diff --git a/chap/conclusion.aux b/chap/conclusion.aux new file mode 100644 index 0000000..c51c9f2 --- /dev/null +++ b/chap/conclusion.aux @@ -0,0 +1,202 @@ +\relax +\providecommand{\transparent@use}[1]{} +\providecommand\hyper@newdestlabel[2]{} +\@writefile{listings}{\addvspace {10pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {6}Conclusion}{53}{chapter.6}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{loa}{\addvspace {10\p@ }} +\newlabel{ch:conclusion}{{6}{53}{Conclusion}{chapter.6}{}} +\@writefile{toc}{\contentsline {section}{\numberline {6.1}Comparing PIC and APIC Implementations}{54}{section.6.1}\protected@file@percent } +\newlabel{sec:comparingpicapic}{{6.1}{54}{Comparing PIC and APIC Implementations}{section.6.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {6.2}Future Improvements}{54}{section.6.2}\protected@file@percent } +\newlabel{sec:futureimprov}{{6.2}{54}{Future Improvements}{section.6.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.1}Dependence on ACPI}{54}{subsection.6.2.1}\protected@file@percent } +\newlabel{subsec:acpidependance}{{6.2.1}{54}{Dependence on ACPI}{subsection.6.2.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.2}Discrete APIC and x2Apic}{55}{subsection.6.2.2}\protected@file@percent } +\newlabel{subsec:discretex2}{{6.2.2}{55}{Discrete APIC and x2Apic}{subsection.6.2.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.3}PCI Devices}{55}{subsection.6.2.3}\protected@file@percent } +\newlabel{subsec:pcidevices}{{6.2.3}{55}{PCI Devices}{subsection.6.2.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.4}Multiprocessor Systems}{55}{subsection.6.2.4}\protected@file@percent } +\newlabel{subsec:multiprocessor}{{6.2.4}{55}{Multiprocessor Systems}{subsection.6.2.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.5}UEFI Support}{56}{subsection.6.2.5}\protected@file@percent } +\newlabel{subsec:uefisupport}{{6.2.5}{56}{UEFI Support}{subsection.6.2.5}{}} +\@setckpt{chap/conclusion}{ +\setcounter{page}{57} +\setcounter{equation}{0} +\setcounter{enumi}{4} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{5} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{6} +\setcounter{section}{2} +\setcounter{subsection}{5} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{0} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{188} +\setcounter{FancyVerbLine}{12} +\setcounter{linenumber}{1} +\setcounter{LN@truepage}{64} +\setcounter{FV@TrueTabGroupLevel}{0} +\setcounter{FV@TrueTabCounter}{0} +\setcounter{FV@HighlightLinesStart}{0} +\setcounter{FV@HighlightLinesStop}{0} +\setcounter{FancyVerbLineBreakLast}{0} +\setcounter{FV@BreakBufferDepth}{0} +\setcounter{float@type}{16} +\setcounter{minted@FancyVerbLineTemp}{0} +\setcounter{minted@pygmentizecounter}{48} +\setcounter{listing}{0} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{6} +\setcounter{continuedfloat}{0} +\setcounter{subfigure}{0} +\setcounter{subtable}{0} +\setcounter{section@level}{2} +\setcounter{Item}{50} +\setcounter{Hfootnote}{45} +\setcounter{bookmark@seq@number}{71} +\setcounter{AlgoLine}{0} +\setcounter{algocfline}{0} +\setcounter{algocfproc}{0} +\setcounter{algocf}{0} +\setcounter{lofdepth}{1} +\setcounter{lotdepth}{1} +\setcounter{svg@param@lastpage}{0} +\setcounter{svg@param@currpage}{-1} +\setcounter{su@anzahl}{0} +\setcounter{LT@tables}{0} +\setcounter{LT@chunks}{0} +\setcounter{@pps}{0} +\setcounter{@ppsavesec}{0} +\setcounter{@ppsaveapp}{0} +\setcounter{AM@survey}{0} +\setcounter{tabx@nest}{0} +\setcounter{listtotal}{0} +\setcounter{listcount}{0} +\setcounter{liststart}{0} +\setcounter{liststop}{0} +\setcounter{citecount}{0} +\setcounter{citetotal}{0} +\setcounter{multicitecount}{0} +\setcounter{multicitetotal}{0} +\setcounter{instcount}{101} +\setcounter{maxnames}{3} +\setcounter{minnames}{3} +\setcounter{maxitems}{3} +\setcounter{minitems}{1} +\setcounter{citecounter}{0} +\setcounter{maxcitecounter}{0} +\setcounter{savedcitecounter}{0} +\setcounter{uniquelist}{0} +\setcounter{uniquename}{0} +\setcounter{refsection}{0} +\setcounter{refsegment}{0} +\setcounter{maxextratitle}{0} +\setcounter{maxextratitleyear}{0} +\setcounter{maxextraname}{0} +\setcounter{maxextradate}{0} +\setcounter{maxextraalpha}{0} +\setcounter{abbrvpenalty}{50} +\setcounter{highnamepenalty}{50} +\setcounter{lownamepenalty}{25} +\setcounter{maxparens}{3} +\setcounter{parenlevel}{0} +\setcounter{blx@maxsection}{0} +\setcounter{mincomprange}{10} +\setcounter{maxcomprange}{100000} +\setcounter{mincompwidth}{1} +\setcounter{afterword}{0} +\setcounter{savedafterword}{0} +\setcounter{annotator}{0} +\setcounter{savedannotator}{0} +\setcounter{author}{0} +\setcounter{savedauthor}{0} +\setcounter{bookauthor}{0} +\setcounter{savedbookauthor}{0} +\setcounter{commentator}{0} +\setcounter{savedcommentator}{0} +\setcounter{editor}{0} +\setcounter{savededitor}{0} +\setcounter{editora}{0} +\setcounter{savededitora}{0} +\setcounter{editorb}{0} +\setcounter{savededitorb}{0} +\setcounter{editorc}{0} +\setcounter{savededitorc}{0} +\setcounter{foreword}{0} +\setcounter{savedforeword}{0} +\setcounter{holder}{0} +\setcounter{savedholder}{0} +\setcounter{introduction}{0} +\setcounter{savedintroduction}{0} +\setcounter{namea}{0} +\setcounter{savednamea}{0} +\setcounter{nameb}{0} +\setcounter{savednameb}{0} +\setcounter{namec}{0} +\setcounter{savednamec}{0} +\setcounter{translator}{0} +\setcounter{savedtranslator}{0} +\setcounter{shortauthor}{0} +\setcounter{savedshortauthor}{0} +\setcounter{shorteditor}{0} +\setcounter{savedshorteditor}{0} +\setcounter{labelname}{0} +\setcounter{savedlabelname}{0} +\setcounter{institution}{0} +\setcounter{savedinstitution}{0} +\setcounter{lista}{0} +\setcounter{savedlista}{0} +\setcounter{listb}{0} +\setcounter{savedlistb}{0} +\setcounter{listc}{0} +\setcounter{savedlistc}{0} +\setcounter{listd}{0} +\setcounter{savedlistd}{0} +\setcounter{liste}{0} +\setcounter{savedliste}{0} +\setcounter{listf}{0} +\setcounter{savedlistf}{0} +\setcounter{location}{0} +\setcounter{savedlocation}{0} +\setcounter{organization}{0} +\setcounter{savedorganization}{0} +\setcounter{origlocation}{0} +\setcounter{savedoriglocation}{0} +\setcounter{origpublisher}{0} +\setcounter{savedorigpublisher}{0} +\setcounter{publisher}{0} +\setcounter{savedpublisher}{0} +\setcounter{language}{0} +\setcounter{savedlanguage}{0} +\setcounter{origlanguage}{0} +\setcounter{savedoriglanguage}{0} +\setcounter{pageref}{0} +\setcounter{savedpageref}{0} +\setcounter{textcitecount}{0} +\setcounter{textcitetotal}{0} +\setcounter{textcitemaxnames}{0} +\setcounter{biburlbigbreakpenalty}{100} +\setcounter{biburlbreakpenalty}{200} +\setcounter{biburlnumpenalty}{0} +\setcounter{biburlucpenalty}{0} +\setcounter{biburllcpenalty}{0} +\setcounter{smartand}{1} +\setcounter{bbx:relatedcount}{0} +\setcounter{bbx:relatedtotal}{0} +\setcounter{cbx@tempcnta}{0} +\setcounter{cbx@tempcntb}{20} +\setcounter{cbx@tempcntc}{0} +\setcounter{cbx@tempcntd}{-1} +\setcounter{tcb@cnt@codeblock}{0} +} diff --git a/chap/figures.aux b/chap/figures.aux new file mode 100644 index 0000000..849ad2f --- /dev/null +++ b/chap/figures.aux @@ -0,0 +1,192 @@ +\relax +\providecommand{\transparent@use}[1]{} +\providecommand\hyper@newdestlabel[2]{} +\@writefile{listings}{\addvspace {10pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {A}Figures}{59}{appendix.1.A}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{loa}{\addvspace {10\p@ }} +\newlabel{ch:figures}{{A}{59}{Figures}{appendix.1.A}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {A.1}{\ignorespaces Enabling the APIC Subsystem.\relax }}{60}{figure.1.A.1}\protected@file@percent } +\newlabel{fig:apicenable}{{A.1}{60}{Enabling the APIC Subsystem.\relax }{figure.1.A.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {A.2}{\ignorespaces Starting SMP Operation.\relax }}{61}{figure.1.A.2}\protected@file@percent } +\newlabel{fig:smpenable}{{A.2}{61}{Starting SMP Operation.\relax }{figure.1.A.2}{}} +\@setckpt{chap/figures}{ +\setcounter{page}{63} +\setcounter{equation}{0} +\setcounter{enumi}{4} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{1} +\setcounter{section}{0} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{2} +\setcounter{table}{0} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{188} +\setcounter{FancyVerbLine}{12} +\setcounter{linenumber}{1} +\setcounter{LN@truepage}{70} +\setcounter{FV@TrueTabGroupLevel}{0} +\setcounter{FV@TrueTabCounter}{0} +\setcounter{FV@HighlightLinesStart}{0} +\setcounter{FV@HighlightLinesStop}{0} +\setcounter{FancyVerbLineBreakLast}{0} +\setcounter{FV@BreakBufferDepth}{0} +\setcounter{float@type}{16} +\setcounter{minted@FancyVerbLineTemp}{0} +\setcounter{minted@pygmentizecounter}{48} +\setcounter{listing}{0} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{6} +\setcounter{continuedfloat}{0} +\setcounter{subfigure}{0} +\setcounter{subtable}{0} +\setcounter{section@level}{2} +\setcounter{Item}{50} +\setcounter{Hfootnote}{45} +\setcounter{bookmark@seq@number}{72} +\setcounter{AlgoLine}{0} +\setcounter{algocfline}{0} +\setcounter{algocfproc}{0} +\setcounter{algocf}{0} +\setcounter{lofdepth}{1} +\setcounter{lotdepth}{1} +\setcounter{svg@param@lastpage}{0} +\setcounter{svg@param@currpage}{-1} +\setcounter{su@anzahl}{0} +\setcounter{LT@tables}{0} +\setcounter{LT@chunks}{0} +\setcounter{@pps}{1} +\setcounter{@ppsavesec}{6} +\setcounter{@ppsaveapp}{0} +\setcounter{AM@survey}{0} +\setcounter{tabx@nest}{0} +\setcounter{listtotal}{0} +\setcounter{listcount}{0} +\setcounter{liststart}{0} +\setcounter{liststop}{0} +\setcounter{citecount}{0} +\setcounter{citetotal}{0} +\setcounter{multicitecount}{0} +\setcounter{multicitetotal}{0} +\setcounter{instcount}{101} +\setcounter{maxnames}{3} +\setcounter{minnames}{3} +\setcounter{maxitems}{3} +\setcounter{minitems}{1} +\setcounter{citecounter}{0} +\setcounter{maxcitecounter}{0} +\setcounter{savedcitecounter}{0} +\setcounter{uniquelist}{0} +\setcounter{uniquename}{0} +\setcounter{refsection}{0} +\setcounter{refsegment}{0} +\setcounter{maxextratitle}{0} +\setcounter{maxextratitleyear}{0} +\setcounter{maxextraname}{0} +\setcounter{maxextradate}{0} +\setcounter{maxextraalpha}{0} +\setcounter{abbrvpenalty}{50} +\setcounter{highnamepenalty}{50} +\setcounter{lownamepenalty}{25} +\setcounter{maxparens}{3} +\setcounter{parenlevel}{0} +\setcounter{blx@maxsection}{0} +\setcounter{mincomprange}{10} +\setcounter{maxcomprange}{100000} +\setcounter{mincompwidth}{1} +\setcounter{afterword}{0} +\setcounter{savedafterword}{0} +\setcounter{annotator}{0} +\setcounter{savedannotator}{0} +\setcounter{author}{0} +\setcounter{savedauthor}{0} +\setcounter{bookauthor}{0} +\setcounter{savedbookauthor}{0} +\setcounter{commentator}{0} +\setcounter{savedcommentator}{0} +\setcounter{editor}{0} +\setcounter{savededitor}{0} +\setcounter{editora}{0} +\setcounter{savededitora}{0} +\setcounter{editorb}{0} +\setcounter{savededitorb}{0} +\setcounter{editorc}{0} +\setcounter{savededitorc}{0} +\setcounter{foreword}{0} +\setcounter{savedforeword}{0} +\setcounter{holder}{0} +\setcounter{savedholder}{0} +\setcounter{introduction}{0} +\setcounter{savedintroduction}{0} +\setcounter{namea}{0} +\setcounter{savednamea}{0} +\setcounter{nameb}{0} +\setcounter{savednameb}{0} +\setcounter{namec}{0} +\setcounter{savednamec}{0} +\setcounter{translator}{0} +\setcounter{savedtranslator}{0} +\setcounter{shortauthor}{0} +\setcounter{savedshortauthor}{0} +\setcounter{shorteditor}{0} +\setcounter{savedshorteditor}{0} +\setcounter{labelname}{0} +\setcounter{savedlabelname}{0} +\setcounter{institution}{0} +\setcounter{savedinstitution}{0} +\setcounter{lista}{0} +\setcounter{savedlista}{0} +\setcounter{listb}{0} +\setcounter{savedlistb}{0} +\setcounter{listc}{0} +\setcounter{savedlistc}{0} +\setcounter{listd}{0} +\setcounter{savedlistd}{0} +\setcounter{liste}{0} +\setcounter{savedliste}{0} +\setcounter{listf}{0} +\setcounter{savedlistf}{0} +\setcounter{location}{0} +\setcounter{savedlocation}{0} +\setcounter{organization}{0} +\setcounter{savedorganization}{0} +\setcounter{origlocation}{0} +\setcounter{savedoriglocation}{0} +\setcounter{origpublisher}{0} +\setcounter{savedorigpublisher}{0} +\setcounter{publisher}{0} +\setcounter{savedpublisher}{0} +\setcounter{language}{0} +\setcounter{savedlanguage}{0} +\setcounter{origlanguage}{0} +\setcounter{savedoriglanguage}{0} +\setcounter{pageref}{0} +\setcounter{savedpageref}{0} +\setcounter{textcitecount}{0} +\setcounter{textcitetotal}{0} +\setcounter{textcitemaxnames}{0} +\setcounter{biburlbigbreakpenalty}{100} +\setcounter{biburlbreakpenalty}{200} +\setcounter{biburlnumpenalty}{0} +\setcounter{biburlucpenalty}{0} +\setcounter{biburllcpenalty}{0} +\setcounter{smartand}{1} +\setcounter{bbx:relatedcount}{0} +\setcounter{bbx:relatedtotal}{0} +\setcounter{cbx@tempcnta}{0} +\setcounter{cbx@tempcntb}{20} +\setcounter{cbx@tempcntc}{0} +\setcounter{cbx@tempcntd}{-1} +\setcounter{tcb@cnt@codeblock}{0} +} diff --git a/chap/implementation.aux b/chap/implementation.aux new file mode 100644 index 0000000..b8d2879 --- /dev/null +++ b/chap/implementation.aux @@ -0,0 +1,290 @@ +\relax +\providecommand{\transparent@use}[1]{} +\providecommand\hyper@newdestlabel[2]{} +\@writefile{listings}{\addvspace {10pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {4}Implementation}{29}{chapter.4}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{loa}{\addvspace {10\p@ }} +\newlabel{ch:implementation}{{4}{29}{Implementation}{chapter.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4.1}Design Decisions and Scope}{30}{section.4.1}\protected@file@percent } +\newlabel{sec:design}{{4.1}{30}{Design Decisions and Scope}{section.4.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.1}{\ignorespaces Caller Hierarchy of the Main Components.\relax }}{30}{figure.4.1}\protected@file@percent } +\newlabel{fig:implarch}{{4.1}{30}{Caller Hierarchy of the Main Components.\relax }{figure.4.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4.2}Integration into HhuOS}{32}{section.4.2}\protected@file@percent } +\newlabel{sec:apxhhuos}{{4.2}{32}{Integration into HhuOS}{section.4.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.2.1}Interrupt Handling in HhuOS}{32}{subsection.4.2.1}\protected@file@percent } +\newlabel{subsec:apxcurrenthhuos}{{4.2.1}{32}{Interrupt Handling in HhuOS}{subsection.4.2.1}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.1}{\ignorespaces \hspace *{1ex}The InterruptHandler Interface (InterruptHandler.h)~\blx@tocontentsinit {0}\autocite {hhuos}}}{33}{tcb@cnt@codeblock.4.1}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.2}{\ignorespaces \hspace *{1ex}Assigning an Interrupt Handler (InterruptDispatcher.cpp)~\blx@tocontentsinit {0}\autocite {hhuos}}}{33}{tcb@cnt@codeblock.4.2}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.3}{\ignorespaces \hspace *{1ex}Triggering an Interrupt Handler (InterruptDispatcher.cpp)~\blx@tocontentsinit {0}\autocite {hhuos}}}{33}{tcb@cnt@codeblock.4.3}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.4}{\ignorespaces \hspace *{1ex}The PIT Interrupt Handler (Pit.cpp)~\blx@tocontentsinit {0}\autocite {hhuos}}}{33}{tcb@cnt@codeblock.4.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.2.2}Necessary Modifications to HhuOS}{33}{subsection.4.2.2}\protected@file@percent } +\newlabel{subsec:hhuosintegration}{{4.2.2}{33}{Necessary Modifications to HhuOS}{subsection.4.2.2}{}} +\newlabel{lst:interruptserviceafter}{{4.5}{34}{Necessary Modifications to HhuOS}{tcb@cnt@codeblock.4.5}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.5}{\ignorespaces \hspace *{1ex}Using the Correct Interrupt Controller (InterruptService.cpp)}}{34}{tcb@cnt@codeblock.4.5}\protected@file@percent } +\newlabel{lst:pithandlerafter}{{4.6}{34}{Necessary Modifications to HhuOS}{tcb@cnt@codeblock.4.6}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.6}{\ignorespaces \hspace *{1ex}Disabling PIT Preemption (Pit.cpp)}}{34}{tcb@cnt@codeblock.4.6}\protected@file@percent } +\newlabel{lst:systemafter}{{4.7}{34}{Necessary Modifications to HhuOS}{tcb@cnt@codeblock.4.7}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.7}{\ignorespaces \hspace *{1ex}Enabling the APIC System (System.cpp)}}{34}{tcb@cnt@codeblock.4.7}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.2.3}Public Interface of the APIC Subsystem}{34}{subsection.4.2.3}\protected@file@percent } +\newlabel{subsec:hhuospublicinterface}{{4.2.3}{34}{Public Interface of the APIC Subsystem}{subsection.4.2.3}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.8}{\ignorespaces \hspace *{1ex}The APIC Public Interface (Apic.h)}}{35}{tcb@cnt@codeblock.4.8}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {4.3}Local APIC}{35}{section.4.3}\protected@file@percent } +\newlabel{sec:apxlocalapic}{{4.3}{35}{Local APIC}{section.4.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.1}Disabling PIC Mode}{35}{subsection.4.3.1}\protected@file@percent } +\newlabel{subsec:apxdisablepic}{{4.3.1}{35}{Disabling PIC Mode}{subsection.4.3.1}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.9}{\ignorespaces \hspace *{1ex}Disabling PIC Mode (LocalApic.cpp)}}{35}{tcb@cnt@codeblock.4.9}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.2}Accessing Local APIC Registers in xApic Mode}{36}{subsection.4.3.2}\protected@file@percent } +\newlabel{subsec:apxxapicregacc}{{4.3.2}{36}{Accessing Local APIC Registers in xApic Mode}{subsection.4.3.2}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.10}{\ignorespaces \hspace *{1ex}Allocating the Local APIC's MMIO Region (LocalApic.cpp)}}{36}{tcb@cnt@codeblock.4.10}\protected@file@percent } +\newlabel{lst:lapicmmiowrite}{{4.11}{36}{Accessing Local APIC Registers in xApic Mode}{tcb@cnt@codeblock.4.11}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.11}{\ignorespaces \hspace *{1ex}Writing a Local APIC MMIO Register (LocalApic.cpp)}}{36}{tcb@cnt@codeblock.4.11}\protected@file@percent } +\newlabel{lst:msrentry}{{4.12}{36}{Accessing Local APIC Registers in xApic Mode}{tcb@cnt@codeblock.4.12}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.12}{\ignorespaces \hspace *{1ex}The MSREntry Structure (LocalApicRegisters.h)}}{36}{tcb@cnt@codeblock.4.12}\protected@file@percent } +\newlabel{lst:svrentry}{{4.13}{36}{Accessing Local APIC Registers in xApic Mode}{tcb@cnt@codeblock.4.13}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.13}{\ignorespaces \hspace *{1ex}The SVREntry Structure (LocalApicRegisters.h)}}{36}{tcb@cnt@codeblock.4.13}\protected@file@percent } +\newlabel{lst:lvtentry}{{4.14}{37}{Accessing Local APIC Registers in xApic Mode}{tcb@cnt@codeblock.4.14}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.14}{\ignorespaces \hspace *{1ex}The LVTEntry Structure (LocalApicRegisters.h)}}{37}{tcb@cnt@codeblock.4.14}\protected@file@percent } +\newlabel{lst:icrentry}{{4.15}{37}{Accessing Local APIC Registers in xApic Mode}{tcb@cnt@codeblock.4.15}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.15}{\ignorespaces \hspace *{1ex}The ICREntry Structure (LocalApicRegisters.h)}}{37}{tcb@cnt@codeblock.4.15}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.16}{\ignorespaces \hspace *{1ex}Writing the IA32\textunderscore {}APIC\textunderscore {}BASE MSR (LocalApic.cpp)}}{37}{tcb@cnt@codeblock.4.16}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.17}{\ignorespaces \hspace *{1ex}Writing the SVR (LocalApic.cpp)}}{37}{tcb@cnt@codeblock.4.17}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.18}{\ignorespaces \hspace *{1ex}Writing the LVT (LocalApic.cpp)}}{37}{tcb@cnt@codeblock.4.18}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.19}{\ignorespaces \hspace *{1ex}Writing the ICR (LocalApic.cpp)}}{37}{tcb@cnt@codeblock.4.19}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.3}Initializing the LVT}{38}{subsection.4.3.3}\protected@file@percent } +\newlabel{subsec:apxlvtinit}{{4.3.3}{38}{Initializing the LVT}{subsection.4.3.3}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.20}{\ignorespaces \hspace *{1ex}Configuring the Local Error Interrupt (LocalApic.cpp)}}{38}{tcb@cnt@codeblock.4.20}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.4}Handling the Spurious Interrupt}{38}{subsection.4.3.4}\protected@file@percent } +\newlabel{subsec:apxsvr}{{4.3.4}{38}{Handling the Spurious Interrupt}{subsection.4.3.4}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.21}{\ignorespaces \hspace *{1ex}Setting the Spurious Interrupt Vector (LocalApic.cpp)}}{38}{tcb@cnt@codeblock.4.21}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.22}{\ignorespaces \hspace *{1ex}Checking for Spurious Interrupts (InterruptDispatcher.cpp)}}{38}{tcb@cnt@codeblock.4.22}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.23}{\ignorespaces \hspace *{1ex}Ignoring Spurious Interrupts (InterruptDispatcher.cpp)}}{38}{tcb@cnt@codeblock.4.23}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.5}Using the APIC Timer}{39}{subsection.4.3.5}\protected@file@percent } +\newlabel{subsec:apxapictimer}{{4.3.5}{39}{Using the APIC Timer}{subsection.4.3.5}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.24}{\ignorespaces \hspace *{1ex}Calibrating the APIC Timer (ApicTimer.cpp)}}{39}{tcb@cnt@codeblock.4.24}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.25}{\ignorespaces \hspace *{1ex}Microsecond Delay without Interrupts (Pit.cpp)}}{39}{tcb@cnt@codeblock.4.25}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.26}{\ignorespaces \hspace *{1ex}Handling the APIC Timer Interrupt (ApicTimer.cpp)}}{40}{tcb@cnt@codeblock.4.26}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.3.6}Handling Local APIC Errors}{40}{subsection.4.3.6}\protected@file@percent } +\newlabel{subsec:apxhandlingerror}{{4.3.6}{40}{Handling Local APIC Errors}{subsection.4.3.6}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.27}{\ignorespaces \hspace *{1ex}The Local APIC Error Interrupt Handler (ApicErrorHandler.cpp)}}{40}{tcb@cnt@codeblock.4.27}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {4.4}I/O APIC}{40}{section.4.4}\protected@file@percent } +\newlabel{sec:apxioapic}{{4.4}{40}{I/O APIC}{section.4.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.4.1}Accessing I/O APIC Registers}{40}{subsection.4.4.1}\protected@file@percent } +\newlabel{subsec:iolistings}{{4.4.1}{40}{Accessing I/O APIC Registers}{subsection.4.4.1}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.28}{\ignorespaces \hspace *{1ex}Writing an I/O APIC MMIO Register (IoApic.h)}}{40}{tcb@cnt@codeblock.4.28}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.29}{\ignorespaces \hspace *{1ex}Writing an I/O APIC Indirect Register (IoApic.cpp)}}{41}{tcb@cnt@codeblock.4.29}\protected@file@percent } +\newlabel{lst:redtblentry}{{4.30}{41}{Accessing I/O APIC Registers}{tcb@cnt@codeblock.4.30}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.30}{\ignorespaces \hspace *{1ex}The REDTBLEntry Structure (IoApicRegisters.h)}}{41}{tcb@cnt@codeblock.4.30}\protected@file@percent } +\newlabel{lst:writeredtbl}{{4.31}{41}{Accessing I/O APIC Registers}{tcb@cnt@codeblock.4.31}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.31}{\ignorespaces \hspace *{1ex}Writing the REDTBL (IoApic.cpp)}}{41}{tcb@cnt@codeblock.4.31}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.4.2}Interrupt Overrides}{41}{subsection.4.4.2}\protected@file@percent } +\newlabel{subsec:apxirqoverrides}{{4.4.2}{41}{Interrupt Overrides}{subsection.4.4.2}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.32}{\ignorespaces \hspace *{1ex}The External Interrupt Override Structure (IoApic.h)}}{41}{tcb@cnt@codeblock.4.32}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.33}{\ignorespaces \hspace *{1ex}Initializing the REDTBL (IoApic.cpp)}}{42}{tcb@cnt@codeblock.4.33}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.34}{\ignorespaces \hspace *{1ex}Unmasking an IRQ (Apic.cpp)}}{42}{tcb@cnt@codeblock.4.34}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.35}{\ignorespaces \hspace *{1ex}Unmasking an IRQ Internally (IoApic.cpp)}}{42}{tcb@cnt@codeblock.4.35}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {4.5}Symmetric Multiprocessing}{43}{section.4.5}\protected@file@percent } +\newlabel{sec:apxsymmetric}{{4.5}{43}{Symmetric Multiprocessing}{section.4.5}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.5.1}Issuing Inter-Processor Interrupts}{43}{subsection.4.5.1}\protected@file@percent } +\newlabel{subsec:apxipis}{{4.5.1}{43}{Issuing Inter-Processor Interrupts}{subsection.4.5.1}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.36}{\ignorespaces \hspace *{1ex}Issuing an INIT IPI (LocalApic.cpp)}}{43}{tcb@cnt@codeblock.4.36}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.37}{\ignorespaces \hspace *{1ex}Issuing a SIPI (LocalApic.cpp)}}{43}{tcb@cnt@codeblock.4.37}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.5.2}Preparing Symmetric Multiprocessing Startup}{43}{subsection.4.5.2}\protected@file@percent } +\newlabel{subsec:apxpreparesmp}{{4.5.2}{43}{Preparing Symmetric Multiprocessing Startup}{subsection.4.5.2}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.38}{\ignorespaces \hspace *{1ex}The Boot Routine's Variables (smp\textunderscore {}boot.asm)}}{44}{tcb@cnt@codeblock.4.38}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.39}{\ignorespaces \hspace *{1ex}Preparing the Boot Routine's Variables (ApicSmp.cpp)}}{44}{tcb@cnt@codeblock.4.39}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.40}{\ignorespaces \hspace *{1ex}Relocating the Boot Routine (ApicSmp.cpp)}}{45}{tcb@cnt@codeblock.4.40}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.5.3}Universal Startup Algorithm}{45}{subsection.4.5.3}\protected@file@percent } +\newlabel{subsec:apxmpusa}{{4.5.3}{45}{Universal Startup Algorithm}{subsection.4.5.3}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.41}{\ignorespaces \hspace *{1ex}The Universal Startup Algorithm (ApicSmp.cpp)}}{45}{tcb@cnt@codeblock.4.41}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.42}{\ignorespaces \hspace *{1ex}Signaling AP Boot Completion (smp\textunderscore {}entry.cpp)}}{45}{tcb@cnt@codeblock.4.42}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.5.4}Application Processor Boot Routine}{45}{subsection.4.5.4}\protected@file@percent } +\newlabel{subsec:apxapboot}{{4.5.4}{45}{Application Processor Boot Routine}{subsection.4.5.4}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.43}{\ignorespaces \hspace *{1ex}Preparing the Switch to Protected Mode (smp\textunderscore {}boot.asm)}}{46}{tcb@cnt@codeblock.4.43}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.44}{\ignorespaces \hspace *{1ex}Switching from Real Mode to Protected Mode (smp\textunderscore {}boot.asm)}}{46}{tcb@cnt@codeblock.4.44}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.45}{\ignorespaces \hspace *{1ex}Reusing Values from the BSP (smp\textunderscore {}boot.asm)}}{46}{tcb@cnt@codeblock.4.45}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.46}{\ignorespaces \hspace *{1ex}Calling the Entry Function (smp\textunderscore {}boot.asm)}}{47}{tcb@cnt@codeblock.4.46}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.5.5}Application Processor Post-Boot Routine}{47}{subsection.4.5.5}\protected@file@percent } +\newlabel{subsec:apxappostboot}{{4.5.5}{47}{Application Processor Post-Boot Routine}{subsection.4.5.5}{}} +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.47}{\ignorespaces \hspace *{1ex}Initializing the Core's Local APIC (LocalApic.cpp)}}{47}{tcb@cnt@codeblock.4.47}\protected@file@percent } +\@writefile{listings}{\contentsline {tcolorbox}{\numberline {4.48}{\ignorespaces \hspace *{1ex}Synchronizing the Arbitration IDs (LocalApic.cpp)}}{47}{tcb@cnt@codeblock.4.48}\protected@file@percent } +\@setckpt{chap/implementation}{ +\setcounter{page}{49} +\setcounter{equation}{0} +\setcounter{enumi}{4} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{7} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{4} +\setcounter{section}{5} +\setcounter{subsection}{5} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{1} +\setcounter{table}{0} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{182} +\setcounter{FancyVerbLine}{12} +\setcounter{linenumber}{1} +\setcounter{LN@truepage}{56} +\setcounter{FV@TrueTabGroupLevel}{0} +\setcounter{FV@TrueTabCounter}{0} +\setcounter{FV@HighlightLinesStart}{0} +\setcounter{FV@HighlightLinesStop}{0} +\setcounter{FancyVerbLineBreakLast}{0} +\setcounter{FV@BreakBufferDepth}{0} +\setcounter{float@type}{16} +\setcounter{minted@FancyVerbLineTemp}{0} +\setcounter{minted@pygmentizecounter}{48} +\setcounter{listing}{0} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{6} +\setcounter{continuedfloat}{0} +\setcounter{subfigure}{0} +\setcounter{subtable}{0} +\setcounter{section@level}{2} +\setcounter{Item}{50} +\setcounter{Hfootnote}{37} +\setcounter{bookmark@seq@number}{60} +\setcounter{AlgoLine}{0} +\setcounter{algocfline}{0} +\setcounter{algocfproc}{0} +\setcounter{algocf}{0} +\setcounter{lofdepth}{1} +\setcounter{lotdepth}{1} +\setcounter{svg@param@lastpage}{0} +\setcounter{svg@param@currpage}{-1} +\setcounter{su@anzahl}{0} +\setcounter{LT@tables}{0} +\setcounter{LT@chunks}{0} +\setcounter{@pps}{0} +\setcounter{@ppsavesec}{0} +\setcounter{@ppsaveapp}{0} +\setcounter{AM@survey}{0} +\setcounter{tabx@nest}{0} +\setcounter{listtotal}{0} +\setcounter{listcount}{0} +\setcounter{liststart}{0} +\setcounter{liststop}{0} +\setcounter{citecount}{0} +\setcounter{citetotal}{0} +\setcounter{multicitecount}{0} +\setcounter{multicitetotal}{0} +\setcounter{instcount}{89} +\setcounter{maxnames}{3} +\setcounter{minnames}{3} +\setcounter{maxitems}{3} +\setcounter{minitems}{1} +\setcounter{citecounter}{0} +\setcounter{maxcitecounter}{0} +\setcounter{savedcitecounter}{0} +\setcounter{uniquelist}{0} +\setcounter{uniquename}{0} +\setcounter{refsection}{0} +\setcounter{refsegment}{0} +\setcounter{maxextratitle}{0} +\setcounter{maxextratitleyear}{0} +\setcounter{maxextraname}{0} +\setcounter{maxextradate}{0} +\setcounter{maxextraalpha}{0} +\setcounter{abbrvpenalty}{50} +\setcounter{highnamepenalty}{50} +\setcounter{lownamepenalty}{25} +\setcounter{maxparens}{3} +\setcounter{parenlevel}{0} +\setcounter{blx@maxsection}{0} +\setcounter{mincomprange}{10} +\setcounter{maxcomprange}{100000} +\setcounter{mincompwidth}{1} +\setcounter{afterword}{0} +\setcounter{savedafterword}{0} +\setcounter{annotator}{0} +\setcounter{savedannotator}{0} +\setcounter{author}{0} +\setcounter{savedauthor}{0} +\setcounter{bookauthor}{0} +\setcounter{savedbookauthor}{0} +\setcounter{commentator}{0} +\setcounter{savedcommentator}{0} +\setcounter{editor}{0} +\setcounter{savededitor}{0} +\setcounter{editora}{0} +\setcounter{savededitora}{0} +\setcounter{editorb}{0} +\setcounter{savededitorb}{0} +\setcounter{editorc}{0} +\setcounter{savededitorc}{0} +\setcounter{foreword}{0} +\setcounter{savedforeword}{0} +\setcounter{holder}{0} +\setcounter{savedholder}{0} +\setcounter{introduction}{0} +\setcounter{savedintroduction}{0} +\setcounter{namea}{0} +\setcounter{savednamea}{0} +\setcounter{nameb}{0} +\setcounter{savednameb}{0} +\setcounter{namec}{0} +\setcounter{savednamec}{0} +\setcounter{translator}{0} +\setcounter{savedtranslator}{0} +\setcounter{shortauthor}{0} +\setcounter{savedshortauthor}{0} +\setcounter{shorteditor}{0} +\setcounter{savedshorteditor}{0} +\setcounter{labelname}{0} +\setcounter{savedlabelname}{0} +\setcounter{institution}{0} +\setcounter{savedinstitution}{0} +\setcounter{lista}{0} +\setcounter{savedlista}{0} +\setcounter{listb}{0} +\setcounter{savedlistb}{0} +\setcounter{listc}{0} +\setcounter{savedlistc}{0} +\setcounter{listd}{0} +\setcounter{savedlistd}{0} +\setcounter{liste}{0} +\setcounter{savedliste}{0} +\setcounter{listf}{0} +\setcounter{savedlistf}{0} +\setcounter{location}{0} +\setcounter{savedlocation}{0} +\setcounter{organization}{0} +\setcounter{savedorganization}{0} +\setcounter{origlocation}{0} +\setcounter{savedoriglocation}{0} +\setcounter{origpublisher}{0} +\setcounter{savedorigpublisher}{0} +\setcounter{publisher}{0} +\setcounter{savedpublisher}{0} +\setcounter{language}{0} +\setcounter{savedlanguage}{0} +\setcounter{origlanguage}{0} +\setcounter{savedoriglanguage}{0} +\setcounter{pageref}{0} +\setcounter{savedpageref}{0} +\setcounter{textcitecount}{0} +\setcounter{textcitetotal}{0} +\setcounter{textcitemaxnames}{0} +\setcounter{biburlbigbreakpenalty}{100} +\setcounter{biburlbreakpenalty}{200} +\setcounter{biburlnumpenalty}{0} +\setcounter{biburlucpenalty}{0} +\setcounter{biburllcpenalty}{0} +\setcounter{smartand}{1} +\setcounter{bbx:relatedcount}{0} +\setcounter{bbx:relatedtotal}{0} +\setcounter{cbx@tempcnta}{0} +\setcounter{cbx@tempcntb}{15} +\setcounter{cbx@tempcntc}{0} +\setcounter{cbx@tempcntd}{-1} +\setcounter{tcb@cnt@codeblock}{48} +} diff --git a/chap/implementation.tex b/chap/implementation.tex index 379409c..c63d9c9 100644 --- a/chap/implementation.tex +++ b/chap/implementation.tex @@ -103,7 +103,7 @@ To be able to easily extend an APIC implementation for single-core systems to SM \subsection{Interrupt Handling in HhuOS} \label{subsec:apxcurrenthhuos} -In hhuOS, external interrupts are handled in two stages (see \autoref{subsec:apxcurrenthhuos} for code examples): +In hhuOS, external interrupts are handled in two stages: \begin{enumerate} \item After an IRQ is sent by an interrupt controller, the CPU looks up the interrupt handler address in the IDT\@. diff --git a/chap/interrupthandling.aux b/chap/interrupthandling.aux new file mode 100644 index 0000000..2db3187 --- /dev/null +++ b/chap/interrupthandling.aux @@ -0,0 +1,234 @@ +\relax +\providecommand{\transparent@use}[1]{} +\providecommand\hyper@newdestlabel[2]{} +\@writefile{listings}{\addvspace {10pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {3}Using the APIC}{15}{chapter.3}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{loa}{\addvspace {10\p@ }} +\newlabel{ch:interrupthandling}{{3}{15}{Using the APIC}{chapter.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.1}Local APIC}{16}{section.3.1}\protected@file@percent } +\newlabel{sec:lapicinit}{{3.1}{16}{Local APIC}{section.3.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces The Local APIC Block Diagram~\blx@tocontentsinit {0}\autocite [sec.~3.11.4.1]{ia32}.\relax }}{17}{figure.3.1}\protected@file@percent } +\newlabel{fig:localapicblock}{{3.1}{17}{The Local APIC Block Diagram~\autocite [sec.~3.11.4.1]{ia32}.\relax }{figure.3.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Enabling the Local APIC}{18}{subsection.3.1.1}\protected@file@percent } +\newlabel{subsec:lapicenable}{{3.1.1}{18}{Enabling the Local APIC}{subsection.3.1.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces The IA32\textunderscore {}APIC\textunderscore {}BASE MSR~\blx@tocontentsinit {0}\autocite [sec.~3.11.4.4]{ia32}.\relax }}{18}{figure.3.2}\protected@file@percent } +\newlabel{fig:ia32apicbasemsr}{{3.2}{18}{The IA32\textunderscore {}APIC\textunderscore {}BASE MSR~\autocite [sec.~3.11.4.4]{ia32}.\relax }{figure.3.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.2}Accessing Local APIC Registers in xApic Mode}{18}{subsection.3.1.2}\protected@file@percent } +\newlabel{subsec:xapicregacc}{{3.1.2}{18}{Accessing Local APIC Registers in xApic Mode}{subsection.3.1.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.3}Handling Local Interrupts}{19}{subsection.3.1.3}\protected@file@percent } +\newlabel{subsec:lapiclvtinit}{{3.1.3}{19}{Handling Local Interrupts}{subsection.3.1.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.3}{\ignorespaces The Local Vector Table~\blx@tocontentsinit {0}\autocite [sec.~3.11.5.1]{ia32}.\relax }}{19}{figure.3.3}\protected@file@percent } +\newlabel{fig:localapiclvt}{{3.3}{19}{The Local Vector Table~\autocite [sec.~3.11.5.1]{ia32}.\relax }{figure.3.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.4}Allowing Interrupt Processing}{20}{subsection.3.1.4}\protected@file@percent } +\newlabel{subsec:lapicsoftenable}{{3.1.4}{20}{Allowing Interrupt Processing}{subsection.3.1.4}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.4}{\ignorespaces The Local APIC SVR Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.9]{ia32}.\relax }}{20}{figure.3.4}\protected@file@percent } +\newlabel{fig:ia32apicsvr}{{3.4}{20}{The Local APIC SVR Register~\autocite [sec.~3.11.9]{ia32}.\relax }{figure.3.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.5}Local Interrupt EOI}{21}{subsection.3.1.5}\protected@file@percent } +\newlabel{subsec:lapiceoi}{{3.1.5}{21}{Local Interrupt EOI}{subsection.3.1.5}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.6}APIC Timer}{21}{subsection.3.1.6}\protected@file@percent } +\newlabel{subsec:lapictimer}{{3.1.6}{21}{APIC Timer}{subsection.3.1.6}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.7}APIC Error Interrupt}{22}{subsection.3.1.7}\protected@file@percent } +\newlabel{subsec:lapicerror}{{3.1.7}{22}{APIC Error Interrupt}{subsection.3.1.7}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.5}{\ignorespaces Error Status Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.5.3]{ia32}.\relax }}{22}{figure.3.5}\protected@file@percent } +\newlabel{fig:ia32esr}{{3.5}{22}{Error Status Register~\autocite [sec.~3.11.5.3]{ia32}.\relax }{figure.3.5}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.2}I/O APIC}{23}{section.3.2}\protected@file@percent } +\newlabel{sec:ioapicinit}{{3.2}{23}{I/O APIC}{section.3.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Interrupt Overrides}{23}{subsection.3.2.1}\protected@file@percent } +\newlabel{subsec:ioapicpcat}{{3.2.1}{23}{Interrupt Overrides}{subsection.3.2.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}External Interrupt EOI}{24}{subsection.3.2.2}\protected@file@percent } +\newlabel{subsec:ioapiceoi}{{3.2.2}{24}{External Interrupt EOI}{subsection.3.2.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Multiple I/O APICs}{25}{subsection.3.2.3}\protected@file@percent } +\newlabel{subsec:multiioapic}{{3.2.3}{25}{Multiple I/O APICs}{subsection.3.2.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.3}Symmetric Multiprocessing}{25}{section.3.3}\protected@file@percent } +\newlabel{sec:smpinit}{{3.3}{25}{Symmetric Multiprocessing}{section.3.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1}Inter-Processor Interrupts}{25}{subsection.3.3.1}\protected@file@percent } +\newlabel{subsec:ipis}{{3.3.1}{25}{Inter-Processor Interrupts}{subsection.3.3.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.6}{\ignorespaces Interrupt Command Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.6.1]{ia32}.\relax }}{26}{figure.3.6}\protected@file@percent } +\newlabel{fig:ia32icr}{{3.6}{26}{Interrupt Command Register~\autocite [sec.~3.11.6.1]{ia32}.\relax }{figure.3.6}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2}Universal Startup Algorithm}{26}{subsection.3.3.2}\protected@file@percent } +\newlabel{subsec:apstartup}{{3.3.2}{26}{Universal Startup Algorithm}{subsection.3.3.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.3}Application Processor Boot Routine}{27}{subsection.3.3.3}\protected@file@percent } +\newlabel{subsec:apboot}{{3.3.3}{27}{Application Processor Boot Routine}{subsection.3.3.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.4}Application Processor Post-Boot Routine}{28}{subsection.3.3.4}\protected@file@percent } +\newlabel{subsec:apsystementry}{{3.3.4}{28}{Application Processor Post-Boot Routine}{subsection.3.3.4}{}} +\@setckpt{chap/interrupthandling}{ +\setcounter{page}{29} +\setcounter{equation}{0} +\setcounter{enumi}{9} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{14} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{3} +\setcounter{section}{3} +\setcounter{subsection}{4} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{6} +\setcounter{table}{0} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{30} +\setcounter{FancyVerbLine}{0} +\setcounter{linenumber}{1} +\setcounter{LN@truepage}{36} +\setcounter{FV@TrueTabGroupLevel}{0} +\setcounter{FV@TrueTabCounter}{0} +\setcounter{FV@HighlightLinesStart}{0} +\setcounter{FV@HighlightLinesStop}{0} +\setcounter{FancyVerbLineBreakLast}{0} +\setcounter{FV@BreakBufferDepth}{0} +\setcounter{float@type}{16} +\setcounter{minted@FancyVerbLineTemp}{0} +\setcounter{minted@pygmentizecounter}{0} +\setcounter{listing}{0} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{6} +\setcounter{continuedfloat}{0} +\setcounter{subfigure}{0} +\setcounter{subtable}{0} +\setcounter{section@level}{2} +\setcounter{Item}{44} +\setcounter{Hfootnote}{30} +\setcounter{bookmark@seq@number}{38} +\setcounter{AlgoLine}{0} +\setcounter{algocfline}{0} +\setcounter{algocfproc}{0} +\setcounter{algocf}{0} +\setcounter{lofdepth}{1} +\setcounter{lotdepth}{1} +\setcounter{svg@param@lastpage}{0} +\setcounter{svg@param@currpage}{-1} +\setcounter{su@anzahl}{0} +\setcounter{LT@tables}{0} +\setcounter{LT@chunks}{0} +\setcounter{@pps}{0} +\setcounter{@ppsavesec}{0} +\setcounter{@ppsaveapp}{0} +\setcounter{AM@survey}{0} +\setcounter{tabx@nest}{0} +\setcounter{listtotal}{0} +\setcounter{listcount}{0} +\setcounter{liststart}{0} +\setcounter{liststop}{0} +\setcounter{citecount}{0} +\setcounter{citetotal}{0} +\setcounter{multicitecount}{0} +\setcounter{multicitetotal}{0} +\setcounter{instcount}{80} +\setcounter{maxnames}{3} +\setcounter{minnames}{3} +\setcounter{maxitems}{3} +\setcounter{minitems}{1} +\setcounter{citecounter}{0} +\setcounter{maxcitecounter}{0} +\setcounter{savedcitecounter}{0} +\setcounter{uniquelist}{0} +\setcounter{uniquename}{0} +\setcounter{refsection}{0} +\setcounter{refsegment}{0} +\setcounter{maxextratitle}{0} +\setcounter{maxextratitleyear}{0} +\setcounter{maxextraname}{0} +\setcounter{maxextradate}{0} +\setcounter{maxextraalpha}{0} +\setcounter{abbrvpenalty}{50} +\setcounter{highnamepenalty}{50} +\setcounter{lownamepenalty}{25} +\setcounter{maxparens}{3} +\setcounter{parenlevel}{0} +\setcounter{blx@maxsection}{0} +\setcounter{mincomprange}{10} +\setcounter{maxcomprange}{100000} +\setcounter{mincompwidth}{1} +\setcounter{afterword}{0} +\setcounter{savedafterword}{0} +\setcounter{annotator}{0} +\setcounter{savedannotator}{0} +\setcounter{author}{0} +\setcounter{savedauthor}{0} +\setcounter{bookauthor}{0} +\setcounter{savedbookauthor}{0} +\setcounter{commentator}{0} +\setcounter{savedcommentator}{0} +\setcounter{editor}{0} +\setcounter{savededitor}{0} +\setcounter{editora}{0} +\setcounter{savededitora}{0} +\setcounter{editorb}{0} +\setcounter{savededitorb}{0} +\setcounter{editorc}{0} +\setcounter{savededitorc}{0} +\setcounter{foreword}{0} +\setcounter{savedforeword}{0} +\setcounter{holder}{0} +\setcounter{savedholder}{0} +\setcounter{introduction}{0} +\setcounter{savedintroduction}{0} +\setcounter{namea}{0} +\setcounter{savednamea}{0} +\setcounter{nameb}{0} +\setcounter{savednameb}{0} +\setcounter{namec}{0} +\setcounter{savednamec}{0} +\setcounter{translator}{0} +\setcounter{savedtranslator}{0} +\setcounter{shortauthor}{0} +\setcounter{savedshortauthor}{0} +\setcounter{shorteditor}{0} +\setcounter{savedshorteditor}{0} +\setcounter{labelname}{0} +\setcounter{savedlabelname}{0} +\setcounter{institution}{0} +\setcounter{savedinstitution}{0} +\setcounter{lista}{0} +\setcounter{savedlista}{0} +\setcounter{listb}{0} +\setcounter{savedlistb}{0} +\setcounter{listc}{0} +\setcounter{savedlistc}{0} +\setcounter{listd}{0} +\setcounter{savedlistd}{0} +\setcounter{liste}{0} +\setcounter{savedliste}{0} +\setcounter{listf}{0} +\setcounter{savedlistf}{0} +\setcounter{location}{0} +\setcounter{savedlocation}{0} +\setcounter{organization}{0} +\setcounter{savedorganization}{0} +\setcounter{origlocation}{0} +\setcounter{savedoriglocation}{0} +\setcounter{origpublisher}{0} +\setcounter{savedorigpublisher}{0} +\setcounter{publisher}{0} +\setcounter{savedpublisher}{0} +\setcounter{language}{0} +\setcounter{savedlanguage}{0} +\setcounter{origlanguage}{0} +\setcounter{savedoriglanguage}{0} +\setcounter{pageref}{0} +\setcounter{savedpageref}{0} +\setcounter{textcitecount}{0} +\setcounter{textcitetotal}{0} +\setcounter{textcitemaxnames}{0} +\setcounter{biburlbigbreakpenalty}{100} +\setcounter{biburlbreakpenalty}{200} +\setcounter{biburlnumpenalty}{0} +\setcounter{biburlucpenalty}{0} +\setcounter{biburllcpenalty}{0} +\setcounter{smartand}{1} +\setcounter{bbx:relatedcount}{0} +\setcounter{bbx:relatedtotal}{0} +\setcounter{cbx@tempcnta}{0} +\setcounter{cbx@tempcntb}{2} +\setcounter{cbx@tempcntc}{0} +\setcounter{cbx@tempcntd}{-1} +\setcounter{tcb@cnt@codeblock}{0} +} diff --git a/chap/interrupthandling.tex b/chap/interrupthandling.tex index aad9837..74b5b92 100644 --- a/chap/interrupthandling.tex +++ b/chap/interrupthandling.tex @@ -56,20 +56,21 @@ After system power-up, the local APIC is in the following state~\autocite[sec.~3 The initialization sequence consists of these steps, all performed before interrupt handling is enabled (see \autoref{fig:apicenable} for the full initialization sequence including all components): \begin{enumerate} - \item Enable symmetric I/O mode and set the APIC operating mode. - \item Allocate MMIO memory for register access. + \item Enable symmetric I/O mode. + \item Allocate memory for MMIO register access. \item Initialize the LVT and NMI\@. \item Initialize the SVR\@. \item Initialize the TPR\@. - \item Initialize the APIC timer and error handler. - \item Synchronize the arbitration ID\@. + \item Initialize the APIC timer (if used) and error handler. + \item Synchronize the arbitration IDs. \item Enable interrupts. \end{enumerate} \subsection{Enabling the Local APIC} \label{subsec:lapicenable} -Because the system boots in PIC mode, \code{0x01} should be written to the IMCR~\autocite[sec.~3.6.2.1]{mpspec} to disconnect the PIC from the local APIC's LINT0 INTI (see \autoref{fig:integratedapic}, for the example implementation see \autoref{subsec:apxdisablepic}). +Because the system boots in a PC/AT compatible mode (PIC mode or virtual wire mode), \code{0x01} should be written to the IMCR~\autocite[sec.~3.6.2.1]{mpspec} (in case it exists) to disconnect the PIC from the local APIC's LINT0 INTI (see \autoref{fig:integratedapic}). +In case the IMCR is not available, all 16 PIC interrupts should be masked. To set the operating mode, it is first determined which modes are supported by executing the \code{cpuid}~\autocite{x86isa} instruction with \code{eax=1}: If bit 9 of the \code{edx} register is set, xApic mode is supported, if bit 21 of the \code{ecx} register is set, x2Apic mode is supported~\autocite[sec.~5.1.2]{cpuid}. If xApic mode is supported (if the local APIC is an integrated APIC), it will be in that mode already. @@ -102,8 +103,6 @@ The IA-32 manual specifies a caching strategy of \textquote{strong uncachable}\f The address offsets (from the base address) for the local APIC registers are listed in the IA-32 manual~\autocite[sec.~3.11.4.1]{ia32} and in \autoref{tab:lapicregs}. -For a short note on x2Apic register access, see \autoref{subsec:usingx2apic}. - \subsection{Handling Local Interrupts} \label{subsec:lapiclvtinit} @@ -127,7 +126,7 @@ Local interrupts can be configured to use different delivery modes (excerpt)~\au \end{itemize} Initially, all local interrupts are initialized to PC/AT defaults: Masked, edge-triggered, active-high and with \textit{fixed} delivery mode. -Most importantly, the vector fields (bits 0:7 of each LVT register) are set to their corresponding interrupt vector (see \autoref{subsec:apxlvtinit} for an example implementation). +Most importantly, the vector fields (bits 0:7 of each LVT register) are set to their corresponding interrupt vector. After default-initializing the local interrupts, LINT1 has to be configured separately (see \autoref{tab:lapicregslvtlint}), because it is the local APIC's NMI source\footnote{ In older specifications~\autocite{mpspec}, LINT1 is defined as NMI source (see \autoref{fig:integratedapic}). @@ -152,7 +151,7 @@ It makes sense to choose \code{0xFF} for the spurious interrupt vector, as on P6 \label{fig:ia32apicsvr} \end{figure} -Because the APIC's spurious interrupt has a dedicated interrupt vector (unlike the PIC's spurious interrupt), it can be ignored easily by registering a stub interrupt handler for the appropriate vector (see \autoref{subsec:apxsvr} for an implementation example). +Because the APIC's spurious interrupt has a dedicated interrupt vector (unlike the PIC's spurious interrupt), it can be ignored easily by registering a stub interrupt handler for the appropriate vector. The final step to initialize the BSP's local APIC is to allow the local APIC to receive interrupts of all priorities. This is done by writing \code{0x00} to the TPR~\autocite[sec.~3.11.8.3]{ia32} (see \autoref{tab:lapicregstpr}). @@ -218,17 +217,12 @@ To handle these cases, the local APIC provides the local error interrupt, whose The ESR is a \textquote{write/read} register: Before reading a value from the ESR, it has to be written, which updates the ESR's contents to the error status since the last write. Writing the ESR also arms the local error interrupt, which does not happen automatically~\autocite[sec.~3.11.5.3]{ia32}. -Enabling the local error interrupt is now as simple as enabling it in the local APIC's LVT and registering an interrupt handler for the appropriate vector (see \autoref{subsec:apxhandlingerror} for an example implementation). - -\subsection{Using x2Apic Mode} -\label{subsec:usingx2apic} - -% TODO +Enabling the local error interrupt is now as simple as enabling it in the local APIC's LVT and registering an interrupt handler for the appropriate vector. \section{I/O APIC} \label{sec:ioapicinit} -To fully replace the PIC and handle external interrupts using the APIC, the I/O APIC, located in the system chipset, has to be initialized by setting its \textbf{\gls{redtbl}} registers~\autocite[sec.~9.5.8]{ich5} (see \autoref{tab:ioapicregsredtbl}). +To fully replace the PIC and handle external interrupts using the APIC, the I/O APIC has to be initialized by setting its \textbf{\gls{redtbl}} registers~\autocite[sec.~9.5.8]{ich5} (see \autoref{tab:ioapicregsredtbl}). Like the local APIC's LVT, the REDTBL allows configuration of interrupt vectors, masking bits, interrupt delivery modes, pin polarities and trigger modes (see \autoref{subsec:lapiclvtinit}). Additionally, for external interrupts a destination and destination mode can be specified. @@ -241,11 +235,11 @@ The other fields are set to ISA bus defaults\footnote{ Edge-triggered, active-high.}, \ with \textit{fixed} delivery mode, masked, and the corresponding interrupt vector. -The I/O APIC does not have to be enabled explicitly, if the local APIC is enabled and the REDTBL is initialized correctly, external interrupts will be redirected to the local APIC and handled by the CPU\@. +The I/O APIC does not have to be enabled explicitly: If the local APIC is enabled and the REDTBL is initialized correctly, external interrupts will be redirected to the local APIC and handled by the CPU\@. Unlike the local APIC's registers, the REDTBL registers are accessed indirectly: Two registers, the \textquote{Index} and \textquote{Data} register~\autocite[sec.~9.5.1]{ich5}, are mapped to the main memory and can be used analogous to the local APIC's registers. The MMIO base address can be parsed from the MADT (see \autoref{tab:madtioapic}). -Writing an offset to the index register exposes an indirectly accessible I/O APIC register through the data register (see \autoref{subsec:iolistings} for an example implementation). +Writing an offset to the index register exposes an indirectly accessible I/O APIC register through the data register. This indirect addressing scheme is useful, because the number of external interrupts an I/O APIC supports, and in turn the number of REDTBL registers, can vary\footnote{ Intel's consumer \textbf{\glspl{ich}} always support a fixed amount of 24 external interrupts though~\autocite[sec.~9.5.7]{ich5}.}. diff --git a/chap/introduction.aux b/chap/introduction.aux new file mode 100644 index 0000000..b75e658 --- /dev/null +++ b/chap/introduction.aux @@ -0,0 +1,188 @@ +\relax +\providecommand{\transparent@use}[1]{} +\providecommand\hyper@newdestlabel[2]{} +\@writefile{listings}{\addvspace {10pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {1}Introduction}{1}{chapter.1}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{loa}{\addvspace {10\p@ }} +\newlabel{ch:introduction}{{1}{1}{Introduction}{chapter.1}{}} +\@setckpt{chap/introduction}{ +\setcounter{page}{3} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{1} +\setcounter{section}{0} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{0} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{0} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{0} +\setcounter{FancyVerbLine}{0} +\setcounter{linenumber}{1} +\setcounter{LN@truepage}{10} +\setcounter{FV@TrueTabGroupLevel}{0} +\setcounter{FV@TrueTabCounter}{0} +\setcounter{FV@HighlightLinesStart}{0} +\setcounter{FV@HighlightLinesStop}{0} +\setcounter{FancyVerbLineBreakLast}{0} +\setcounter{FV@BreakBufferDepth}{0} +\setcounter{float@type}{16} +\setcounter{minted@FancyVerbLineTemp}{0} +\setcounter{minted@pygmentizecounter}{0} +\setcounter{listing}{0} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{0} +\setcounter{continuedfloat}{0} +\setcounter{subfigure}{0} +\setcounter{subtable}{0} +\setcounter{section@level}{0} +\setcounter{Item}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{1} +\setcounter{AlgoLine}{0} +\setcounter{algocfline}{0} +\setcounter{algocfproc}{0} +\setcounter{algocf}{0} +\setcounter{lofdepth}{1} +\setcounter{lotdepth}{1} +\setcounter{svg@param@lastpage}{0} +\setcounter{svg@param@currpage}{-1} +\setcounter{su@anzahl}{0} +\setcounter{LT@tables}{0} +\setcounter{LT@chunks}{0} +\setcounter{@pps}{0} +\setcounter{@ppsavesec}{0} +\setcounter{@ppsaveapp}{0} +\setcounter{AM@survey}{0} +\setcounter{tabx@nest}{0} +\setcounter{listtotal}{0} +\setcounter{listcount}{0} +\setcounter{liststart}{0} +\setcounter{liststop}{0} +\setcounter{citecount}{0} +\setcounter{citetotal}{0} +\setcounter{multicitecount}{0} +\setcounter{multicitetotal}{0} +\setcounter{instcount}{2} +\setcounter{maxnames}{3} +\setcounter{minnames}{3} +\setcounter{maxitems}{3} +\setcounter{minitems}{1} +\setcounter{citecounter}{0} +\setcounter{maxcitecounter}{0} +\setcounter{savedcitecounter}{0} +\setcounter{uniquelist}{0} +\setcounter{uniquename}{0} +\setcounter{refsection}{0} +\setcounter{refsegment}{0} +\setcounter{maxextratitle}{0} +\setcounter{maxextratitleyear}{0} +\setcounter{maxextraname}{0} +\setcounter{maxextradate}{0} +\setcounter{maxextraalpha}{0} +\setcounter{abbrvpenalty}{50} +\setcounter{highnamepenalty}{50} +\setcounter{lownamepenalty}{25} +\setcounter{maxparens}{3} +\setcounter{parenlevel}{0} +\setcounter{blx@maxsection}{0} +\setcounter{mincomprange}{10} +\setcounter{maxcomprange}{100000} +\setcounter{mincompwidth}{1} +\setcounter{afterword}{0} +\setcounter{savedafterword}{0} +\setcounter{annotator}{0} +\setcounter{savedannotator}{0} +\setcounter{author}{0} +\setcounter{savedauthor}{0} +\setcounter{bookauthor}{0} +\setcounter{savedbookauthor}{0} +\setcounter{commentator}{0} +\setcounter{savedcommentator}{0} +\setcounter{editor}{0} +\setcounter{savededitor}{0} +\setcounter{editora}{0} +\setcounter{savededitora}{0} +\setcounter{editorb}{0} +\setcounter{savededitorb}{0} +\setcounter{editorc}{0} +\setcounter{savededitorc}{0} +\setcounter{foreword}{0} +\setcounter{savedforeword}{0} +\setcounter{holder}{0} +\setcounter{savedholder}{0} +\setcounter{introduction}{0} +\setcounter{savedintroduction}{0} +\setcounter{namea}{0} +\setcounter{savednamea}{0} +\setcounter{nameb}{0} +\setcounter{savednameb}{0} +\setcounter{namec}{0} +\setcounter{savednamec}{0} +\setcounter{translator}{0} +\setcounter{savedtranslator}{0} +\setcounter{shortauthor}{0} +\setcounter{savedshortauthor}{0} +\setcounter{shorteditor}{0} +\setcounter{savedshorteditor}{0} +\setcounter{labelname}{0} +\setcounter{savedlabelname}{0} +\setcounter{institution}{0} +\setcounter{savedinstitution}{0} +\setcounter{lista}{0} +\setcounter{savedlista}{0} +\setcounter{listb}{0} +\setcounter{savedlistb}{0} +\setcounter{listc}{0} +\setcounter{savedlistc}{0} +\setcounter{listd}{0} +\setcounter{savedlistd}{0} +\setcounter{liste}{0} +\setcounter{savedliste}{0} +\setcounter{listf}{0} +\setcounter{savedlistf}{0} +\setcounter{location}{0} +\setcounter{savedlocation}{0} +\setcounter{organization}{0} +\setcounter{savedorganization}{0} +\setcounter{origlocation}{0} +\setcounter{savedoriglocation}{0} +\setcounter{origpublisher}{0} +\setcounter{savedorigpublisher}{0} +\setcounter{publisher}{0} +\setcounter{savedpublisher}{0} +\setcounter{language}{0} +\setcounter{savedlanguage}{0} +\setcounter{origlanguage}{0} +\setcounter{savedoriglanguage}{0} +\setcounter{pageref}{0} +\setcounter{savedpageref}{0} +\setcounter{textcitecount}{0} +\setcounter{textcitetotal}{0} +\setcounter{textcitemaxnames}{0} +\setcounter{biburlbigbreakpenalty}{100} +\setcounter{biburlbreakpenalty}{200} +\setcounter{biburlnumpenalty}{0} +\setcounter{biburlucpenalty}{0} +\setcounter{biburllcpenalty}{0} +\setcounter{smartand}{1} +\setcounter{bbx:relatedcount}{0} +\setcounter{bbx:relatedtotal}{0} +\setcounter{cbx@tempcnta}{0} +\setcounter{cbx@tempcntb}{2} +\setcounter{cbx@tempcntc}{0} +\setcounter{cbx@tempcntd}{-1} +\setcounter{tcb@cnt@codeblock}{0} +} diff --git a/chap/tables.aux b/chap/tables.aux new file mode 100644 index 0000000..25e937c --- /dev/null +++ b/chap/tables.aux @@ -0,0 +1,250 @@ +\relax +\providecommand{\transparent@use}[1]{} +\providecommand\hyper@newdestlabel[2]{} +\@writefile{listings}{\addvspace {10pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {B}Tables}{63}{appendix.1.B}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{loa}{\addvspace {10\p@ }} +\newlabel{ch:tables}{{B}{63}{Tables}{appendix.1.B}{}} +\@writefile{toc}{\contentsline {section}{\numberline {B.1}Local APIC Registers}{64}{section.1.B.1}\protected@file@percent } +\newlabel{sec:localapicregisters}{{B.1}{64}{Local APIC Registers}{section.1.B.1}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.1}{\ignorespaces Local APIC Registers used in this Implementation~\blx@tocontentsinit {0}\autocite [sec.~3.11.4.1]{ia32}.\relax }}{64}{table.caption.5}\protected@file@percent } +\newlabel{tab:lapicregs}{{B.1}{64}{Local APIC Registers used in this Implementation~\autocite [sec.~3.11.4.1]{ia32}.\relax }{table.caption.5}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.2}{\ignorespaces Local APIC ID Register (xApic since Pentium 4)~\blx@tocontentsinit {0}\autocite [sec.~3.11.4.6]{ia32}.\relax }}{64}{table.caption.6}\protected@file@percent } +\newlabel{tab:lapicregsid}{{B.2}{64}{Local APIC ID Register (xApic since Pentium 4)~\autocite [sec.~3.11.4.6]{ia32}.\relax }{table.caption.6}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.3}{\ignorespaces Local APIC Version Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.4.8]{ia32}.\relax }}{64}{table.caption.7}\protected@file@percent } +\newlabel{tab:lapicregsver}{{B.3}{64}{Local APIC Version Register~\autocite [sec.~3.11.4.8]{ia32}.\relax }{table.caption.7}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.4}{\ignorespaces Task Priority Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.8.3.1]{ia32}.\relax }}{65}{table.caption.8}\protected@file@percent } +\newlabel{tab:lapicregstpr}{{B.4}{65}{Task Priority Register~\autocite [sec.~3.11.8.3.1]{ia32}.\relax }{table.caption.8}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.5}{\ignorespaces Local APIC EOI Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.8.5]{ia32}.\relax }}{65}{table.caption.9}\protected@file@percent } +\newlabel{tab:lapicregseoi}{{B.5}{65}{Local APIC EOI Register~\autocite [sec.~3.11.8.5]{ia32}.\relax }{table.caption.9}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.6}{\ignorespaces Spurious Interrupt Vector Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.9]{ia32}.\relax }}{65}{table.caption.10}\protected@file@percent } +\newlabel{tab:lapicregssvr}{{B.6}{65}{Spurious Interrupt Vector Register~\autocite [sec.~3.11.9]{ia32}.\relax }{table.caption.10}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.7}{\ignorespaces Error Status Register (Pentium 4)~\blx@tocontentsinit {0}\autocite [sec.~3.11.5.3]{ia32}.\relax }}{65}{table.caption.11}\protected@file@percent } +\newlabel{tab:lapicregsesr}{{B.7}{65}{Error Status Register (Pentium 4)~\autocite [sec.~3.11.5.3]{ia32}.\relax }{table.caption.11}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.8}{\ignorespaces Interrupt Command Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.6.1]{ia32}.\relax }}{66}{table.caption.12}\protected@file@percent } +\newlabel{tab:lapicregsicr}{{B.8}{66}{Interrupt Command Register~\autocite [sec.~3.11.6.1]{ia32}.\relax }{table.caption.12}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.9}{\ignorespaces LVT Timer Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.5.1]{ia32}.\relax }}{66}{table.caption.13}\protected@file@percent } +\newlabel{tab:lapicregslvtt}{{B.9}{66}{LVT Timer Register~\autocite [sec.~3.11.5.1]{ia32}.\relax }{table.caption.13}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.10}{\ignorespaces LVT Error Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.5.1]{ia32}.\relax }}{66}{table.caption.14}\protected@file@percent } +\newlabel{tab:lapicregslvterr}{{B.10}{66}{LVT Error Register~\autocite [sec.~3.11.5.1]{ia32}.\relax }{table.caption.14}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.11}{\ignorespaces LVT LINT1 Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.5.1]{ia32}.\relax }}{67}{table.caption.15}\protected@file@percent } +\newlabel{tab:lapicregslvtlint}{{B.11}{67}{LVT LINT1 Register~\autocite [sec.~3.11.5.1]{ia32}.\relax }{table.caption.15}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.12}{\ignorespaces Timer Initial Count Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.5.4]{ia32}.\relax }}{67}{table.caption.16}\protected@file@percent } +\newlabel{tab:lapicregstimerinit}{{B.12}{67}{Timer Initial Count Register~\autocite [sec.~3.11.5.4]{ia32}.\relax }{table.caption.16}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.13}{\ignorespaces Timer Divide Configuration Register~\blx@tocontentsinit {0}\autocite [sec.~3.11.5.4]{ia32}.\relax }}{67}{table.caption.17}\protected@file@percent } +\newlabel{tab:lapicregstimerdiv}{{B.13}{67}{Timer Divide Configuration Register~\autocite [sec.~3.11.5.4]{ia32}.\relax }{table.caption.17}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.14}{\ignorespaces IA32\textunderscore {} APIC\textunderscore {}BASE MSR~\blx@tocontentsinit {0}\autocite [sec.~3.11.12.1]{ia32}. \relax }}{67}{table.caption.18}\protected@file@percent } +\newlabel{tab:lapicregsmsr}{{B.14}{67}{IA32\textunderscore {} APIC\textunderscore {}BASE MSR~\autocite [sec.~3.11.12.1]{ia32}. \relax }{table.caption.18}{}} +\@writefile{toc}{\contentsline {section}{\numberline {B.2}I/O APIC Registers}{68}{section.1.B.2}\protected@file@percent } +\newlabel{sec:ioapicregs}{{B.2}{68}{I/O APIC Registers}{section.1.B.2}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.15}{\ignorespaces I/O APIC Registers used in this Implementation~\blx@tocontentsinit {0}\autocite [sec.~9.5]{ich5}.\relax }}{68}{table.caption.19}\protected@file@percent } +\newlabel{tab:ioapicregs}{{B.15}{68}{I/O APIC Registers used in this Implementation~\autocite [sec.~9.5]{ich5}.\relax }{table.caption.19}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.16}{\ignorespaces I/O APIC Index Register~\blx@tocontentsinit {0}\autocite [sec.~9.5.2]{ich5}.\relax }}{68}{table.caption.20}\protected@file@percent } +\newlabel{tab:ioapicregsidx}{{B.16}{68}{I/O APIC Index Register~\autocite [sec.~9.5.2]{ich5}.\relax }{table.caption.20}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.17}{\ignorespaces I/O APIC Data Register~\blx@tocontentsinit {0}\autocite [sec.~9.5.3]{ich5}.\relax }}{68}{table.caption.21}\protected@file@percent } +\newlabel{tab:ioapicregsdat}{{B.17}{68}{I/O APIC Data Register~\autocite [sec.~9.5.3]{ich5}.\relax }{table.caption.21}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.18}{\ignorespaces I/O APIC ID Register~\blx@tocontentsinit {0}\autocite [sec.~9.5.6]{ich5}.\relax }}{68}{table.caption.22}\protected@file@percent } +\newlabel{tab:ioapicregsid}{{B.18}{68}{I/O APIC ID Register~\autocite [sec.~9.5.6]{ich5}.\relax }{table.caption.22}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.19}{\ignorespaces I/O APIC Version Register~\blx@tocontentsinit {0}\autocite [sec.~9.5.7]{ich5}.\relax }}{69}{table.caption.23}\protected@file@percent } +\newlabel{tab:ioapicregsver}{{B.19}{69}{I/O APIC Version Register~\autocite [sec.~9.5.7]{ich5}.\relax }{table.caption.23}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.20}{\ignorespaces I/O APIC REDTBL Register~\blx@tocontentsinit {0}\autocite [sec.~9.5.8]{ich5}.\relax }}{69}{table.caption.24}\protected@file@percent } +\newlabel{tab:ioapicregsredtbl}{{B.20}{69}{I/O APIC REDTBL Register~\autocite [sec.~9.5.8]{ich5}.\relax }{table.caption.24}{}} +\@writefile{toc}{\contentsline {section}{\numberline {B.3}System Description Tables}{70}{section.1.B.3}\protected@file@percent } +\newlabel{sec:sdts}{{B.3}{70}{System Description Tables}{section.1.B.3}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.21}{\ignorespaces ACPI MADT~\blx@tocontentsinit {0}\autocite [sec.~5.2.8]{acpi1}.\relax }}{70}{table.caption.25}\protected@file@percent } +\newlabel{tab:madt}{{B.21}{70}{ACPI MADT~\autocite [sec.~5.2.8]{acpi1}.\relax }{table.caption.25}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.22}{\ignorespaces MADT Processor Local APIC Structure~\blx@tocontentsinit {0}\autocite [sec.~5.2.8.1]{acpi1}.\relax }}{70}{table.caption.26}\protected@file@percent } +\newlabel{tab:madtlapic}{{B.22}{70}{MADT Processor Local APIC Structure~\autocite [sec.~5.2.8.1]{acpi1}.\relax }{table.caption.26}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.23}{\ignorespaces Local APIC Flags~\blx@tocontentsinit {0}\autocite [sec.~5.2.8.1]{acpi1}.\relax }}{70}{table.caption.27}\protected@file@percent } +\newlabel{tab:madtlapicflags}{{B.23}{70}{Local APIC Flags~\autocite [sec.~5.2.8.1]{acpi1}.\relax }{table.caption.27}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.24}{\ignorespaces MADT I/O APIC Structure~\blx@tocontentsinit {0}\autocite [sec.~5.2.8.2]{acpi1}.\relax }}{70}{table.caption.28}\protected@file@percent } +\newlabel{tab:madtioapic}{{B.24}{70}{MADT I/O APIC Structure~\autocite [sec.~5.2.8.2]{acpi1}.\relax }{table.caption.28}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.25}{\ignorespaces MADT Interrupt Source Override Structure~\blx@tocontentsinit {0}\autocite [sec.~5.2.8.3.1]{acpi1}.\relax }}{71}{table.caption.29}\protected@file@percent } +\newlabel{tab:madtirqoverride}{{B.25}{71}{MADT Interrupt Source Override Structure~\autocite [sec.~5.2.8.3.1]{acpi1}.\relax }{table.caption.29}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.26}{\ignorespaces INTI Flags~\blx@tocontentsinit {0}\autocite [sec.~5.2.8.3.1]{acpi1}.\relax }}{71}{table.caption.30}\protected@file@percent } +\newlabel{tab:madtintiflags}{{B.26}{71}{INTI Flags~\autocite [sec.~5.2.8.3.1]{acpi1}.\relax }{table.caption.30}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.27}{\ignorespaces MADT I/O APIC NMI Source~\blx@tocontentsinit {0}\autocite [sec.~5.2.8.3.2]{acpi1}.\relax }}{71}{table.caption.31}\protected@file@percent } +\newlabel{tab:madtionmi}{{B.27}{71}{MADT I/O APIC NMI Source~\autocite [sec.~5.2.8.3.2]{acpi1}.\relax }{table.caption.31}{}} +\@writefile{lot}{\contentsline {table}{\numberline {B.28}{\ignorespaces MADT Local APIC NMI Source~\blx@tocontentsinit {0}\autocite [sec.~5.2.8.3.3]{acpi1}.\relax }}{71}{table.caption.32}\protected@file@percent } +\newlabel{tab:madtlnmi}{{B.28}{71}{MADT Local APIC NMI Source~\autocite [sec.~5.2.8.3.3]{acpi1}.\relax }{table.caption.32}{}} +\@setckpt{chap/tables}{ +\setcounter{page}{73} +\setcounter{equation}{0} +\setcounter{enumi}{4} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{2} +\setcounter{section}{3} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{28} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{188} +\setcounter{FancyVerbLine}{12} +\setcounter{linenumber}{1} +\setcounter{LN@truepage}{80} +\setcounter{FV@TrueTabGroupLevel}{0} +\setcounter{FV@TrueTabCounter}{0} +\setcounter{FV@HighlightLinesStart}{0} +\setcounter{FV@HighlightLinesStop}{0} +\setcounter{FancyVerbLineBreakLast}{0} +\setcounter{FV@BreakBufferDepth}{0} +\setcounter{float@type}{16} +\setcounter{minted@FancyVerbLineTemp}{0} +\setcounter{minted@pygmentizecounter}{48} +\setcounter{listing}{0} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{2} +\setcounter{continuedfloat}{0} +\setcounter{subfigure}{0} +\setcounter{subtable}{0} +\setcounter{section@level}{1} +\setcounter{Item}{50} +\setcounter{Hfootnote}{45} +\setcounter{bookmark@seq@number}{76} +\setcounter{AlgoLine}{0} +\setcounter{algocfline}{0} +\setcounter{algocfproc}{0} +\setcounter{algocf}{0} +\setcounter{lofdepth}{1} +\setcounter{lotdepth}{1} +\setcounter{svg@param@lastpage}{0} +\setcounter{svg@param@currpage}{-1} +\setcounter{su@anzahl}{0} +\setcounter{LT@tables}{0} +\setcounter{LT@chunks}{0} +\setcounter{@pps}{1} +\setcounter{@ppsavesec}{6} +\setcounter{@ppsaveapp}{0} +\setcounter{AM@survey}{0} +\setcounter{tabx@nest}{0} +\setcounter{listtotal}{0} +\setcounter{listcount}{0} +\setcounter{liststart}{0} +\setcounter{liststop}{0} +\setcounter{citecount}{0} +\setcounter{citetotal}{0} +\setcounter{multicitecount}{0} +\setcounter{multicitetotal}{0} +\setcounter{instcount}{157} +\setcounter{maxnames}{3} +\setcounter{minnames}{3} +\setcounter{maxitems}{3} +\setcounter{minitems}{1} +\setcounter{citecounter}{0} +\setcounter{maxcitecounter}{0} +\setcounter{savedcitecounter}{0} +\setcounter{uniquelist}{0} +\setcounter{uniquename}{0} +\setcounter{refsection}{0} +\setcounter{refsegment}{0} +\setcounter{maxextratitle}{0} +\setcounter{maxextratitleyear}{0} +\setcounter{maxextraname}{0} +\setcounter{maxextradate}{0} +\setcounter{maxextraalpha}{0} +\setcounter{abbrvpenalty}{50} +\setcounter{highnamepenalty}{50} +\setcounter{lownamepenalty}{25} +\setcounter{maxparens}{3} +\setcounter{parenlevel}{0} +\setcounter{blx@maxsection}{0} +\setcounter{mincomprange}{10} +\setcounter{maxcomprange}{100000} +\setcounter{mincompwidth}{1} +\setcounter{afterword}{0} +\setcounter{savedafterword}{0} +\setcounter{annotator}{0} +\setcounter{savedannotator}{0} +\setcounter{author}{0} +\setcounter{savedauthor}{0} +\setcounter{bookauthor}{0} +\setcounter{savedbookauthor}{0} +\setcounter{commentator}{0} +\setcounter{savedcommentator}{0} +\setcounter{editor}{0} +\setcounter{savededitor}{0} +\setcounter{editora}{0} +\setcounter{savededitora}{0} +\setcounter{editorb}{0} +\setcounter{savededitorb}{0} +\setcounter{editorc}{0} +\setcounter{savededitorc}{0} +\setcounter{foreword}{0} +\setcounter{savedforeword}{0} +\setcounter{holder}{0} +\setcounter{savedholder}{0} +\setcounter{introduction}{0} +\setcounter{savedintroduction}{0} +\setcounter{namea}{0} +\setcounter{savednamea}{0} +\setcounter{nameb}{0} +\setcounter{savednameb}{0} +\setcounter{namec}{0} +\setcounter{savednamec}{0} +\setcounter{translator}{0} +\setcounter{savedtranslator}{0} +\setcounter{shortauthor}{0} +\setcounter{savedshortauthor}{0} +\setcounter{shorteditor}{0} +\setcounter{savedshorteditor}{0} +\setcounter{labelname}{0} +\setcounter{savedlabelname}{0} +\setcounter{institution}{0} +\setcounter{savedinstitution}{0} +\setcounter{lista}{0} +\setcounter{savedlista}{0} +\setcounter{listb}{0} +\setcounter{savedlistb}{0} +\setcounter{listc}{0} +\setcounter{savedlistc}{0} +\setcounter{listd}{0} +\setcounter{savedlistd}{0} +\setcounter{liste}{0} +\setcounter{savedliste}{0} +\setcounter{listf}{0} +\setcounter{savedlistf}{0} +\setcounter{location}{0} +\setcounter{savedlocation}{0} +\setcounter{organization}{0} +\setcounter{savedorganization}{0} +\setcounter{origlocation}{0} +\setcounter{savedoriglocation}{0} +\setcounter{origpublisher}{0} +\setcounter{savedorigpublisher}{0} +\setcounter{publisher}{0} +\setcounter{savedpublisher}{0} +\setcounter{language}{0} +\setcounter{savedlanguage}{0} +\setcounter{origlanguage}{0} +\setcounter{savedoriglanguage}{0} +\setcounter{pageref}{0} +\setcounter{savedpageref}{0} +\setcounter{textcitecount}{0} +\setcounter{textcitetotal}{0} +\setcounter{textcitemaxnames}{0} +\setcounter{biburlbigbreakpenalty}{100} +\setcounter{biburlbreakpenalty}{200} +\setcounter{biburlnumpenalty}{0} +\setcounter{biburlucpenalty}{0} +\setcounter{biburllcpenalty}{0} +\setcounter{smartand}{1} +\setcounter{bbx:relatedcount}{0} +\setcounter{bbx:relatedtotal}{0} +\setcounter{cbx@tempcnta}{0} +\setcounter{cbx@tempcntb}{5} +\setcounter{cbx@tempcntc}{0} +\setcounter{cbx@tempcntd}{-1} +\setcounter{tcb@cnt@codeblock}{0} +} diff --git a/chap/testing.aux b/chap/testing.aux new file mode 100644 index 0000000..4217f05 --- /dev/null +++ b/chap/testing.aux @@ -0,0 +1,192 @@ +\relax +\providecommand{\transparent@use}[1]{} +\providecommand\hyper@newdestlabel[2]{} +\@writefile{listings}{\addvspace {10pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {5}Testing}{49}{chapter.5}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{loa}{\addvspace {10\p@ }} +\newlabel{ch:verification}{{5}{49}{Testing}{chapter.5}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5.1}Methodology}{50}{section.5.1}\protected@file@percent } +\newlabel{sec:verificationmethods}{{5.1}{50}{Methodology}{section.5.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5.2}Results}{50}{section.5.2}\protected@file@percent } +\newlabel{sec:verificationresults}{{5.2}{50}{Results}{section.5.2}{}} +\@setckpt{chap/testing}{ +\setcounter{page}{53} +\setcounter{equation}{0} +\setcounter{enumi}{4} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{3} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{5} +\setcounter{section}{2} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{0} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{188} +\setcounter{FancyVerbLine}{12} +\setcounter{linenumber}{1} +\setcounter{LN@truepage}{60} +\setcounter{FV@TrueTabGroupLevel}{0} +\setcounter{FV@TrueTabCounter}{0} +\setcounter{FV@HighlightLinesStart}{0} +\setcounter{FV@HighlightLinesStop}{0} +\setcounter{FancyVerbLineBreakLast}{0} +\setcounter{FV@BreakBufferDepth}{0} +\setcounter{float@type}{16} +\setcounter{minted@FancyVerbLineTemp}{0} +\setcounter{minted@pygmentizecounter}{48} +\setcounter{listing}{0} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{6} +\setcounter{continuedfloat}{0} +\setcounter{subfigure}{0} +\setcounter{subtable}{0} +\setcounter{section@level}{1} +\setcounter{Item}{50} +\setcounter{Hfootnote}{40} +\setcounter{bookmark@seq@number}{63} +\setcounter{AlgoLine}{0} +\setcounter{algocfline}{0} +\setcounter{algocfproc}{0} +\setcounter{algocf}{0} +\setcounter{lofdepth}{1} +\setcounter{lotdepth}{1} +\setcounter{svg@param@lastpage}{0} +\setcounter{svg@param@currpage}{-1} +\setcounter{su@anzahl}{0} +\setcounter{LT@tables}{0} +\setcounter{LT@chunks}{0} +\setcounter{@pps}{0} +\setcounter{@ppsavesec}{0} +\setcounter{@ppsaveapp}{0} +\setcounter{AM@survey}{0} +\setcounter{tabx@nest}{0} +\setcounter{listtotal}{0} +\setcounter{listcount}{0} +\setcounter{liststart}{0} +\setcounter{liststop}{0} +\setcounter{citecount}{0} +\setcounter{citetotal}{0} +\setcounter{multicitecount}{0} +\setcounter{multicitetotal}{0} +\setcounter{instcount}{90} +\setcounter{maxnames}{3} +\setcounter{minnames}{3} +\setcounter{maxitems}{3} +\setcounter{minitems}{1} +\setcounter{citecounter}{0} +\setcounter{maxcitecounter}{0} +\setcounter{savedcitecounter}{0} +\setcounter{uniquelist}{0} +\setcounter{uniquename}{0} +\setcounter{refsection}{0} +\setcounter{refsegment}{0} +\setcounter{maxextratitle}{0} +\setcounter{maxextratitleyear}{0} +\setcounter{maxextraname}{0} +\setcounter{maxextradate}{0} +\setcounter{maxextraalpha}{0} +\setcounter{abbrvpenalty}{50} +\setcounter{highnamepenalty}{50} +\setcounter{lownamepenalty}{25} +\setcounter{maxparens}{3} +\setcounter{parenlevel}{0} +\setcounter{blx@maxsection}{0} +\setcounter{mincomprange}{10} +\setcounter{maxcomprange}{100000} +\setcounter{mincompwidth}{1} +\setcounter{afterword}{0} +\setcounter{savedafterword}{0} +\setcounter{annotator}{0} +\setcounter{savedannotator}{0} +\setcounter{author}{0} +\setcounter{savedauthor}{0} +\setcounter{bookauthor}{0} +\setcounter{savedbookauthor}{0} +\setcounter{commentator}{0} +\setcounter{savedcommentator}{0} +\setcounter{editor}{0} +\setcounter{savededitor}{0} +\setcounter{editora}{0} +\setcounter{savededitora}{0} +\setcounter{editorb}{0} +\setcounter{savededitorb}{0} +\setcounter{editorc}{0} +\setcounter{savededitorc}{0} +\setcounter{foreword}{0} +\setcounter{savedforeword}{0} +\setcounter{holder}{0} +\setcounter{savedholder}{0} +\setcounter{introduction}{0} +\setcounter{savedintroduction}{0} +\setcounter{namea}{0} +\setcounter{savednamea}{0} +\setcounter{nameb}{0} +\setcounter{savednameb}{0} +\setcounter{namec}{0} +\setcounter{savednamec}{0} +\setcounter{translator}{0} +\setcounter{savedtranslator}{0} +\setcounter{shortauthor}{0} +\setcounter{savedshortauthor}{0} +\setcounter{shorteditor}{0} +\setcounter{savedshorteditor}{0} +\setcounter{labelname}{0} +\setcounter{savedlabelname}{0} +\setcounter{institution}{0} +\setcounter{savedinstitution}{0} +\setcounter{lista}{0} +\setcounter{savedlista}{0} +\setcounter{listb}{0} +\setcounter{savedlistb}{0} +\setcounter{listc}{0} +\setcounter{savedlistc}{0} +\setcounter{listd}{0} +\setcounter{savedlistd}{0} +\setcounter{liste}{0} +\setcounter{savedliste}{0} +\setcounter{listf}{0} +\setcounter{savedlistf}{0} +\setcounter{location}{0} +\setcounter{savedlocation}{0} +\setcounter{organization}{0} +\setcounter{savedorganization}{0} +\setcounter{origlocation}{0} +\setcounter{savedoriglocation}{0} +\setcounter{origpublisher}{0} +\setcounter{savedorigpublisher}{0} +\setcounter{publisher}{0} +\setcounter{savedpublisher}{0} +\setcounter{language}{0} +\setcounter{savedlanguage}{0} +\setcounter{origlanguage}{0} +\setcounter{savedoriglanguage}{0} +\setcounter{pageref}{0} +\setcounter{savedpageref}{0} +\setcounter{textcitecount}{0} +\setcounter{textcitetotal}{0} +\setcounter{textcitemaxnames}{0} +\setcounter{biburlbigbreakpenalty}{100} +\setcounter{biburlbreakpenalty}{200} +\setcounter{biburlnumpenalty}{0} +\setcounter{biburlucpenalty}{0} +\setcounter{biburllcpenalty}{0} +\setcounter{smartand}{1} +\setcounter{bbx:relatedcount}{0} +\setcounter{bbx:relatedtotal}{0} +\setcounter{cbx@tempcnta}{0} +\setcounter{cbx@tempcntb}{13} +\setcounter{cbx@tempcntc}{0} +\setcounter{cbx@tempcntd}{-1} +\setcounter{tcb@cnt@codeblock}{0} +} diff --git a/class/thesis.cls b/class/thesis.cls index 3f69f70..d10f0b3 100644 --- a/class/thesis.cls +++ b/class/thesis.cls @@ -69,6 +69,7 @@ \RequirePackage{etoolbox} \RequirePackage{siunitx} \RequirePackage{setspace} +\RequirePackage{pdfpages} % Options \floatstyle{boxed} % boxes around figures @@ -337,7 +338,8 @@ }% {} - \declaration + % \declaration + \includepdf[pages=-]{decl.pdf} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/decl.pdf b/decl.pdf new file mode 100644 index 0000000000000000000000000000000000000000..415a0d911dfe4077752f148611b37aca43bea11d GIT binary patch literal 62238 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