1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
\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}
|