• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

SmiImpl.h

Go to the documentation of this file.
00001 // vim:expandtab:autoindent:tabstop=4:shiftwidth=4:filetype=c:
00002 /*
00003  * Copyright (C) 2005 Dell Inc.
00004  *  by Michael Brown <Michael_E_Brown@dell.com>
00005  * Licensed under the Open Software License version 2.1
00006  *
00007  * Alternatively, you can redistribute it and/or modify
00008  * it under the terms of the GNU General Public License as published
00009  * by the Free Software Foundation; either version 2 of the License,
00010  * or (at your option) any later version.
00011  
00012  * This program is distributed in the hope that it will be useful, but
00013  * WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00015  * See the GNU General Public License for more details.
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     // define our exceptions
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); // only used in unit tests, not critical
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  /* SMIIMPL_H */

Generated on Sun Aug 22 2010 14:38:30 for SMBIOS Library by  doxygen 1.7.1