EDK2 doxygen online documents - Firmware Encoding Index 1
EDK2 doxygen online documents - Firmware Encoding Index

UnixPkg/Library/UnixBaseLib/X64/GccInline.c

Go to the documentation of this file.
00001 
00017 #include "BaseLibInternals.h"
00018 
00019 
00020 
00021 
00029 VOID
00030 EFIAPI
00031 MemoryFence (
00032   VOID
00033   )
00034 {
00035   // This is a little bit of overkill and it is more about the compiler that it is
00036   // actually processor synchronization. This is like the _ReadWriteBarrier 
00037   // Microsoft specific intrinsic
00038   __asm__ __volatile__ ("":::"memory");
00039 }
00040 
00041 
00048 VOID
00049 EFIAPI
00050 EnableInterrupts (
00051   VOID
00052   )
00053 {
00054   __asm__ __volatile__ ("sti"::: "memory");
00055 }
00056 
00057 
00064 VOID
00065 EFIAPI
00066 DisableInterrupts (
00067   VOID
00068   )
00069 {  
00070   __asm__ __volatile__ ("cli"::: "memory");
00071 }
00072 
00073 
00074 
00075 
00083 VOID
00084 EFIAPI
00085 CpuPause (
00086   VOID
00087   )
00088 {
00089   __asm__ __volatile__ ("pause");
00090 }
00091 
00092 
00100 VOID
00101 EFIAPI
00102 CpuBreakpoint (
00103   VOID
00104   )
00105 {
00106   __asm__ __volatile__ ("int $3");
00107 }
00108 
00109 
00110 
00125 UINT64
00126 EFIAPI
00127 AsmReadMsr64 (
00128   IN      UINT32                    Index
00129   )
00130 {
00131   UINT32 LowData;
00132   UINT32 HighData;
00133   
00134   __asm__ __volatile__ (
00135     "rdmsr"
00136     : "=a" (LowData),   // %0
00137       "=d" (HighData)   // %1
00138     : "c"  (Index)      // %2
00139     );
00140     
00141   return (((UINT64)HighData) << 32) | LowData;
00142 }
00143 
00161 UINT64
00162 EFIAPI
00163 AsmWriteMsr64 (
00164   IN      UINT32                    Index,
00165   IN      UINT64                    Value
00166   )
00167 {
00168   UINT32 LowData;
00169   UINT32 HighData;
00170 
00171   LowData  = (UINT32)(Value);
00172   HighData = (UINT32)(Value >> 32);
00173   
00174   __asm__ __volatile__ (
00175     "wrmsr"
00176     :
00177     : "c" (Index),
00178       "a" (LowData),
00179       "d" (HighData)
00180     );
00181     
00182   return Value;
00183 }
00184 
00185 
00186 
00197 UINTN
00198 EFIAPI
00199 AsmReadEflags (
00200   VOID
00201   )
00202 {
00203   UINTN Eflags;
00204   
00205   __asm__ __volatile__ (
00206     "pushfq         \n\t"
00207     "pop     %0         "
00208     : "=r" (Eflags)       // %0
00209     );
00210     
00211   return Eflags;
00212 }
00213 
00214 
00215 
00226 UINTN
00227 EFIAPI
00228 AsmReadCr0 (
00229   VOID
00230   )
00231 {
00232   UINTN   Data;
00233   
00234   __asm__ __volatile__ (
00235     "mov  %%cr0,%0" 
00236     : "=r" (Data)           // %0
00237     );
00238   
00239   return Data;
00240 }
00241 
00242 
00253 UINTN
00254 EFIAPI
00255 AsmReadCr2 (
00256   VOID
00257   )
00258 {
00259   UINTN Data;
00260   
00261   __asm__ __volatile__ (
00262     "mov  %%cr2,  %0" 
00263     : "=r" (Data)           // %0
00264     );
00265   
00266   return Data;
00267 }
00268 
00279 UINTN
00280 EFIAPI
00281 AsmReadCr3 (
00282   VOID
00283   )
00284 {
00285   UINTN Data;
00286   
00287   __asm__ __volatile__ (
00288     "mov  %%cr3,  %0" 
00289     : "=r" (Data)           // %0
00290     );
00291   
00292   return Data;
00293 }
00294 
00295 
00306 UINTN
00307 EFIAPI
00308 AsmReadCr4 (
00309   VOID
00310   )
00311 {
00312   UINTN Data;
00313   
00314   __asm__ __volatile__ (
00315     "mov  %%cr4,  %0" 
00316     : "=r" (Data)           // %0
00317     );
00318   
00319   return Data;
00320 }
00321 
00322 
00334 UINTN
00335 EFIAPI
00336 AsmWriteCr0 (
00337   UINTN  Cr0
00338   )
00339 {
00340   __asm__ __volatile__ (
00341     "mov  %0, %%cr0"
00342     :
00343     : "r" (Cr0)
00344     );
00345   return Cr0;
00346 }
00347 
00348 
00360 UINTN
00361 EFIAPI
00362 AsmWriteCr2 (
00363   UINTN  Cr2
00364   )
00365 {
00366   __asm__ __volatile__ (
00367     "mov  %0, %%cr2"
00368     :
00369     : "r" (Cr2)
00370     );
00371   return Cr2;
00372 }
00373 
00374 
00386 UINTN
00387 EFIAPI
00388 AsmWriteCr3 (
00389   UINTN  Cr3
00390   )
00391 {
00392   return Cr3;
00393 }
00394 
00395 
00407 UINTN
00408 EFIAPI
00409 AsmWriteCr4 (
00410   UINTN  Cr4
00411   )
00412 {
00413   __asm__ __volatile__ (
00414     "mov  %0, %%cr4"
00415     :
00416     : "r" (Cr4)
00417     );
00418   return Cr4;
00419 }
00420 
00421 
00432 UINTN
00433 EFIAPI
00434 AsmReadDr0 (
00435   VOID
00436   )
00437 {
00438   UINTN Data;
00439   
00440   __asm__ __volatile__ (
00441     "mov  %%dr0, %0"
00442     : "=r" (Data)
00443     );
00444   
00445   return Data;
00446 }
00447 
00448 
00459 UINTN
00460 EFIAPI
00461 AsmReadDr1 (
00462   VOID
00463   )
00464 {
00465   UINTN Data;
00466   
00467   __asm__ __volatile__ (
00468     "mov  %%dr1, %0"
00469     : "=r" (Data)
00470     );
00471   
00472   return Data;
00473 }
00474 
00475 
00486 UINTN
00487 EFIAPI
00488 AsmReadDr2 (
00489   VOID
00490   )
00491 {
00492   UINTN Data;
00493   
00494   __asm__ __volatile__ (
00495     "mov  %%dr2, %0"
00496     : "=r" (Data)
00497     );
00498   
00499   return Data;
00500 }
00501 
00502 
00513 UINTN
00514 EFIAPI
00515 AsmReadDr3 (
00516   VOID
00517   )
00518 {
00519   UINTN Data;
00520   
00521   __asm__ __volatile__ (
00522     "mov  %%dr3, %0"
00523     : "=r" (Data)
00524     );
00525   
00526   return Data;
00527 }
00528 
00529 
00540 UINTN
00541 EFIAPI
00542 AsmReadDr4 (
00543   VOID
00544   )
00545 {
00546   UINTN Data;
00547   
00548   __asm__ __volatile__ (
00549     "mov  %%dr4, %0"
00550     : "=r" (Data)
00551     );
00552   
00553   return Data;
00554 }
00555 
00556 
00567 UINTN
00568 EFIAPI
00569 AsmReadDr5 (
00570   VOID
00571   )
00572 {
00573   UINTN Data;
00574   
00575   __asm__ __volatile__ (
00576     "mov  %%dr5, %0"
00577     : "=r" (Data)
00578     );
00579   
00580   return Data;
00581 }
00582 
00583 
00594 UINTN
00595 EFIAPI
00596 AsmReadDr6 (
00597   VOID
00598   )
00599 {
00600   UINTN Data;
00601   
00602   __asm__ __volatile__ (
00603     "mov  %%dr6, %0"
00604     : "=r" (Data)
00605     );
00606   
00607   return Data;
00608 }
00609 
00610 
00621 UINTN
00622 EFIAPI
00623 AsmReadDr7 (
00624   VOID
00625   )
00626 {
00627   UINTN Data;
00628   
00629   __asm__ __volatile__ (
00630     "mov  %%dr7, %0"
00631     : "=r" (Data)
00632     );
00633   
00634   return Data;
00635 }
00636 
00637 
00649 UINTN
00650 EFIAPI
00651 AsmWriteDr0 (
00652   UINTN  Dr0
00653   )
00654 {
00655   __asm__ __volatile__ (
00656     "mov  %0, %%dr0"
00657     :
00658     : "r" (Dr0)
00659     );
00660   return Dr0;
00661 }
00662 
00663 
00675 UINTN
00676 EFIAPI
00677 AsmWriteDr1 (
00678   UINTN  Dr1
00679   )
00680 {
00681   __asm__ __volatile__ (
00682     "mov  %0, %%dr1"
00683     :
00684     : "r" (Dr1)
00685     );
00686   return Dr1;
00687 }
00688 
00689 
00701 UINTN
00702 EFIAPI
00703 AsmWriteDr2 (
00704   UINTN  Dr2
00705   )
00706 {
00707   __asm__ __volatile__ (
00708     "mov  %0, %%dr2"
00709     :
00710     : "r" (Dr2)
00711     );
00712   return Dr2;
00713 }
00714 
00715 
00727 UINTN
00728 EFIAPI
00729 AsmWriteDr3 (
00730   UINTN  Dr3
00731   )
00732 {
00733   __asm__ __volatile__ (
00734     "mov  %0, %%dr3"
00735     :
00736     : "r" (Dr3)
00737     );
00738   return Dr3;
00739 }
00740 
00741 
00753 UINTN
00754 EFIAPI
00755 AsmWriteDr4 (
00756   UINTN  Dr4
00757   )
00758 {
00759   __asm__ __volatile__ (
00760     "mov  %0, %%dr4"
00761     :
00762     : "r" (Dr4)
00763     );
00764   return Dr4;
00765 }
00766 
00767 
00779 UINTN
00780 EFIAPI
00781 AsmWriteDr5 (
00782   UINTN  Dr5
00783   )
00784 {
00785   __asm__ __volatile__ (
00786     "mov  %0, %%dr5"
00787     :
00788     : "r" (Dr5)
00789     );
00790   return Dr5;
00791 }
00792 
00793 
00805 UINTN
00806 EFIAPI
00807 AsmWriteDr6 (
00808   UINTN  Dr6
00809   )
00810 {
00811   __asm__ __volatile__ (
00812     "mov  %0, %%dr6"
00813     :
00814     : "r" (Dr6)
00815     );
00816   return Dr6;
00817 }
00818 
00819 
00831 UINTN
00832 EFIAPI
00833 AsmWriteDr7 (
00834   UINTN  Dr7
00835   )
00836 {
00837   __asm__ __volatile__ (
00838     "mov  %0, %%dr7"
00839     :
00840     : "r" (Dr7)
00841     );
00842   return Dr7;
00843 }
00844 
00845 
00855 UINT16
00856 EFIAPI
00857 AsmReadCs (
00858   VOID
00859   )
00860 {
00861   UINT16  Data;
00862   
00863   __asm__ __volatile__ (
00864     "mov   %%cs, %0"
00865     :"=a" (Data)
00866     );
00867     
00868   return Data;
00869 }
00870 
00871 
00881 UINT16
00882 EFIAPI
00883 AsmReadDs (
00884   VOID
00885   )
00886 {
00887   UINT16  Data;
00888   
00889   __asm__ __volatile__ (
00890     "mov  %%ds, %0"
00891     :"=a" (Data)
00892     );
00893     
00894   return Data;
00895 }
00896 
00897 
00907 UINT16
00908 EFIAPI
00909 AsmReadEs (
00910   VOID
00911   )
00912 {
00913   UINT16  Data;
00914   
00915   __asm__ __volatile__ (
00916     "mov  %%es, %0"
00917     :"=a" (Data)
00918     );
00919     
00920   return Data;
00921 }
00922 
00923 
00933 UINT16
00934 EFIAPI
00935 AsmReadFs (
00936   VOID
00937   )
00938 {
00939   UINT16  Data;
00940   
00941   __asm__ __volatile__ (
00942     "mov  %%fs, %0"
00943     :"=a" (Data)
00944     );
00945     
00946   return Data;
00947 }
00948 
00949 
00959 UINT16
00960 EFIAPI
00961 AsmReadGs (
00962   VOID
00963   )
00964 {
00965   UINT16  Data;
00966   
00967   __asm__ __volatile__ (
00968     "mov  %%gs, %0"
00969     :"=a" (Data)
00970     );
00971     
00972   return Data;
00973 }
00974 
00975 
00985 UINT16
00986 EFIAPI
00987 AsmReadSs (
00988   VOID
00989   )
00990 {
00991   UINT16  Data;
00992   
00993   __asm__ __volatile__ (
00994     "mov  %%ds, %0"
00995     :"=a" (Data)
00996     );
00997     
00998   return Data;
00999 }
01000 
01001 
01011 UINT16
01012 EFIAPI
01013 AsmReadTr (
01014   VOID
01015   )
01016 {
01017   UINT16  Data;
01018   
01019   __asm__ __volatile__ (
01020     "str  %0"
01021     : "=r" (Data)
01022     );
01023     
01024   return Data;
01025 }
01026 
01027 
01037 VOID
01038 EFIAPI
01039 InternalX86ReadGdtr (
01040   OUT     IA32_DESCRIPTOR           *Gdtr
01041   )
01042 {
01043   __asm__ __volatile__ (
01044     "sgdt %0"
01045     : "=m" (*Gdtr)
01046     );
01047 }
01048 
01049 
01059 VOID
01060 EFIAPI
01061 InternalX86WriteGdtr (
01062   IN      CONST IA32_DESCRIPTOR     *Gdtr
01063   )
01064 {
01065   __asm__ __volatile__ (
01066     "lgdt %0"
01067     :
01068     : "m" (*Gdtr)
01069     );
01070     
01071 }
01072 
01073 
01083 VOID
01084 EFIAPI
01085 InternalX86ReadIdtr (
01086   OUT     IA32_DESCRIPTOR           *Idtr
01087   )
01088 {
01089   __asm__ __volatile__ (
01090     "sidt  %0"
01091     : "=m" (*Idtr)
01092     );
01093 }
01094 
01095 
01105 VOID
01106 EFIAPI
01107 InternalX86WriteIdtr (
01108   IN      CONST IA32_DESCRIPTOR     *Idtr
01109   )
01110 {
01111   __asm__ __volatile__ (
01112     "lidt %0"
01113     :
01114     : "m" (*Idtr)
01115     );
01116 }
01117 
01118 
01128 UINT16
01129 EFIAPI
01130 AsmReadLdtr (
01131   VOID
01132   )
01133 {
01134   UINT16  Data;
01135   
01136   __asm__ __volatile__ (
01137     "sldt  %0"
01138     : "=g" (Data)   // %0
01139     );
01140     
01141   return Data;
01142 }
01143 
01144 
01154 VOID
01155 EFIAPI
01156 AsmWriteLdtr (
01157   IN      UINT16                    Ldtr
01158   )
01159 {
01160   __asm__ __volatile__ (
01161     "lldtw  %0"
01162     :
01163     : "g" (Ldtr)   // %0
01164     );
01165 }
01166 
01167 
01178 VOID
01179 EFIAPI
01180 InternalX86FxSave (
01181   OUT     IA32_FX_BUFFER            *Buffer
01182   )
01183 {
01184   __asm__ __volatile__ (
01185     "fxsave %0"
01186     :
01187     : "m" (*Buffer)  // %0
01188     );    
01189 }
01190 
01191 
01202 VOID
01203 EFIAPI
01204 InternalX86FxRestore (
01205   IN      CONST IA32_FX_BUFFER      *Buffer
01206   )
01207 {
01208   __asm__ __volatile__ (
01209     "fxrstor %0"
01210     :
01211     : "m" (*Buffer)  // %0
01212     );
01213 }
01214 
01215 
01225 UINT64
01226 EFIAPI
01227 AsmReadMm0 (
01228   VOID
01229   )
01230 {
01231   UINT64  Data;
01232 
01233   __asm__ __volatile__ (
01234     "movd   %%mm0,  %0    \n\t"
01235     : "=r"  (Data)       // %0
01236     );
01237     
01238   return Data;
01239 }
01240 
01241 
01251 UINT64
01252 EFIAPI
01253 AsmReadMm1 (
01254   VOID
01255   )
01256 {
01257   UINT64  Data;
01258 
01259   __asm__ __volatile__ (
01260     "movd   %%mm1,  %0    \n\t"
01261     : "=r"  (Data)       // %0
01262     );
01263     
01264   return Data;
01265 }
01266 
01267 
01277 UINT64
01278 EFIAPI
01279 AsmReadMm2 (
01280   VOID
01281   )
01282 {
01283   UINT64  Data;
01284 
01285   __asm__ __volatile__ (
01286     "movd  %%mm2,  %0    \n\t"
01287     : "=r"  (Data)       // %0
01288     );
01289     
01290   return Data;
01291 }
01292 
01293 
01303 UINT64
01304 EFIAPI
01305 AsmReadMm3 (
01306   VOID
01307   )
01308 {
01309   UINT64  Data;
01310 
01311   __asm__ __volatile__ (
01312     "movd  %%mm3,  %0    \n\t"
01313     : "=r"  (Data)       // %0
01314     );
01315     
01316   return Data;
01317 }
01318 
01319 
01329 UINT64
01330 EFIAPI
01331 AsmReadMm4 (
01332   VOID
01333   )
01334 {
01335   UINT64  Data;
01336 
01337   __asm__ __volatile__ (
01338     "movd  %%mm4,  %0    \n\t"
01339     : "=r"  (Data)       // %0
01340     );
01341     
01342   return Data;
01343 }
01344 
01345 
01355 UINT64
01356 EFIAPI
01357 AsmReadMm5 (
01358   VOID
01359   )
01360 {
01361   UINT64  Data;
01362 
01363   __asm__ __volatile__ (
01364     "movd  %%mm5,  %0    \n\t"
01365     : "=r"  (Data)       // %0
01366     );
01367     
01368   return Data;
01369 }
01370 
01371 
01381 UINT64
01382 EFIAPI
01383 AsmReadMm6 (
01384   VOID
01385   )
01386 {
01387   UINT64  Data;
01388 
01389   __asm__ __volatile__ (
01390     "movd  %%mm6,  %0    \n\t"
01391     : "=r"  (Data)       // %0
01392     );
01393     
01394   return Data;
01395 }
01396 
01397 
01407 UINT64
01408 EFIAPI
01409 AsmReadMm7 (
01410   VOID
01411   )
01412 {
01413   UINT64  Data;
01414 
01415   __asm__ __volatile__ (
01416     "movd  %%mm7,  %0    \n\t"
01417     : "=r"  (Data)       // %0
01418     );
01419     
01420   return Data;
01421 }
01422 
01423 
01433 VOID
01434 EFIAPI
01435 AsmWriteMm0 (
01436   IN      UINT64                    Value
01437   )
01438 {
01439   __asm__ __volatile__ (
01440     "movd  %0, %%mm0"  // %0
01441     :  
01442     : "m" (Value)
01443     );
01444 }
01445 
01446 
01456 VOID
01457 EFIAPI
01458 AsmWriteMm1 (
01459   IN      UINT64                    Value
01460   )
01461 {
01462   __asm__ __volatile__ (
01463     "movd  %0, %%mm1"  // %0
01464     :  
01465     : "m" (Value)
01466     );
01467 }
01468 
01469 
01479 VOID
01480 EFIAPI
01481 AsmWriteMm2 (
01482   IN      UINT64                    Value
01483   )
01484 {
01485   __asm__ __volatile__ (
01486     "movd  %0, %%mm2"  // %0
01487     :  
01488     : "m" (Value)
01489     );
01490 }
01491 
01492 
01502 VOID
01503 EFIAPI
01504 AsmWriteMm3 (
01505   IN      UINT64                    Value
01506   )
01507 {
01508   __asm__ __volatile__ (
01509     "movd  %0, %%mm3"  // %0
01510     :  
01511     : "m" (Value)
01512     );
01513 }
01514 
01515 
01525 VOID
01526 EFIAPI
01527 AsmWriteMm4 (
01528   IN      UINT64                    Value
01529   )
01530 {
01531   __asm__ __volatile__ (
01532     "movd  %0, %%mm4"  // %0
01533     :  
01534     : "m" (Value)
01535     );
01536 }
01537 
01538 
01548 VOID
01549 EFIAPI
01550 AsmWriteMm5 (
01551   IN      UINT64                    Value
01552   )
01553 {
01554   __asm__ __volatile__ (
01555     "movd  %0, %%mm5"  // %0
01556     :  
01557     : "m" (Value)
01558     );
01559 }
01560 
01561 
01571 VOID
01572 EFIAPI
01573 AsmWriteMm6 (
01574   IN      UINT64                    Value
01575   )
01576 {
01577   __asm__ __volatile__ (
01578     "movd  %0, %%mm6"  // %0
01579     :  
01580     : "m" (Value)
01581     );
01582 }
01583 
01584 
01594 VOID
01595 EFIAPI
01596 AsmWriteMm7 (
01597   IN      UINT64                    Value
01598   )
01599 {
01600   __asm__ __volatile__ (
01601     "movd  %0, %%mm7"  // %0
01602     :  
01603     : "m" (Value)
01604     );
01605 }
01606 
01607 
01617 UINT64
01618 EFIAPI
01619 AsmReadTsc (
01620   VOID
01621   )
01622 {
01623   UINT32  LowData;
01624   UINT32  HiData;
01625   
01626   __asm__ __volatile__ (
01627     "rdtsc"
01628     : "=a" (LowData),
01629       "=d" (HiData)
01630     );
01631   
01632   return (((UINT64)HiData) << 32) | LowData;  
01633 }
01634 
01635 
01647 UINT64
01648 EFIAPI
01649 AsmReadPmc (
01650   IN      UINT32                    Index
01651   )
01652 {
01653   UINT32  LowData;
01654   UINT32  HiData;
01655   
01656   __asm__ __volatile__ (
01657     "rdpmc"
01658     : "=a" (LowData),
01659       "=d" (HiData)
01660     : "c"  (Index)
01661     );
01662   
01663   return (((UINT64)HiData) << 32) | LowData;  
01664 }
01665 
01666 
01683 UINTN
01684 EFIAPI
01685 AsmMonitor (
01686   IN      UINTN                     Eax,
01687   IN      UINTN                     Ecx,
01688   IN      UINTN                     Edx
01689   )
01690 {
01691   __asm__ __volatile__ (
01692     "monitor"
01693     :
01694     : "a" (Eax),
01695       "c" (Ecx),
01696       "d" (Edx)
01697     );
01698     
01699   return Eax;
01700 }
01701 
01702 
01717 UINTN
01718 EFIAPI
01719 AsmMwait (
01720   IN      UINTN                     Eax,
01721   IN      UINTN                     Ecx
01722   )
01723 {
01724   __asm__ __volatile__ (
01725     "mwait"
01726     : 
01727     : "a"  (Eax),
01728       "c"  (Ecx)
01729     );
01730     
01731   return Eax;    
01732 }
01733 
01734 
01742 VOID
01743 EFIAPI
01744 AsmWbinvd (
01745   VOID
01746   )
01747 {
01748   __asm__ __volatile__ ("wbinvd":::"memory");
01749 }
01750 
01751 
01759 VOID
01760 EFIAPI
01761 AsmInvd (
01762   VOID
01763   )
01764 {
01765   __asm__ __volatile__ ("invd":::"memory");
01766     
01767 }
01768 
01769 
01785 VOID *
01786 EFIAPI
01787 AsmFlushCacheLine (
01788   IN      VOID                      *LinearAddress
01789   )
01790 {
01791   __asm__ __volatile__ (
01792     "clflush (%0)"
01793     :
01794     : "r" (LinearAddress) 
01795     : "memory"
01796     );
01797     
01798     return LinearAddress;
01799 }
01800 
01801 
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Defines