/************************************************************************** * * Copyright (c) 2013 Alcatel-Lucent * * Alcatel Lucent licenses this file to You under the Apache License, * Version 2.0 (the "License"); you may not use this file except in * compliance with the License. A copy of the License is contained the * file LICENSE at the top level of this repository. * You may also obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ************************************************************************** * * tfsprivate.h: * * Header file for TFS used only by the monitor code. * (that is... this should not be used by anything under umon_apps) * * Original author: Ed Sutter (ed.sutter@alcatel-lucent.com) * */ #ifndef _TFSPRIVATE_H_ #define _TFSPRIVATE_H_ #define SANITY 0xBEEF #define ERASED16 0xFFFF #define ERASED32 0xFFFFFFFF #define TFS_MAXOPEN 10 /* Maximum of 10 open files */ #define TFS_QRYTMOUT 100000 /* Timeout for QRYBRUN */ #define TFS_FSIZEMOD 16 /* File size must be a multiple of this value */ #define MINUSRLEVEL 0 /* Minimum user level supported. */ #define MAXUSRLEVEL 3 /* Maximum user level supported. */ #define TFSHDRVERSION 1 /* Increment this if TFS header changes. */ #if TFS_EBIN_COFF #define TFS_EBIN_NAME "coff" #elif TFS_EBIN_AOUT #define TFS_EBIN_NAME "aout" #elif TFS_EBIN_ELF #define TFS_EBIN_NAME "elf" #elif TFS_EBIN_MSBIN #define TFS_EBIN_NAME "msbin" #elif TFS_EBIN_ELFMSBIN #define TFS_EBIN_NAME "elf_msbin" #else #define TFS_EBIN_NAME "NA" #endif /* Two different types of Defragmentation tests: * sector erase and flash write. */ #define DEFRAG_TEST_SERASE 1 #define DEFRAG_TEST_FWRITE 2 #define DEFRAG_TEST_EXIT 3 /* Masks used to allow flags and modes to be part of the same long word. */ #define TFS_FLAGMASK 0x0000ffff #define TFS_MODEMASK 0xffff0000 /* Definitions related to tfslog: */ #define TFSLOG_ADD 0 #define TFSLOG_DEL 1 #define TFSLOG_IPM 2 #define TFSLOG_ON 3 #define TFSLOG_OFF 4 #define TIME_UNDEFINED 0xffffffff /* Used by tfsscript.. */ #define EXIT_SCRIPT (1 << 0) #define REMOVE_SCRIPT (1 << 1) #define EXECUTE_AFTER_EXIT (1 << 2) #define EXIT_ALL_SCRIPTS (1 << 3) /* Device Table structure and definitions: * The Device table is typically only one entry in length. It is defined * on a per-target basis in the file tfsdev.h. In the simplest case, the * table in tfsdev.h has all of the information in it. This is fine as long * as there is no need to support different devices with the same monitor * binary. To support the ability to have a device-table that is constructed * based on the type of flash on-board, the TFS_DEVINFO_DYNAMIC bit must * be set in the devinfo member of tfsdevtbl (in tfsdev.h). This tells TFS * to figure out the addresses based on a few assumptions... * * Regardless of the device type, the start address will be the same. * * The spare sector starts immediately after the end of TFS storage space. * In dynamic mode, all that needs to be specified in the tfsdevtbl of * tfsdev.h is a prefix, start and devinfo fields. The other fields will * be built based on information taken from the flash interface. * One important note: if there is a block of contiguous flash space that * spans accross multiple flash banks, then the bank # of the LAST bank in * that block is what should be specified in the devinfo BANKMASK field. */ #define TFSEOT 0xffffffff #define TDEV struct tfsdev #define TFS_DEVTYPE_RAM 0x00100000 #define TFS_DEVTYPE_FLASH 0x00200000 #define TFS_DEVTYPE_NVRAM 0x00300000 #define TFS_DEVTYPE_MASK 0x00f00000 #define TFS_DEVINFO_DYNAMIC 0x00080000 #define TFS_DEVINFO_AUTOINIT 0x00040000 #define TFS_DEVINFO_BANKMASK 0x00000fff #define TFSDEVTOT ((sizeof(tfsdevtbl))/(sizeof(struct tfsdev))) #define TFS_DEVTYPE_ISRAM(tdp) \ (((tdp->devinfo & TFS_DEVTYPE_MASK) == TFS_DEVTYPE_RAM) || \ ((tdp->devinfo & TFS_DEVTYPE_MASK) == TFS_DEVTYPE_NVRAM)) struct tfsdev { char *prefix; /* Device name prefix. */ unsigned long start; /* First location into which TFS can */ /* begin to store files. */ unsigned long end; /* Last address into which TFS can */ /* place file data. This is usually */ /* one unit below the start of the */ /* spare sector. */ unsigned long spare; /* Start address of device spare */ /* sector. */ unsigned long sparesize; /* Size of device spare sector. */ unsigned long sectorcount; /* Number of sectors in this device. */ unsigned long devinfo; /* RAM or FLASH, etc... */ }; /* TFS defragmentation header: * This header is used during defragmentation to record the state of the * files in flash prior to the start of the defragmentation process. */ struct defraghdr { struct tfshdr *ohdr; /* Original location of header. */ struct tfshdr *nextfile; /* Location of next file. */ long filsize; /* Size of file. */ unsigned long crc; /* 32 bit crc of this header. */ unsigned long ohdrcrc; /* Copy of file's original hdrcrc. */ long idx; /* Index into defrag hdr table. */ int nesn; /* New end sector number. */ long neso; /* New end sector offset. */ long oeso; /* Original end sector offset. */ char *nda; /* New destination address. */ char fname[TFSNAMESIZE+1]; /* Name of file. */ }; /* sectorcrc: * This structure is used to store the crc of the sectors before and * after a defragmentation. A table of these structures is built prior * to startup of any file relocation. */ struct sectorcrc { unsigned long precrc; unsigned long postcrc; }; #define DEFRAGHDRSIZ sizeof(struct defraghdr) #define DEFRAGHDR struct defraghdr /* States used during defragmentation: */ #define SECTOR_DEFRAG_INACTIVE 1 #define SCANNING_ACTIVE_SECTOR 2 #define SCANNING_ACTIVE_SECTOR_1 3 #define SCANNING_ACTIVE_SECTOR_2 4 #define SCANNING_ACTIVE_SECTOR_3 5 #define SCANNING_ACTIVE_SECTOR_4 6 #define SCANNING_ACTIVE_SECTOR_5 7 #define SECTOR_DEFRAG_ALMOST_DONE 8 #define SECTOR_DEFRAG_ABORT_RESTART 9 /* Different ways in which a file can span across the active sector. */ #define SPANTYPE_UNDEF 0 /* Span type undefined */ #define SPANTYPE_BPEP 1 /* Begin-previous/end-previous */ #define SPANTYPE_BPEC 2 /* Begin-previous/end-current */ #define SPANTYPE_BPEL 3 /* Begin-previous/end-later */ #define SPANTYPE_BCEC 4 /* Begin-current/end-current */ #define SPANTYPE_BCEL 5 /* Begin-current/end-later */ #define SPANTYPE_BLEL 6 /* Begin-later/end-later */ /* struct tfsdat: Used by TFS to keep track of an opened file. */ struct tfsdat { long offset; /* Current offset into file. */ long hwp; /* High water point for modified file. */ unsigned char *base; /* Base address of file. */ long flagmode; /* Flags & mode file was opened with. */ struct tfshdr hdr; /* File structure. */ }; /* struct tfsdfg, tfsflg & tfserr: Structures provide an easy means of translation between values and strings that explain those values. */ struct tfsflg { long flag; char sdesc; char *ldesc; long mask; }; struct tfserr { long err; char *msg; }; struct tfsdfg { long state; char *msg; }; struct tfsinfo { int liveftot; /* Number of live files. */ int livedata; /* Space used by living file data. */ int liveovrhd; /* Space used by living file overhead. */ int deadftot; /* Number of dead files. */ int deaddata; /* Space used by dead file data. */ int deadovrhd; /* Space used by dead file overhead. */ int pso; /* Per-sector (not per file) TFS overhead. */ int sos; /* Size of spare sector(s). */ int memtot; /* Total tfs memory space in device(s). */ int memfree; /* Memory space available for new file data. */ int memused; /* Total memory space used by files & overhead. */ int memfordata; /* Total memory available for new file data. */ int sectortot; /* Total number of sectors in this tfs device. */ }; typedef struct tfsinfo TINFO; /* Extern data: */ extern long tfsTrace; extern long tfsFmodCount; extern TFILE **tfsAlist; extern TDEV tfsDeviceTbl[]; #ifdef TFS_ALTDEVTBL_BASE extern TDEV *alt_tfsdevtbl; #endif extern TDEV alt_tfsdevtbl_base; extern struct tfsdat tfsSlots[]; extern struct tfsflg tfsflgtbl[]; extern int ScriptExitFlag; extern int TfsCleanEnable; extern int DefragTestPoint; extern int DefragTestType; extern int DefragTestSector; /* Extern functions: */ extern int tfseof(int); extern int tfsinit(void); extern int _tfsinit(TDEV *); extern int tfsreorder(void); extern int tfsrunboot(void); extern int tfsfixup(int,int); extern int tfsunlink(char *); extern int tfslink(char *,char *); extern int tfsclean_on(void); extern int tfsclean_off(void); extern int _tfsunlink(char *); extern int tfsflasherase(int); extern int tfsrun(char **,int); extern int tfscheck(TDEV *,int); extern int validtfshdr(TFILE *); extern int tfstruncate(int,long); extern int tfsclose(int, char *); extern int tfsscript(TFILE *,int); extern int tfsseek(int, int, int); extern int tfsread(int,char *,int); extern int tfsspace(char *); extern int showTfsError(int,char *); extern int tfsflasheraseall(TDEV *); extern int tfsflasherased(TDEV *,int); extern int tfswrite(int, char *, int); extern int tfsgetline(int,char *,int); extern int tfsLogCmd(int,char **,int); extern int tfsopen(char *,long,char *); extern int tfsfstat(char *name,TFILE *); extern int tfsmemuse(TDEV *,TINFO *,int); extern int tfsipmod(char *,char *,int,int); extern int tfsclean_nps(TDEV *, char *, unsigned long); extern int tfsloadebin(TFILE *,int,long *,char *,int); extern int tfsloadebin_l(TFILE *,int,long *,int); extern int tfsadd(char *,char *,char *,unsigned char *,int); extern int tfsflashwrite(unsigned char *,unsigned char *,long); extern int tfsclean(TDEV *,int); extern int _tfsclean(TDEV *,int,int); extern int tfsautoclean(TDEV *,int); extern int (*tfsDocommand)(char *,int); extern int dumpDhdr(struct defraghdr *), dumpDhdrTbl(struct defraghdr *,int); extern int dumpFhdr(TFILE *); extern int tfsRunningMonrc(void); extern int tfsramdevice(char *,long,long); extern int tfscfg(char *,unsigned long, unsigned long, unsigned long); extern int tfscfgrestore(void); extern int tfsflagsatob(char *, long *); extern TDEV *gettfsdev_fromprefix(char *,int); extern TFILE *tfsnext(TFILE *); extern TFILE *tfsstat(char *name); extern TFILE *_tfsstat(char *name,int uselink); extern TFILE *nextfp(TFILE *,TDEV *); extern long tfstell(int); extern long (*tfsGetLtime)(void); extern long tfsctrl(int,long,long); extern unsigned long tfshdrcrc(TFILE *); extern char *tfsBase(TFILE *); extern char *tfserrmsg(int); extern char *tfsscriptname(void); extern char *tfsflagsbtoa(long,char *); extern char *(*tfsGetAtime)(long,char *,int); extern void tfsclear(TDEV *); extern void gototag(char *); extern void gosubtag(char *); extern void gosubret(char *); extern void exitscript(char *); extern void tfsstartup(void); extern void tfslog(int,char *); extern void tfsFacilityUnavailable(char *); extern void tfsrunrcfile(void); #endif