00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef SMIIMPL_H
00019 #define SMIIMPL_H
00020
00021 #include "smbios/ISmi.h"
00022 #include "SmiLowLevel.h"
00023 #include "ExceptionImpl.h"
00024
00025 namespace smi
00026 {
00027
00028 DEFINE_EXCEPTION_EX( SmiExceptionImpl, smi, SmiException);
00029 DEFINE_EXCEPTION_EX( InvalidSmiModeImpl, smi, InvalidSmiMode);
00030 DEFINE_EXCEPTION_EX( ParameterErrorImpl, smi, ParameterError);
00031 DEFINE_EXCEPTION_EX( UnsupportedSmiImpl, smi, UnsupportedSmi);
00032 DEFINE_EXCEPTION_EX( UnhandledSmiImpl, smi, UnhandledSmi);
00033 DEFINE_EXCEPTION_EX( SmiExecutedWithErrorImpl, smi, SmiExecutedWithError);
00034 DEFINE_EXCEPTION_EX( PasswordVerificationFailedImpl, smi, PasswordVerificationFailed);
00035 DEFINE_EXCEPTION_EX( ConfigErrorImpl, smi, ConfigError);
00036
00037 class SmiStrategy
00038 {
00039 public:
00040 SmiStrategy()
00041 {}
00042 ;
00043 virtual ~SmiStrategy()
00044 {}
00045 ;
00046
00047 virtual void lock()
00048 = 0;
00049 virtual void setSize(int) = 0;
00050 virtual size_t getPhysicalBufferBaseAddress() = 0;
00051 virtual void addInputBuffer(u8 *buffer, size_t size) = 0;
00052 virtual void execute() = 0;
00053 virtual void getResultBuffer(u8 *buffer, size_t size) = 0;
00054 virtual void finish() = 0;
00055 };
00056
00057 class SmiMockStrategy : public SmiStrategy
00058 {
00059 public:
00060 SmiMockStrategy(std::string initFilename) : fh(fopen (initFilename.c_str (), "w+b")), filename(initFilename)
00061 {}
00062 ;
00063 virtual ~SmiMockStrategy()
00064 {
00065 fclose (fh);
00066 };
00067
00068 virtual void lock()
00069 {}
00070 ;
00071 virtual void setSize(int)
00072 {}
00073 ;
00074 virtual size_t getPhysicalBufferBaseAddress()
00075 {
00076 return 0xDEADBEEF;
00077 };
00078 virtual void addInputBuffer(u8 *buffer, size_t size)
00079 {
00080 fwrite(buffer, 1, size, fh);
00081 };
00082 virtual void execute()
00083 {
00084 fseek(fh,0,0);
00085 };
00086 virtual void getResultBuffer(u8 *buffer, size_t size)
00087 {
00088 size_t numbytes = fread(buffer,1,size,fh);
00089 if (numbytes != size)
00090 {
00091 throw SmiExceptionImpl("Short read from file.");
00092 }
00093 };
00094 virtual void finish()
00095 {}
00096 ;
00097 private:
00098 FILE *fh;
00099 std::string filename;
00100 };
00101
00102 class SmiArchStrategy : public SmiStrategy
00103 {
00104 public:
00105 SmiArchStrategy();
00106 virtual ~SmiArchStrategy();
00107
00108 virtual void lock()
00109 ;
00110 virtual void setSize(int);
00111 virtual size_t getPhysicalBufferBaseAddress();
00112 virtual void addInputBuffer(u8 *buffer, size_t size);
00113 virtual void execute();
00114 virtual void getResultBuffer(u8 *buffer, size_t size);
00115 virtual void finish();
00116
00117 private:
00118 void *privateData;
00119 };
00120
00121
00122 class DellCallingInterfaceSmiImpl : virtual public IDellCallingInterfaceSmi
00123 {
00124 public:
00125 DellCallingInterfaceSmiImpl(SmiStrategy *, u16 address, u8 code );
00126 virtual ~DellCallingInterfaceSmiImpl();
00127
00128 virtual void execute();
00129 virtual void setClass( u16 newClass );
00130 virtual void setSelect( u16 newSelect );
00131 virtual void setArg( u8 argNumber, u32 argValue );
00132 virtual u32 getRes( u8 resNumber ) const;
00133 virtual void setArgAsPhysicalAddress( u8 argNumber, u32 bufferOffset );
00134 virtual const u8 *getBufferPtr();
00135 virtual void setBufferSize(size_t newSize);
00136 virtual void setBufferContents(const u8 *, size_t size);
00137
00138 protected:
00139 struct calling_interface_command_buffer smi_buf;
00140 bool argIsAddress[4];
00141 u32 argAddressOffset[4];
00142 struct callintf_cmd kernel_buf;
00143 u8 *buffer;
00144 size_t bufferSize;
00145 std::auto_ptr<SmiStrategy> smiStrategy;
00146
00147 private:
00148 DellCallingInterfaceSmiImpl();
00149 };
00150
00151 }
00152
00153 #endif