\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[margin=1in]{geometry}
\usepackage{titlesec}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{amsmath}
\usepackage{caption}
\usepackage{longtable}

\titleformat{\section}{\large\bfseries}{\thesection}{1em}{}
\titleformat{\subsection}{\normalsize\bfseries}{\thesubsection}{1em}{}

\definecolor{codegray}{gray}{0.95}

\lstdefinestyle{customc}{
  backgroundcolor=\color{codegray},
  basicstyle=\ttfamily\footnotesize,
  keywordstyle=\color{blue},
  commentstyle=\color{gray},
  stringstyle=\color{red},
  breaklines=true,
  showstringspaces=false,
  frame=single,
  language=C
}

\title{EPM Partition Map: Technical Specification}
\author{Amlal EL Mahrouss}
\date{\today}

\begin{document}

\maketitle

\section{Overview}
This document specifies the Explicit Partition Map (EPM) data structures and constants as defined in \texttt{partition\_map.h}. The EPM is designed to store partition information in a platform-independent manner with architecture-specific magic identifiers.

\section{Constants and Macros}

\subsection{Magic Strings}
\begin{longtable}{|l|l|}
\hline
\textbf{Macro} & \textbf{Description} \\
\hline
\texttt{EPM\_MAGIC\_X86} & "EPMAM", used on AMD64 \\
\texttt{EPM\_MAGIC\_RV} & "EPMRV", used on RISC-V \\
\texttt{EPM\_MAGIC\_ARM} & "EPMAR", used on ARM \\
\texttt{EPM\_MAGIC\_64X0} & "EPM64", for custom 64x0 architecture \\
\texttt{EPM\_MAGIC\_32X0} & "EPM32", for custom 32x0 architecture \\
\texttt{EPM\_MAGIC\_PPC} & "EPMPC", used on POWER \\
\texttt{EPM\_MAGIC} & Defaults based on architecture \\
\hline
\end{longtable}

\subsection{Layout Macros}
\begin{itemize}
  \item \texttt{EPM\_MAX\_BLKS = 128} \\
  Maximum number of blocks in the partition table (first 128 LBAs).
  \item \texttt{EPM\_PART\_BLK\_SZ} \\
  Size of the \texttt{part\_block} structure.
  \item \texttt{EPM\_PART\_BLK\_START = 0} \\
  Start LBA of EPM partition headers.
  \item \texttt{EPM\_REVISION = 2} \\
  Current revision of the EPM format.
\end{itemize}

\section{Data Structures}

\subsection{boot\_guid\_t}
\begin{lstlisting}[style=customc]
typedef struct boot_guid {
  uint32_t data1;
  uint16_t data2;
  uint16_t data3;
  uint8_t  data4[8];
} __attribute__((packed)) boot_guid_t;
\end{lstlisting}
A GUID structure used for identifying partitions.

\subsection{part\_block}
\begin{lstlisting}[style=customc]
struct __attribute__((packed)) part_block {
  ascii_char_t magic[5];        // Magic string
  ascii_char_t name[32];        // Human-readable name
  boot_guid_t  uuid;            // Partition UUID
  int32_t      version;         // Partition version
  int32_t      num_blocks;      // Number of blocks
  int64_t      lba_start;       // Starting LBA
  int64_t      sector_sz;       // Sector size
  int64_t      lba_end;         // Ending LBA
  int16_t      type;            // Partition type
  int32_t      fs_version;      // Filesystem version
  ascii_char_t fs[16];          // Filesystem name
  ascii_char_t reserved[401];   // Reserved for future use
};
\end{lstlisting}

\subsection*{Filesystem Type Values}
\begin{longtable}{|l|l|}
\hline
\textbf{Enum Value} & \textbf{Meaning} \\
\hline
\texttt{EPM\_INVALID} & \texttt{0x00} - Invalid/undefined \\
\texttt{EPM\_GENERIC\_OS} & \texttt{0xcf} - Generic OS partition \\
\texttt{EPM\_LINUX} & \texttt{0x8f} - Linux partition \\
\texttt{EPM\_BSD} & \texttt{0x9f} - BSD partition \\
\texttt{EPM\_NEKERNEL\_OS} & \texttt{0x1f} - NeKernel-specific \\
\texttt{EPM\_SNU\_OS} & \texttt{0x1f} - SNU-specific \\
\hline
\end{longtable}

\section{Functions}

\subsection{\texttt{cb\_filesystem\_exists}}
\begin{lstlisting}[style=customc]
boolean cb_filesystem_exists(caddr_t fs, size_t len);
\end{lstlisting}
Checks if a filesystem name is supported.

\subsection{\texttt{cb\_parse\_partition\_block\_data\_at}}
\begin{lstlisting}[style=customc]
bool cb_parse_partition_block_data_at(
  voidptr_t blob,
  size_t blob_sz,
  size_t index,
  size_t* end_lba,
  size_t* start_lba,
  size_t* sector_sz);
\end{lstlisting}
Parses an EPM partition block from a blob at the specified index and returns LBA information.

\subsection{\texttt{cb\_parse\_partition\_block\_at}}
\begin{lstlisting}[style=customc]
part_block_t* cb_parse_partition_block_at(
  voidptr_t blob,
  size_t blob_sz,
  size_t index);
\end{lstlisting}
Returns a pointer to a parsed EPM partition block at the specified index.

\end{document}

