diff -r 000000000000 -r a41df078684a kerneltest/e32test/nkernsa/x86/x86utils.cia --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/nkernsa/x86/x86utils.cia Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,178 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\nkernsa\x86\x86utils.cia +// +// + +#include +#include + + +extern "C" { + +void __fastcall thread_request_signal(NThread* aThread); + +extern TUint64 fcf; +extern TUint32 nfcf; +extern TUint32 nfcfs; + +__NAKED__ void __cpu_idle() + { + asm("hlt"); + asm("ret"); + } + +__NAKED__ void __cpu_yield() + { + X86_PAUSE + asm("ret"); + } + +__NAKED__ TLinAddr __stack_pointer() + { + asm("mov eax, esp"); + asm("ret"); + } + +__NAKED__ TUint32 __cpu_status_reg() + { + asm("pushfd"); + asm("pop eax"); + asm("ret"); + } + +__NAKED__ TUint32 __cpu_id() + { + asm("xor eax, eax"); + asm("str ax"); + asm("ret"); + } + +__NAKED__ TUint32 __trace_cpu_num() + { + asm("xor eax, eax"); + asm("str ax"); + asm("sub al, 0x28"); + asm("shr al, 3"); + asm("ret"); + } + +TUint64 __NAKED__ fast_counter() + { + asm("rdtsc"); + asm("ret"); + } + +TUint32 __NAKED__ norm_fast_counter() + { + asm("mov ecx, [%a0]": :"i"(&nfcfs)); + asm("rdtsc"); + asm("shrd eax, edx, cl"); + asm("ret"); + } + +__NAKED__ void nfcfspin(TUint32 aTicks) + { + asm("mov ecx, [%a0]": :"i"(&nfcfs)); + asm("push ebx"); + asm("mov ebx, [esp+8]"); + asm("rdtsc"); + asm("shrd eax, edx, cl"); + asm("add ebx, eax"); + asm("nfcfspin1:"); + asm("rdtsc"); + asm("shrd eax, edx, cl"); + asm("sub eax, ebx"); + asm("js nfcfspin1"); + asm("pop ebx"); + asm("ret"); + } + +__NAKED__ void fcfspin(TUint64 aTicks) + { + asm("mov ecx, [esp+4]"); + asm("push ebx"); + asm("mov ebx, [esp+12]"); + asm("rdtsc"); + asm("add ecx, eax"); + asm("adc ebx, edx"); + asm("fcfspin1:"); + asm("rdtsc"); + asm("sub eax, ecx"); + asm("sbb edx, ebx"); + asm("js fcfspin1"); + asm("pop ebx"); + asm("ret"); + } + +__NAKED__ TUint32 set_bit0_if_nonnull(TUint32&) + { + asm("mov ecx, [esp+4]"); + asm("mov eax, [ecx]"); + asm("xx1:"); + asm("cmp eax, 0"); + asm("jz short done1"); + asm("mov edx, eax"); + asm("or edx, 1"); + asm("lock cmpxchg [ecx], edx"); + asm("jne short xx1"); + asm("done1:"); + asm("ret"); + } + +__NAKED__ void flip_bit0(TUint32&) + { + asm("mov ecx, [esp+4]"); + asm("lock xor dword ptr [ecx], 1"); + asm("ret"); + } + +__NAKED__ TUint32 swap_out_if_bit0_clear(TUint32&) + { + asm("mov ecx, [esp+4]"); + asm("mov eax, [ecx]"); + asm("xx2:"); + asm("test eax, 1"); + asm("jnz short done2"); + asm("xor edx, edx"); + asm("lock cmpxchg [ecx], edx"); + asm("jne short xx2"); + asm("done2:"); + asm("ret"); + } + +__NAKED__ TUint32 __eflags() + { + asm("pushfd "); + asm("pop eax "); + asm("ret "); + } +} + +__NAKED__ void RequestComplete(NThread* /*aThread*/, NRequestStatus*& /*aStatus*/, TInt /*aValue*/) + { + asm("mov ecx, [esp+8]"); + asm("xor eax, eax"); + asm("lock xchg eax, [ecx]"); + asm("mov edx, [esp+12]"); + asm("cmp eax, 0"); + asm("jz done3"); + asm("mov ecx, [esp+4]"); + asm("mov [eax], edx"); + asm("call %a0": :"i"(&thread_request_signal)); + asm("done3:"); + asm("ret"); + } + +