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