timesupA.mac revision cd7a8c034836a94a0c4f0adf9764f9ed661cdd01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; IPRT - Time using SUPLib, the Assembly Code Template.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Copyright (C) 2006-2007 Oracle Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; The contents of this file may alternatively be used under the terms
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; of the Common Development and Distribution License Version 1.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; VirtualBox OSE distribution, in which case the provisions of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; CDDL are applicable instead of those of the GPL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; You may elect to license modified versions of this file under the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; terms and conditions of either the GPL or the CDDL or both.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%ifdef RT_ARCH_X86
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; The x86 assembly implementation of the assembly routines.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; @returns Nanosecond timestamp.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; @param pData Pointer to the nanosecond timestamp data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBEGINPROC rtTimeNanoTSInternalAsm
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Variable definitions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define pData [ebp + 08h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u64RetNanoTS_Hi [ebp - 04h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u64RetNanoTS [ebp - 08h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u32UpdateIntervalNS [ebp - 0ch]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u32UpdateIntervalTSC [ebp - 10h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u64TSC_Hi [ebp - 14h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u64TSC [ebp - 18h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u64CurNanoTS_Hi [ebp - 1ch]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u64CurNanoTS [ebp - 20h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u64PrevNanoTS_Hi [ebp - 24h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u64PrevNanoTS [ebp - 28h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u32TransactionId [ebp - 2ch]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define u32ApicIdPlus [ebp - 30h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define TmpVar [ebp - 34h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define SavedEBX [ebp - 38h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define SavedEDI [ebp - 3ch]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define SavedESI [ebp - 40h]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ebp, esp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sub esp, 40h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov SavedEBX, ebx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov SavedEDI, edi
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov SavedESI, esi
cmp dword [esi + SUPGLOBALINFOPAGE.u32Magic], SUPGLOBALINFOPAGE_MAGIC
movzx ebx, word [esi + ebx * 2 + SUPGLOBALINFOPAGE.aiCpuFromApicId]
lea edi, [esi + eax + SUPGLOBALINFOPAGE.aCPUs] ; edi == &pGip->aCPU[u8ApicId];
lea edi, [esi + SUPGLOBALINFOPAGE.aCPUs] ; edi == &pGip->aCPU[0];
mov ebx, [edi + SUPGIPCPU.u32TransactionId]
mov eax, [esi + SUPGLOBALINFOPAGE.u32UpdateIntervalNS]
mov edx, [edi + SUPGIPCPU.u32UpdateIntervalTSC]
mov ecx, [edi + SUPGIPCPU.u64NanoTS]
mov esi, [edi + SUPGIPCPU.u64NanoTS + 4]
mov ebx, [edi + SUPGIPCPU.u64TSC]
mov ecx, [edi + SUPGIPCPU.u64TSC + 4]
; This serializes load/save. And with the dependency on the
mov esi, [esi + RTTIMENANOTSDATA.pu64Prev]
mov esi, [edi + SUPGIPCPU.u32TransactionId]
mov esi, [esi + RTTIMENANOTSDATA.pu64Prev]
inc dword [esi + RTTIMENANOTSDATA.cExpired]
inc dword [esi + RTTIMENANOTSDATA.c1nsSteps]
call dword [eax + RTTIMENANOTSDATA.pfnBad]
lock inc dword [edi + RTTIMENANOTSDATA.cUpdateRaces]
call [eax + RTTIMENANOTSDATA.pfnRediscover]
mov pGip, [rel NAME(g_pSUPGlobalInfoPage) wrt ..gotpcrel]
cmp dword [pGip + SUPGLOBALINFOPAGE.u32Magic], SUPGLOBALINFOPAGE_MAGIC
movzx eax, word [pGip + rbx * 2 + SUPGLOBALINFOPAGE.aiCpuFromApicId]
lea pGipCPU, [pGip + rax + SUPGLOBALINFOPAGE.aCPUs]
lea pGipCPU, [pGip + SUPGLOBALINFOPAGE.aCPUs]
mov u32TransactionId, [pGipCPU + SUPGIPCPU.u32TransactionId]
mov u32UpdateIntervalNS, [pGip + SUPGLOBALINFOPAGE.u32UpdateIntervalNS] ; before u64TSC
mov u32UpdateIntervalTSC, [pGipCPU + SUPGIPCPU.u32UpdateIntervalTSC]
mov u64PrevNanoTS, [pData + RTTIMENANOTSDATA.pu64Prev]
mov u64CurNanoTS, [pGipCPU + SUPGIPCPU.u64NanoTS]
mov u64TSC, [pGipCPU + SUPGIPCPU.u64TSC]
cmp u32TransactionId, [pGipCPU + SUPGIPCPU.u32TransactionId]
mov rbx, [pData + RTTIMENANOTSDATA.pu64Prev]
inc dword [pData + RTTIMENANOTSDATA.cExpired]
inc dword [pData + RTTIMENANOTSDATA.c1nsSteps]
call qword [pData + RTTIMENANOTSDATA.pfnBad]
lock inc dword [pData + RTTIMENANOTSDATA.cUpdateRaces]
call [pData + RTTIMENANOTSDATA.pfnRediscover]