Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

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 namespace smi
00026 {
00027     // define our exceptions
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); // only used in unit tests, not critical
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  /* SMIIMPL_H */

Generated on Tue Feb 26 14:39:00 2008 for SMBIOS Library by  doxygen 1.3.9.1