# Name
**_PatchFv.py_** - The python script that patches the firmware volumes (**FV**)
with in the flash device (**FD**) file post FSP build.
From version 0.60, script is capable of patching flash device (**FD**) directly.

# Synopsis

```
PatchFv FvBuildDir [FvFileBaseNames:]FdFileBaseNameToPatch ["Offset, Value"]+
  | ["Offset, Value, @Comment"]+
  | ["Offset, Value, $Command"]+
  | ["Offset, Value, $Command, @Comment"]+
```
```
PatchFv FdFileDir FdFileName ["Offset, Value"]+
  | ["Offset, Value, @Comment"]+
  | ["Offset, Value, $Command"]+
  | ["Offset, Value, $Command, @Comment"]+
```

# Description
The **_PatchFv.py_** tool allows the developer to fix up FD images to follow the
Intel FSP Architecture specification.  It also makes the FD image relocatable.
The tool is written in Python and uses Python 2.7 or later to run.
Consider using the tool in a build script.

# FvBuildDir (Argument 1)
This is the first argument that **_PatchFv.py_** requires.  It is the build
directory for all firmware volumes created during the FSP build. The path must
be either an absolute path or a relevant path, relevant to the top level of the
FSP tree.

#### Example usage:
```
 Build\YouPlatformFspPkg\%BD_TARGET%_%VS_VERSION%%VS_X86%\FV
```

The example used contains Windows batch script %VARIABLES%.

# FvFileBaseNames (Argument 2: Optional Part 1)
The firmware volume file base names (**_FvFileBaseNames_**) are the independent
FVs that are to be patched within the FD. (0 or more in the form
**FvFileBaseNames:**) The colon **:** is used for delimiting the single
argument and must be appended to the end of each (**_FvFileBaseNames_**).

#### Example usage:
```
STAGE1:STAGE2:MANIFEST:YOURPLATFORM
```

In the example **STAGE1** is **STAGE1.Fv** in **YOURPLATFORM.fd**.

# FdFileNameToPatch (Argument 2: Mandatory Part 2)

Firmware device file name to patch (**_FdFileNameToPatch_**) is the base name of
the FD file that is to be patched. (1 only, in the form **YOURPLATFORM**)

#### Example usage:
```
STAGE1:STAGE2:MANIFEST:YOURPLATFORM
```

In the example **YOURPLATFORM** is from **_YOURPLATFORM.fd_**

# "Offset, Value[, Command][, Comment]" (Argument 3)
The **_Offset_** can be a positive or negative number and represents where the
**_Value_** to be patched is located within the FD. The **_Value_** is what
will be written at the given **_Offset_** in the FD. Constants may be used for
both offsets and values.  Also, this argument handles expressions for both
offsets and values using these operators:

```
 = - * & | ~ ( ) [ ] { } < >
```

The entire argument includes the quote marks like in the example argument below:

```
0xFFFFFFC0, SomeCore:__EntryPoint - [0x000000F0],@SomeCore Entry
```

### Constants:
 Hexadecimal (use **0x** as prefix) | Decimal

#### Examples:

| **Positive Hex** | **Negative Hex** | **Positive Decimal** | **Negative Decimal** |
| ---------------: | ---------------: | -------------------: | -------------------: |
| 0x000000BC       | 0xFFFFFFA2       | 188                  | -94                  |

```
ModuleName:FunctionName | ModuleName:GlobalVariableName
ModuleGuid:Offset
```

### Operators:

```

  + Addition
  - Subtraction
  * Multiplication
  & Logical and
  | Logical or
  ~ Complement
  ( ) Evaluation control
  [ ] Get a DWord value at the specified offset expression from [expr]
  { } Convert an offset {expr} into an absolute address (FSP_BASE + expr)
  < > Convert absolute address <expr> into an image offset (expr & FSP_SIZE)

```
From version 0.60 tool allows to pass flash device file path as Argument 1 and
flash device name as Argument 2 and rules for passing offset & value are same
as explained in the previous sections.

#### Example usage:
Argument 1
```
 YouPlatformFspBinPkg\
```
Argument 2
```
 Fsp_Rebased_T
```

### Special Commands:
Special commands must use the **$** symbol as a prefix to the command itself.
There is only one command available at this time.

```
$COPY   Copy a binary block from source to destination.
```

#### Example:

```
0x94, [PlatformInit:__gPcd_BinPatch_FvRecOffset] + 0x94, [0x98], $COPY, @Sync up 2nd FSP Header
```

### Comments:
Comments are allowed in the **Offset, Value [, Comment]** argument. Comments
must use the **@** symbol as a prefix. The comment will output to the build
window upon successful completion of patching along with the offset and value data.
