\documentclass{article}
\usepackage{graphicx} % Required for inserting images

\title{The PCI Tree System}
\author{Amlal El Mahrouss}
\date{\today}

\usepackage{listings}

\lstset { %
    language=C++,
}

\begin{document}

\maketitle

\section{Abstract}

The PCI tree is an architecture designed to abstract away device specific data. One leaf might for instance hold an AHCI's HBA (Host Bus Adapter) into a '/pci-tree/@ahci' for instance. The advantage of this approach is the ability to quickly lookup and recognize a device from a tree given by a firmware at handoff.

\section{The Protocol}

Each leaf has a identification number of '0xfeedd00d', then followed by the version in a binary encoded format (0x1000). The offset and size of the offset and then given by the firmware. A PCI-Tree is assembled by the firmware itself. As the structures are not packed, thus multi-platform portability isn't possible.

\section{Trade-offs}

The trade-offs (portability, complexity) are largely justified by the need of a better and more straightforward way to recognize devices at the firmware level, the PCI tree approach helps us do exactly that.

\subsection{Implementation of a PCI-Tree Leaf}

Language of implementation is the C programming language

\begin{lstlisting}
struct hw_nb_pci_tree {
  nb_pci_num_t d_magic;
  nb_pci_num_t d_version;
  nb_pci_num_t d_off_props;
  nb_pci_num_t d_off_struct;
  nb_pci_num_t d_sz_props;
  nb_pci_num_t d_sz_struct;

  nb_pci_num_t d_first_node;
  nb_pci_num_t d_next_sibling;

  nb_pci_char_t d_name[NB_PCI_NAME_LEN];
};

\end{lstlisting}

\section{Official Implementations}

\subsection{ISO C}

\begin{ImplC}
\item {SNU Trusted Base:} \url(https://snu.systems)
\item {NeBoot (NeKernel Boot):} \url(https://github.com/ne-foss-org/neboot)
\end{ImplC}

\subsection{ISO C++}

\begin{ImplCxx}
\item {No Implementation yet}
\end{ImplCxx}

\subsection{Forth}

\begin{ImplForth}
\item {No Implementation yet}
\end{ImplForth}

\end{document}
