Remove ArmEbPkg and replace with ArmRealViewEbPkg. Ported ArmRealViewEbPkg to have a PEI phase, and added place holder CPU PEIM to ArmPkg. This ArmRealViewEbPkg now boots from SEC, PEI, DXE, BDS, to EBL in the ARM RealView system emulator that comes with RealView Pro.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10621 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
andrewfish
2010-07-02 12:00:00 +00:00
parent 7ee525b2c1
commit afdfe8f02b
60 changed files with 2494 additions and 759 deletions

View File

@@ -0,0 +1,16 @@
// returns the base address of the SEC FV in flash on the EB board
// change this address for where your platform's SEC FV is located
// (or make it more intelligent to search for it)
define /r FindFv()
{
return 0x40000000;
}
.
include /s 'ZZZZZZ/ArmRealViewEbPkg/Debugger_scripts/EfiFuncs.inc'
error=continue
unload ,all
error=abort
LoadPeiSec()
include C:\loadfiles.inc

View File

@@ -0,0 +1,463 @@
error=abort
// NOTE: THIS MAY NEED TO BE ADJUSTED
// change to reflect the total amount of ram in your system
define /r GetMaxMem()
{
return 0x10000000; // 256 MB
}
.
define /r GetWord(Addr)
{
unsigned long data;
if( (Addr & 0x2) == 0 )
{
data = dword(Addr);
data = data & 0xffff;
//$printf "getword data is %x\n", data$;
return data;
}
else
{
data = dword(Addr & 0xfffffffc);
//data = data >> 16;
data = data / 0x10000;
//$printf "getword data is %x (1)\n", data$;
return data;
}
}
.
define /r ProcessPE32(imgstart)
unsigned long imgstart;
{
unsigned long filehdrstart;
unsigned long debugdirentryrva;
unsigned long debugtype;
unsigned long debugrva;
unsigned long dwarfsig;
unsigned long baseofcode;
unsigned long baseofdata;
unsigned long elfbase;
char *elfpath;
$printf "PE32 image found at %x",imgstart$;
//$printf "PE file hdr offset %x",dword(imgstart+0x3C)$;
// offset from dos hdr to PE file hdr
filehdrstart = imgstart + dword(imgstart+0x3C);
// offset to debug dir in PE hdrs
//$printf "debug dir is at %x",(filehdrstart+0xA8)$;
debugdirentryrva = dword(filehdrstart + 0xA8);
if(debugdirentryrva == 0)
{
$printf "no debug dir for image at %x",imgstart$;
return;
}
//$printf "debug dir entry rva is %x",debugdirentryrva$;
debugtype = dword(imgstart + debugdirentryrva + 0xc);
if( (debugtype != 0xdf) && (debugtype != 0x2) )
{
$printf "debug type is not dwarf for image at %x",imgstart$;
$printf "debug type is %x",debugtype$;
return;
}
debugrva = dword(imgstart + debugdirentryrva + 0x14);
dwarfsig = dword(imgstart + debugrva);
if(dwarfsig != 0x66727764)
{
$printf "dwarf debug signature not found for image at %x",imgstart$;
return;
}
elfpath = (char *)(imgstart + debugrva + 0xc);
baseofcode = imgstart + dword(filehdrstart + 0x28);
baseofdata = imgstart + dword(filehdrstart + 0x2c);
if( (baseofcode < baseofdata) && (baseofcode != 0) )
{
elfbase = baseofcode;
}
else
{
elfbase = baseofdata;
}
$printf "found path %s",elfpath$;
$fprintf 50, "load /ni /np /a %s &0x%x\n",elfpath,elfbase$;
}
.
define /r ProcessTE(imgstart)
unsigned long imgstart;
{
unsigned long strippedsize;
unsigned long debugdirentryrva;
unsigned long debugtype;
unsigned long debugrva;
unsigned long dwarfsig;
unsigned long elfbase;
char *elfpath;
$printf "TE image found at %x",imgstart$;
// determine pe header bytes removed to account for in rva references
//strippedsize = word(imgstart + 0x6);
//strippedsize = (dword(imgstart + 0x4) & 0xffff0000) >> 16;
strippedsize = (dword(imgstart + 0x4) & 0xffff0000) / 0x10000;
strippedsize = strippedsize - 0x28;
debugdirentryrva = dword(imgstart + 0x20);
if(debugdirentryrva == 0)
{
$printf "no debug dir for image at %x",imgstart$;
return;
}
debugdirentryrva = debugdirentryrva - strippedsize;
//$printf "debug dir entry rva is %x",debugdirentryrva$;
debugtype = dword(imgstart + debugdirentryrva + 0xc);
if( (debugtype != 0xdf) && (debugtype != 0x2) )
{
$printf "debug type is not dwarf for image at %x",imgstart$;
$printf "debug type is %x",debugtype$;
return;
}
debugrva = dword(imgstart + debugdirentryrva + 0x14);
debugrva = debugrva - strippedsize;
dwarfsig = dword(imgstart + debugrva);
if( (dwarfsig != 0x66727764) && (dwarfsig != 0x3031424e) )
{
$printf "dwarf debug signature not found for image at %x",imgstart$;
$printf "found %x", dwarfsig$;
return;
}
if( dwarfsig == 0x66727764 )
{
elfpath = (char *)(imgstart + debugrva + 0xc);
$printf "looking for elf path at 0x%x", elfpath$;
}
else
{
elfpath = (char *)(imgstart + debugrva + 0x10);
$printf "looking for elf path at 0x%x", elfpath$;
}
// elf base is baseofcode (we hope that for TE images it's not baseofdata)
elfbase = imgstart + dword(imgstart + 0xc) - strippedsize;
$printf "found path %s",elfpath$;
$fprintf 50, "load /ni /np /a %s &0x%x\n",elfpath,elfbase$;
}
.
define /r ProcessFvSection(secstart)
unsigned long secstart;
{
unsigned long sectionsize;
unsigned char sectiontype;
sectionsize = dword(secstart);
//sectiontype = (sectionsize & 0xff000000) >> 24;
sectiontype = (sectionsize & 0xff000000) / 0x1000000;
sectionsize = sectionsize & 0x00ffffff;
$printf "fv section at %x size %x type %x",secstart,sectionsize,sectiontype$;
if(sectiontype == 0x10) // PE32
{
ProcessPE32(secstart+0x4);
}
else if(sectiontype == 0x12) // TE
{
ProcessTE(secstart+0x4);
}
}
.
define /r ProcessFfsFile(ffsfilestart)
unsigned long ffsfilestart;
{
unsigned long ffsfilesize;
unsigned long ffsfiletype;
unsigned long secoffset;
unsigned long secsize;
//ffsfiletype = byte(ffsfilestart + 0x12);
ffsfilesize = dword(ffsfilestart + 0x14);
//ffsfiletype = (ffsfilesize & 0xff000000) >> 24;
ffsfiletype = (ffsfilesize & 0xff000000) / 0x1000000;
ffsfilesize = ffsfilesize & 0x00ffffff;
if(ffsfiletype == 0xff) return;
$printf "ffs file at %x size %x type %x",ffsfilestart,ffsfilesize,ffsfiletype$;
secoffset = ffsfilestart + 0x18;
// loop through sections in file
while(secoffset < (ffsfilestart + ffsfilesize))
{
// process fv section and increment section offset by size
secsize = dword(secoffset) & 0x00ffffff;
ProcessFvSection(secoffset);
secoffset = secoffset + secsize;
// align to next 4 byte boundary
if( (secoffset & 0x3) != 0 )
{
secoffset = secoffset + (0x4 - (secoffset & 0x3));
}
} // end section loop
}
.
define /r LoadPeiSec()
{
unsigned long fvbase;
unsigned long fvlen;
unsigned long fvsig;
unsigned long ffsoffset;
unsigned long ffsfilesize;
fvbase = FindFv();
$printf "fvbase %x",fvbase$;
// get fv signature field
fvsig = dword(fvbase + 0x28);
if(fvsig != 0x4856465F)
{
$printf "FV does not have proper signature, exiting"$;
return 0;
}
$printf "FV signature found"$;
$fopen 50, 'C:\loadfiles.inc'$;
fvlen = dword(fvbase + 0x20);
// first ffs file is after fv header, use headerlength field
//ffsoffset = (dword(fvbase + 0x30) & 0xffff0000) >> 16;
ffsoffset = (dword(fvbase + 0x30) & 0xffff0000) / 0x10000;
ffsoffset = fvbase + GetWord(fvbase + 0x30);
// loop through ffs files
while(ffsoffset < (fvbase+fvlen))
{
// process ffs file and increment by ffs file size field
ProcessFfsFile(ffsoffset);
ffsfilesize = (dword(ffsoffset + 0x14) & 0x00ffffff);
if(ffsfilesize == 0)
{
break;
}
ffsoffset = ffsoffset + ffsfilesize;
// align to next 8 byte boundary
if( (ffsoffset & 0x7) != 0 )
{
ffsoffset = ffsoffset + (0x8 - (ffsoffset & 0x7));
}
} // end fv ffs loop
$vclose 50$;
}
.
define /r FindSystemTable(TopOfRam)
unsigned long TopOfRam;
{
unsigned long offset;
$printf "FindSystemTable"$;
$printf "top of mem is %x",TopOfRam$;
offset = TopOfRam;
// align to highest 4MB boundary
offset = offset & 0xFFC00000;
// start at top and look on 4MB boundaries for system table ptr structure
while(offset > 0)
{
//$printf "checking %x",offset$;
//$printf "value is %x",dword(offset)$;
// low signature match
if(dword(offset) == 0x20494249)
{
// high signature match
if(dword(offset+4) == 0x54535953)
{
// less than 4GB?
if(dword(offset+0x0c) == 0)
{
// less than top of ram?
if(dword(offset+8) < TopOfRam)
{
return(dword(offset+8));
}
}
}
}
if(offset < 0x400000) break;
offset = offset - 0x400000;
}
return 0;
}
.
define /r ProcessImage(ImageBase)
unsigned long ImageBase;
{
$printf "ProcessImage %x", ImageBase$;
}
.
define /r FindDebugInfo(SystemTable)
unsigned long SystemTable;
{
unsigned long CfgTableEntries;
unsigned long ConfigTable;
unsigned long i;
unsigned long offset;
unsigned long dbghdr;
unsigned long dbgentries;
unsigned long dbgptr;
unsigned long dbginfo;
unsigned long loadedimg;
$printf "FindDebugInfo"$;
dbgentries = 0;
CfgTableEntries = dword(SystemTable + 0x40);
ConfigTable = dword(SystemTable + 0x44);
$printf "config table is at %x (%d entries)", ConfigTable, CfgTableEntries$;
// now search for debug info entry with guid 49152E77-1ADA-4764-B7A2-7AFEFED95E8B
// 0x49152E77 0x47641ADA 0xFE7AA2B7 0x8B5ED9FE
for(i=0; i<CfgTableEntries; i++)
{
offset = ConfigTable + (i*0x14);
if(dword(offset) == 0x49152E77)
{
if(dword(offset+4) == 0x47641ADA)
{
if(dword(offset+8) == 0xFE7AA2B7)
{
if(dword(offset+0xc) == 0x8B5ED9FE)
{
dbghdr = dword(offset+0x10);
dbgentries = dword(dbghdr + 4);
dbgptr = dword(dbghdr + 8);
}
}
}
}
}
if(dbgentries == 0)
{
$printf "no debug entries found"$;
return;
}
$printf "debug table at %x (%d entries)", dbgptr, dbgentries$;
for(i=0; i<dbgentries; i++)
{
dbginfo = dword(dbgptr + (i*4));
if(dbginfo != 0)
{
if(dword(dbginfo) == 1) // normal debug info type
{
loadedimg = dword(dbginfo + 4);
ProcessPE32(dword(loadedimg + 0x20));
}
}
}
}
.
define /r LoadDxe()
{
unsigned long maxmem;
unsigned long systbl;
$printf "LoadDxe"$;
$fopen 50, 'C:\loadfiles.inc'$;
maxmem = GetMaxMem();
systbl = FindSystemTable(maxmem);
if(systbl != 0)
{
$printf "found system table at %x",systbl$;
FindDebugInfo(systbl);
}
$vclose 50$;
}
.
define /r LoadRuntimeDxe()
{
unsigned long maxmem;
unsigned long SystemTable;
unsigned long CfgTableEntries;
unsigned long ConfigTable;
unsigned long i;
unsigned long offset;
unsigned long numentries;
unsigned long RuntimeDebugInfo;
unsigned long DebugInfoOffset;
unsigned long imgbase;
$printf "LoadRuntimeDxe"$;
$fopen 50, 'C:\loadfiles.inc'$;
RuntimeDebugInfo = 0x80000010;
if(RuntimeDebugInfo != 0)
{
numentries = dword(RuntimeDebugInfo);
$printf "runtime debug info is at %x (%d entries)", RuntimeDebugInfo, numentries$;
DebugInfoOffset = RuntimeDebugInfo + 0x4;
for(i=0; i<numentries; i++)
{
imgbase = dword(DebugInfoOffset);
if(imgbase != 0)
{
$printf "found image at %x",imgbase$;
ProcessPE32(imgbase);
}
DebugInfoOffset = DebugInfoOffset + 0x4;
}
}
$vclose 50$;
}
.

View File

@@ -0,0 +1,21 @@
//
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
error = continue
unload
error = abort
setreg @CP15_CONTROL = 0x0005107E
setreg @pc=0x80008208
setreg @cpsr=0x000000D3
dis/D
readfile,raw,nowarn "ZZZZZZ/FV/BEAGLEBOARD_EFI.fd"=0x80008000

View File

@@ -0,0 +1,23 @@
#!/bin/sh
#
# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http:#opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
IN=`/usr/bin/cygpath -u $1`
OUT=`/usr/bin/cygpath -u $2`
/usr/bin/sed -e "s/\/cygdrive\/\(.\)/load\/a\/ni\/np \"\1:/g" \
-e 's:\\:/:g' \
-e "s/^/load\/a\/ni\/np \"/g" \
-e "s/dll /dll\" \&/g" \
$IN | /usr/bin/sort.exe --key=3 --output=$OUT

Binary file not shown.

View File

@@ -0,0 +1,67 @@
//
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
error = continue
unload
error = abort
setreg @CP15_CONTROL = 0x0005107E
setreg @cpsr=0x000000D3
; General clock settings.
setmem /32 0x48307270=0x00000080
setmem /32 0x48306D40=0x00000003
setmem /32 0x48005140=0x03020A50
;Clock configuration
setmem /32 0x48004A40=0x0000030A
setmem /32 0x48004C40=0x00000015
;DPLL3 (Core) settings
setmem /32 0x48004D00=0x00370037
setmem /32 0x48004D30=0x00000000
setmem /32 0x48004D40=0x094C0C00
;DPLL4 (Peripheral) settings
setmem /32 0x48004D00=0x00370037
setmem /32 0x48004D30=0x00000000
setmem /32 0x48004D44=0x0001B00C
setmem /32 0x48004D48=0x00000009
;DPLL1 (MPU) settings
setmem /32 0x48004904=0x00000037
setmem /32 0x48004934=0x00000000
setmem /32 0x48004940=0x0011F40C
setmem /32 0x48004944=0x00000001
setmem /32 0x48004948=0x00000000
;RAM setup.
setmem /16 0x6D000010=0x0000
setmem /16 0x6D000040=0x0001
setmem /16 0x6D000044=0x0100
setmem /16 0x6D000048=0x0000
setmem /32 0x6D000060=0x0000000A
setmem /32 0x6D000070=0x00000081
setmem /16 0x6D000040=0x0003
setmem /32 0x6D000080=0x02D04011
setmem /16 0x6D000084=0x0032
setmem /16 0x6D00008C=0x0000
setmem /32 0x6D00009C=0xBA9DC4C6
setmem /32 0x6D0000A0=0x00012522
setmem /32 0x6D0000A4=0x0004E201
setmem /16 0x6D000040=0x0003
setmem /32 0x6D0000B0=0x02D04011
setmem /16 0x6D0000B4=0x0032
setmem /16 0x6D0000BC=0x0000
setmem /32 0x6D0000C4=0xBA9DC4C6
setmem /32 0x6D0000C8=0x00012522
setmem /32 0x6D0000D4=0x0004E201

View File

@@ -0,0 +1,23 @@
//
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
include 'ZZZZZZ/rvi_symbols_macros.inc'
macro write_symbols_file("ZZZZZZ/rvi_symbols.tmp", 0x00000000, 0x10000000)
host "bash -o igncr ZZZZZZ/rvi_convert_symbols.sh ZZZZZZ/rvi_symbols.tmp ZZZZZZ/rvi_symbols.inc"
include 'ZZZZZZ/rvi_symbols.inc'
load /NI /NP 'ZZZZZZ/rvi_dummy.axf' ;.constdata
unload rvi_dummy.axf
delfile rvi_dummy.axf

View File

@@ -0,0 +1,194 @@
//
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
define /R int compare_guid(guid1, guid2)
unsigned char *guid1;
unsigned char *guid2;
{
return strncmp(guid1, guid2, 16);
}
.
define /R unsigned char * find_system_table(mem_start, mem_size)
unsigned char *mem_start;
unsigned long mem_size;
{
unsigned char *mem_ptr;
mem_ptr = mem_start + mem_size;
do
{
mem_ptr -= 0x400000; // 4 MB
if (strncmp(mem_ptr, "IBI SYST", 8) == 0)
{
return *(unsigned long *)(mem_ptr + 8); // EfiSystemTableBase
}
} while (mem_ptr > mem_start);
return 0;
}
.
define /R unsigned char * find_debug_info_table_header(system_table)
unsigned char *system_table;
{
unsigned long configuration_table_entries;
unsigned char *configuration_table;
unsigned long index;
unsigned char debug_table_guid[16];
// Fill in the debug table's guid
debug_table_guid[ 0] = 0x77;
debug_table_guid[ 1] = 0x2E;
debug_table_guid[ 2] = 0x15;
debug_table_guid[ 3] = 0x49;
debug_table_guid[ 4] = 0xDA;
debug_table_guid[ 5] = 0x1A;
debug_table_guid[ 6] = 0x64;
debug_table_guid[ 7] = 0x47;
debug_table_guid[ 8] = 0xB7;
debug_table_guid[ 9] = 0xA2;
debug_table_guid[10] = 0x7A;
debug_table_guid[11] = 0xFE;
debug_table_guid[12] = 0xFE;
debug_table_guid[13] = 0xD9;
debug_table_guid[14] = 0x5E;
debug_table_guid[15] = 0x8B;
configuration_table_entries = *(unsigned long *)(system_table + 64);
configuration_table = *(unsigned long *)(system_table + 68);
for (index = 0; index < configuration_table_entries; index++)
{
if (compare_guid(configuration_table, debug_table_guid) == 0)
{
return *(unsigned long *)(configuration_table + 16);
}
configuration_table += 20;
}
return 0;
}
.
define /R int valid_pe_header(header)
unsigned char *header;
{
if ((header[0x00] == 'M') &&
(header[0x01] == 'Z') &&
(header[0x80] == 'P') &&
(header[0x81] == 'E'))
{
return 1;
}
return 0;
}
.
define /R unsigned long pe_headersize(header)
unsigned char *header;
{
unsigned long *size;
size = header + 0x00AC;
return *size;
}
.
define /R unsigned char *pe_filename(header)
unsigned char *header;
{
unsigned long *debugOffset;
unsigned char *stringOffset;
if (valid_pe_header(header))
{
debugOffset = header + 0x0128;
stringOffset = header + *debugOffset + 0x002C;
return stringOffset;
}
return 0;
}
.
define /R int char_is_valid(c)
unsigned char c;
{
if (c >= 32 && c < 127)
return 1;
return 0;
}
.
define /R write_symbols_file(filename, mem_start, mem_size)
unsigned char *filename;
unsigned char *mem_start;
unsigned long mem_size;
{
unsigned char *system_table;
unsigned char *debug_info_table_header;
unsigned char *debug_info_table;
unsigned long debug_info_table_size;
unsigned long index;
unsigned char *debug_image_info;
unsigned char *loaded_image_protocol;
unsigned char *image_base;
unsigned char *debug_filename;
unsigned long header_size;
int status;
system_table = find_system_table(mem_start, mem_size);
if (system_table == 0)
{
return;
}
status = fopen(88, filename, "w");
debug_info_table_header = find_debug_info_table_header(system_table);
debug_info_table = *(unsigned long *)(debug_info_table_header + 8);
debug_info_table_size = *(unsigned long *)(debug_info_table_header + 4);
for (index = 0; index < (debug_info_table_size * 4); index += 4)
{
debug_image_info = *(unsigned long *)(debug_info_table + index);
if (debug_image_info == 0)
{
break;
}
loaded_image_protocol = *(unsigned long *)(debug_image_info + 4);
image_base = *(unsigned long *)(loaded_image_protocol + 32);
debug_filename = pe_filename(image_base);
header_size = pe_headersize(image_base);
$fprintf 88, "%s 0x%08x\n", debug_filename, image_base + header_size$;
}
fclose(88);
}
.

View File

@@ -0,0 +1,118 @@
//
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
error = continue
unload
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
delfile 1
error = abort