diff --git a/generator/cper-generate.c b/generator/cper-generate.c
new file mode 100644
index 0000000..dd336fe
--- /dev/null
+++ b/generator/cper-generate.c
@@ -0,0 +1,257 @@
+/**
+ * A user-space application for generating psuedo-random specification compliant CPER records. 
+ * 
+ * Author: Lawrence.Tang@arm.com
+ **/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "../edk/Cper.h"
+#include "gen-utils.h"
+#include "sections/gen-section-generic.h"
+#include "sections/gen-section-ia32x64.h"
+
+EFI_ERROR_SECTION_DESCRIPTOR* generate_section_descriptor(char* type, size_t* lengths, int index);
+size_t generate_section(void** location, char* type);
+void print_help();
+
+int main(int argc, char* argv[])
+{
+    //If help requested, print help.
+    if (argc == 2 && strcmp(argv[1], "--help") == 0)
+    {
+        print_help();
+        return 0;
+    }
+
+    //Ensure the minimum number of arguments.
+    if (argc < 5)
+    {
+        printf("Insufficient number of arguments. See 'cper-generate --help' for command information.\n");
+        return -1;
+    }
+
+    //Initialise randomiser.
+    init_random();
+
+    //Generate the sections. Type names start from argv[4].
+    UINT16 num_sections = argc - 4;
+    void* sections[num_sections];
+    size_t section_lengths[num_sections];
+    for (int i=0; i<num_sections; i++) 
+    {
+        section_lengths[i] = generate_section(sections + i, argv[4 + i]);
+        if (section_lengths[i] == 0)
+        {
+            //Error encountered, exit.
+            return -1;
+        }
+    }
+
+    //Generate the header given the number of sections.
+    EFI_COMMON_ERROR_RECORD_HEADER* header = 
+        (EFI_COMMON_ERROR_RECORD_HEADER*)calloc(1, sizeof(EFI_COMMON_ERROR_RECORD_HEADER));
+    header->SignatureStart = 0x52455043; //CPER
+    header->SectionCount = num_sections;
+    printf("%d sections\n", num_sections);
+    header->SignatureEnd = 0xFFFFFFFF;
+    header->Flags = 4; //HW_ERROR_FLAGS_SIMULATED
+
+    //Generate the section descriptors given the number of sections.
+    EFI_ERROR_SECTION_DESCRIPTOR* section_descriptors[num_sections];
+    for (int i=0; i<num_sections; i++)
+        section_descriptors[i] = generate_section_descriptor(argv[4 + i], section_lengths, i);
+
+    //Calculate total length of structure, set in header.
+    size_t total_len = sizeof(header);
+    for (int i=0; i<num_sections; i++)
+        total_len += section_lengths[i];
+    total_len += num_sections * sizeof(EFI_ERROR_SECTION_DESCRIPTOR);
+    header->RecordLength = (UINT32)total_len;
+
+    //Open a file handle to write output.
+    FILE* cper_file = fopen(argv[2], "w");
+    if (cper_file == NULL) 
+    {
+        printf("Could not get a handle for output file '%s', file handle returned null.\n", argv[2]);
+        return -1;
+    }
+
+    //Write to file in order, free all resources.
+    fwrite(header, sizeof(EFI_COMMON_ERROR_RECORD_HEADER), 1, cper_file);
+    fflush(cper_file);
+    free(header);
+    for (int i=0; i<num_sections; i++)
+    {
+        fwrite(section_descriptors[i], sizeof(EFI_ERROR_SECTION_DESCRIPTOR), 1, cper_file);
+        fflush(cper_file);
+        free(section_descriptors[i]);
+    }
+    for (int i=0; i<num_sections; i++) 
+    {
+        fwrite(sections[i], section_lengths[i], 1, cper_file);
+        fflush(cper_file);
+        free(sections[i]);
+    }
+    fclose(cper_file);
+}
+
+//Generates a single section descriptor for a section with the given properties.
+EFI_ERROR_SECTION_DESCRIPTOR* generate_section_descriptor(char* type, size_t* lengths, int index)
+{
+    EFI_ERROR_SECTION_DESCRIPTOR* descriptor = 
+        (EFI_ERROR_SECTION_DESCRIPTOR*)generate_random_bytes(sizeof(EFI_ERROR_SECTION_DESCRIPTOR));
+
+    //Set reserved bits to zero.
+    descriptor->SecValidMask &= 0b11;
+    descriptor->Resv1 = 0;
+    descriptor->SectionFlags &= 0xFF;
+
+    //Set length, offset from base record.
+    descriptor->SectionLength = (UINT32)lengths[index];
+    descriptor->SectionOffset = sizeof(EFI_COMMON_ERROR_RECORD_HEADER);
+    for (int i=0; i<index; i++)
+        descriptor->SectionOffset += lengths[i];
+
+    //Set section type GUID based on type name.
+    if (strcmp(type, "generic") == 0)
+        memcpy(&descriptor->SectionType, &gEfiProcessorGenericErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "ia32x64") == 0)
+        memcpy(&descriptor->SectionType, &gEfiIa32X64ProcessorErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "ipf") == 0)
+        memcpy(&descriptor->SectionType, &gEfiIpfProcessorErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "arm") == 0)
+        memcpy(&descriptor->SectionType, &gEfiArmProcessorErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "memory") == 0)
+        memcpy(&descriptor->SectionType, &gEfiPlatformMemoryErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "memory2") == 0)
+        memcpy(&descriptor->SectionType, &gEfiPlatformMemoryError2SectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "pcie") == 0)
+        memcpy(&descriptor->SectionType, &gEfiPcieErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "firmware") == 0)
+        memcpy(&descriptor->SectionType, &gEfiFirmwareErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "pcibus") == 0)
+        memcpy(&descriptor->SectionType, &gEfiPciBusErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "pcidev") == 0)
+        memcpy(&descriptor->SectionType, &gEfiPciDevErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "dmargeneric") == 0)
+        memcpy(&descriptor->SectionType, &gEfiDMArGenericErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "dmarvtd") == 0)
+        memcpy(&descriptor->SectionType, &gEfiDirectedIoDMArErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "dmariommu") == 0)
+        memcpy(&descriptor->SectionType, &gEfiIommuDMArErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "ccixper") == 0)
+        memcpy(&descriptor->SectionType, &gEfiCcixPerLogErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "cxlprotocol") == 0)
+        memcpy(&descriptor->SectionType, &gEfiCxlProtocolErrorSectionGuid, sizeof(EFI_GUID));
+    else if (strcmp(type, "cxlcomponent") == 0)
+    {
+        //Choose between the different CXL component type GUIDs.
+        int componentType = rand() % 5;
+        switch (componentType)
+        {
+            case 0:
+                memcpy(&descriptor->SectionType, &gEfiCxlGeneralMediaErrorSectionGuid, sizeof(EFI_GUID));
+                break;
+            case 1:
+                memcpy(&descriptor->SectionType, &gEfiCxlDramEventErrorSectionGuid, sizeof(EFI_GUID));
+                break;
+            case 2:
+                memcpy(&descriptor->SectionType, &gEfiCxlPhysicalSwitchErrorSectionGuid, sizeof(EFI_GUID));
+                break;
+            case 3:
+                memcpy(&descriptor->SectionType, &gEfiCxlVirtualSwitchErrorSectionGuid, sizeof(EFI_GUID));
+                break;
+            default:
+                memcpy(&descriptor->SectionType, &gEfiCxlMldPortErrorSectionGuid, sizeof(EFI_GUID));
+                break;
+        }
+    }
+    else if (strcmp(type, "unknown") != 0)
+    {
+        //Undefined section, show error.
+        printf("Undefined section type '%s' provided. See 'cper-generate --help' for command information.\n", type);
+        return 0;
+    }
+
+    return descriptor;
+}
+
+//Generates a single CPER section given the string type.
+size_t generate_section(void** location, char* type)
+{
+    //The length of the section.
+    size_t length = 0;
+
+    //Switch on the type, generate accordingly.
+    if (strcmp(type, "generic") == 0)
+        length = generate_section_generic(location);
+    else if (strcmp(type, "ia32x64") == 0)
+        length = generate_section_ia32x64(location);
+    // else if (strcmp(type, "ipf") == 0)
+    //     length = generate_section_ipf(location);
+    // else if (strcmp(type, "arm") == 0)
+    //     length = generate_section_arm(location);
+    // else if (strcmp(type, "memory") == 0)
+    //     length = generate_section_memory(location);
+    // else if (strcmp(type, "memory2") == 0)
+    //     length = generate_section_memory2(location);
+    // else if (strcmp(type, "pcie") == 0)
+    //     length = generate_section_pcie(location);
+    // else if (strcmp(type, "firmware") == 0)
+    //     length = generate_section_firmware(location);
+    // else if (strcmp(type, "pcibus") == 0)
+    //     length = generate_section_pci_bus(location);
+    // else if (strcmp(type, "pcidev") == 0)
+    //     length = generate_section_pci_dev(location);
+    // else if (strcmp(type, "dmargeneric") == 0)
+    //     length = generate_section_dmar_generic(location);
+    // else if (strcmp(type, "dmarvtd") == 0)
+    //     length = generate_section_dmar_vtd(location);
+    // else if (strcmp(type, "dmariommu") == 0)
+    //     length = generate_section_dmar_iommu(location);
+    // else if (strcmp(type, "ccixper") == 0)
+    //     length = generate_section_ccix_per(location);
+    // else if (strcmp(type, "cxlprotocol") == 0)
+    //     length = generate_section_cxl_protocol(location);
+    // else if (strcmp(type, "cxlcomponent") == 0)
+    //     length = generate_section_cxl_component(location);
+    // else if (strcmp(type, "unknown") == 0)
+    //     length = generate_section_unknown(location);
+    else 
+    {
+        //Undefined section, show error.
+        printf("Undefined section type '%s' given to generate. See 'cper-generate --help' for command information.\n", type);
+        return 0;
+    }
+
+    return length;
+}
+
+//Prints command help for this CPER generator.
+void print_help()
+{
+    printf(":: --out cper.file --sections section1 [section2 section3 ...]\n");
+    printf("\tGenerates a psuedo-random CPER file with the provided section types and outputs to the given file name.\n");
+    printf("\tValid section type names are the following:\n");
+    printf("\t\t- generic\n");
+    printf("\t\t- ia32x64\n");
+    printf("\t\t- ipf\n");
+    printf("\t\t- arm\n");
+    printf("\t\t- memory\n");
+    printf("\t\t- memory2\n");
+    printf("\t\t- pcie\n");
+    printf("\t\t- firmware\n");
+    printf("\t\t- pcibus\n");
+    printf("\t\t- pcidev\n");
+    printf("\t\t- dmargeneric\n");
+    printf("\t\t- dmarvtd\n");
+    printf("\t\t- dmariommu\n");
+    printf("\t\t- ccixper\n");
+    printf("\t\t- cxlprotocol\n");
+    printf("\t\t- cxlcomponent\n");
+    printf("\t\t- unknown\n");
+    printf("\n:: --help\n");
+    printf("\tDisplays help information to the console.\n");
+}
\ No newline at end of file
diff --git a/generator/gen-utils.c b/generator/gen-utils.c
new file mode 100644
index 0000000..a0f6e3c
--- /dev/null
+++ b/generator/gen-utils.c
@@ -0,0 +1,32 @@
+/**
+ * Utility functions to assist in generating psuedo-random CPER sections. 
+ * 
+ * Author: Lawrence.Tang@arm.com
+ **/
+#include <stdlib.h>
+#include <time.h>
+#include "../edk/BaseTypes.h"
+#include "gen-utils.h"
+
+//Generates a random section of the given byte size, saving the result to the given location.
+//Returns the length of the section as passed in.
+size_t generate_random_section(void** location, size_t size)
+{
+    *location = generate_random_bytes(size);
+    return size;
+}
+
+//Generates a random byte allocation of the given size.
+UINT8* generate_random_bytes(size_t size)
+{
+    UINT8* bytes = malloc(size);
+    for (size_t i = 0; i < size; i++)
+        bytes[i] = rand();
+    return bytes;
+}
+
+//Initializes the random seed for rand() using the current time.
+void init_random()
+{
+    srand((unsigned int)time(NULL));
+}
\ No newline at end of file
diff --git a/generator/gen-utils.h b/generator/gen-utils.h
new file mode 100644
index 0000000..4a966db
--- /dev/null
+++ b/generator/gen-utils.h
@@ -0,0 +1,11 @@
+#ifndef GEN_UTILS_H
+#define GEN_UTILS_H
+
+#include <stdlib.h>
+#include "../edk/BaseTypes.h"
+
+size_t generate_random_section(void** location, size_t size);
+UINT8* generate_random_bytes(size_t size);
+void init_random();
+
+#endif
\ No newline at end of file
diff --git a/generator/sections/gen-section-generic.c b/generator/sections/gen-section-generic.c
new file mode 100644
index 0000000..205fea1
--- /dev/null
+++ b/generator/sections/gen-section-generic.c
@@ -0,0 +1,26 @@
+/**
+ * Functions for generating psuedo-random CPER generic processor sections.
+ * 
+ * Author: Lawrence.Tang@arm.com
+ **/
+
+#include <stdlib.h>
+#include "../../edk/BaseTypes.h"
+#include "../gen-utils.h"
+#include "gen-section-generic.h"
+
+//Generates a single psuedo-random generic processor section, saving the resulting address to the given
+//location. Returns the size of the newly created section.
+size_t generate_section_generic(void** location)
+{
+    //Create random bytes.
+    size_t size = generate_random_section(location, 192);
+
+    //Set reserved locations to zero.
+    UINT8* start_byte = (UINT8*)*location;
+    *((UINT64*)start_byte) &= 0xFFF;
+    *(start_byte + 12) &= 0b111;
+    *((UINT16*)(start_byte + 14)) = 0x0;
+    
+    return size;
+}
\ No newline at end of file
diff --git a/generator/sections/gen-section-generic.h b/generator/sections/gen-section-generic.h
new file mode 100644
index 0000000..49ff655
--- /dev/null
+++ b/generator/sections/gen-section-generic.h
@@ -0,0 +1,8 @@
+#ifndef GEN_SECTION_GENERIC_H
+#define GEN_SECTION_GENERIC_H
+
+#include <stdlib.h>
+
+size_t generate_section_generic(void** location);
+
+#endif
\ No newline at end of file
diff --git a/generator/sections/gen-section-ia32x64.c b/generator/sections/gen-section-ia32x64.c
new file mode 100644
index 0000000..b06a237
--- /dev/null
+++ b/generator/sections/gen-section-ia32x64.c
@@ -0,0 +1,129 @@
+/**
+ * Functions for generating psuedo-random CPER IA32/x64 sections.
+ * 
+ * Author: Lawrence.Tang@arm.com
+ **/
+
+#include <stdlib.h>
+#include <string.h>
+#include "../../edk/Cper.h"
+#include "../gen-utils.h"
+#include "gen-section-ia32x64.h"
+
+void* generate_ia32x64_error_structure();
+size_t generate_ia32x64_context_structure(void** location);
+
+//Generates a single psuedo-random IA32/x64 section, saving the resulting address to the given
+//location. Returns the size of the newly created section.
+size_t generate_section_ia32x64(void** location)
+{
+    //Set up for generation of error/context structures.
+    UINT16 error_structure_num = rand() % 5;
+    UINT16 context_structure_num = rand() % 5;
+    void* error_structures[error_structure_num];
+    void* context_structures[context_structure_num];
+    size_t context_structure_lengths[context_structure_num];
+
+    //Generate the structures.
+    for (int i=0; i<error_structure_num; i++)
+        error_structures[i] = generate_ia32x64_error_structure();
+    for (int i=0; i<context_structure_num; i++)
+        context_structure_lengths[i] = generate_ia32x64_context_structure(context_structures + i);
+
+    //Create a valid IA32/x64 section.
+    size_t total_len = 64 + (IA32X64_ERROR_STRUCTURE_SIZE * error_structure_num);
+    for (int i=0; i<context_structure_num; i++)
+        total_len += context_structure_lengths[i];
+    UINT8* section = generate_random_bytes(total_len);
+
+    //Set header information.
+    UINT64* validation = (UINT64*)section;
+    *validation &= 0b11;
+    *validation |= error_structure_num << 2;
+    *validation |= context_structure_num << 8;
+
+    //Copy in structures, free resources.
+    UINT8* cur_pos = section + 64;
+    for (int i=0; i<error_structure_num; i++)
+    {
+        memcpy(cur_pos, error_structures[i], IA32X64_ERROR_STRUCTURE_SIZE);
+        free(error_structures[i]);
+        cur_pos += IA32X64_ERROR_STRUCTURE_SIZE;
+    }
+    for (int i=0; i<context_structure_num; i++)
+    {
+        memcpy(cur_pos, context_structures[i], context_structure_lengths[i]);
+        free(context_structures[i]);
+        cur_pos += context_structure_lengths[i];
+    }
+
+    //Set return values, exist.
+    *location = section;
+    return total_len;
+}
+
+//Generates a single IA32/x64 error structure. Must later be freed.
+void* generate_ia32x64_error_structure()
+{
+    UINT8* error_structure = generate_random_bytes(IA32X64_ERROR_STRUCTURE_SIZE);
+
+    //Create a random type of error structure.
+    EFI_GUID* guid = (EFI_GUID*)error_structure;
+    int error_structure_type = rand() % 4;
+    switch (error_structure_type)
+    {
+        //Cache
+        case 0:
+            memcpy(guid, &gEfiIa32x64ErrorTypeCacheCheckGuid, sizeof(guid));
+            memset(error_structure + 30, 0, 34);
+            break;
+
+        //TLB
+        case 1:
+            memcpy(guid, &gEfiIa32x64ErrorTypeTlbCheckGuid, sizeof(guid));
+            memset(error_structure + 30, 0, 34);
+            break;
+
+        //Bus
+        case 2:
+            memcpy(guid, &gEfiIa32x64ErrorTypeBusCheckGuid, sizeof(guid));
+            memset(error_structure + 35, 0, 29);
+            break;
+
+        //MS
+        case 3:
+            memcpy(guid, &gEfiIa32x64ErrorTypeMsCheckGuid, sizeof(guid));
+            memset(error_structure + 24, 0, 38);
+            break;
+    }
+
+    return error_structure;
+}
+
+//Generates a single IA32/x64 context structure. Must later be freed.
+size_t generate_ia32x64_context_structure(void** location)
+{
+    //Initial length is 16 bytes. Add extra based on type.
+    int reg_type = rand() % 8;
+    int reg_size = 0;
+
+    //Set register size.
+    if (reg_type == 2)
+        reg_size = 92; //IA32 registers.
+    if (reg_type == 3)
+        reg_size = 244; //x64 registers.
+    else
+        reg_size = rand() % 64; //Not table defined.
+
+    //Create structure randomly.
+    int total_size = 16 + reg_size;
+    UINT16* context_structure = (UINT16*)generate_random_bytes(total_size);
+
+    //Set header information.
+    *(context_structure) = reg_type;
+    *(context_structure + 1) = reg_size;
+
+    //Set return values and exit.
+    *location = context_structure;
+    return total_size;
+}
\ No newline at end of file
diff --git a/generator/sections/gen-section-ia32x64.h b/generator/sections/gen-section-ia32x64.h
new file mode 100644
index 0000000..78f5052
--- /dev/null
+++ b/generator/sections/gen-section-ia32x64.h
@@ -0,0 +1,10 @@
+#ifndef GEN_SECTION_IA32X64_H
+#define GEN_SECTION_IA32X64_H
+
+#include <stdlib.h>
+
+#define IA32X64_ERROR_STRUCTURE_SIZE 64
+
+size_t generate_section_ia32x64(void** location);
+
+#endif
\ No newline at end of file
