From 2530602c53df8db9a247461b804cd83efa958aaf Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 11 Apr 2015 14:03:19 +0000 Subject: [PATCH] [FREELDR] Fix ARM build svn path=/trunk/; revision=67164 --- reactos/CMakeLists.txt | 5 +- reactos/boot/freeldr/freeldr/CMakeLists.txt | 33 +++++---- reactos/boot/freeldr/freeldr/arch/arm/boot.s | 11 +-- .../boot/freeldr/freeldr/arch/arm/macharm.c | 20 +++--- .../boot/freeldr/freeldr/arch/arm/winldr.c | 35 ++++++++-- .../freeldr/include/arch/arm/hardware.h | 15 +++- reactos/boot/freeldr/freeldr/mm/heap.c | 11 ++- reactos/boot/freeldr/freeldr/ui/ui.c | 5 ++ .../ntoskrnl/include/internal/arm/intrin_i.h | 70 ++++++++++++++++++- 9 files changed, 167 insertions(+), 38 deletions(-) diff --git a/reactos/CMakeLists.txt b/reactos/CMakeLists.txt index 3b2cfc46ca0..01777800242 100644 --- a/reactos/CMakeLists.txt +++ b/reactos/CMakeLists.txt @@ -158,6 +158,9 @@ else() elseif(ARCH STREQUAL "arm") # _M_ARM is already defined by toolchain add_definitions(-D_ARM_ -D__arm__) + if(SARCH STREQUAL "omap-zoom2") + add_definitions(-D_ZOOM2_) + endif() endif() # Other @@ -166,7 +169,7 @@ else() elseif(ARCH STREQUAL "amd64") add_definitions(-DUSE_COMPILER_EXCEPTIONS -DNO_UNDERSCORE_PREFIX) elseif(ARCH STREQUAL "arm") - add_definitions(-DUSE_COMPILER_EXCEPTIONS) + add_definitions(-DUSE_COMPILER_EXCEPTIONS -DNO_UNDERSCORE_PREFIX) endif() # Activate support for assembly source files diff --git a/reactos/boot/freeldr/freeldr/CMakeLists.txt b/reactos/boot/freeldr/freeldr/CMakeLists.txt index 23c114c1daa..f072a1a25dd 100644 --- a/reactos/boot/freeldr/freeldr/CMakeLists.txt +++ b/reactos/boot/freeldr/freeldr/CMakeLists.txt @@ -27,10 +27,6 @@ include_directories(${REACTOS_SOURCE_DIR}/include/reactos/elf) add_definitions(-D_NTHAL_ -D_BLDR_ -D_NTSYSTEM_) -if((ARCH STREQUAL "arm") AND (SARCH STREQUAL "omap-zoom2")) - add_definitions(-D_ZOOM2_) -endif() - list(APPEND FREELDR_COMMON_SOURCE include/freeldr.h arcname.c @@ -168,13 +164,10 @@ if(ARCH STREQUAL "i386" AND NOT MSVC) target_link_libraries(freeldr_common mini_hal) endif() -if(ARCH STREQUAL "i386" OR ARCH STREQUAL "amd64") - list(APPEND FREELDR_BASE_SOURCE windows/setupldr.c) -endif() - list(APPEND FREELDR_BASE_SOURCE bootmgr.c # This file is compiled with custom definitions freeldr.c + windows/setupldr.c lib/inffile/inffile.c lib/rtl/libsupp.c) @@ -191,8 +184,13 @@ if(NOT MSVC AND SEPARATE_DBG) endif() if(MSVC) - add_target_link_flags(freeldr_pe "/ignore:4078 /ignore:4254 /DRIVER /FIXED /ALIGN:0x400 /SECTION:.text,ERW /SECTION:.data,RW /MERGE:.text16=.text /MERGE:.data=.text /MERGE:.rdata=.text /MERGE:.bss=.text ") - add_target_link_flags(freeldr_pe_dbg "/ignore:4078 /ignore:4254 /DRIVER /FIXED /ALIGN:0x400 /SECTION:.text,ERW /SECTION:.data,RW /MERGE:.text16=.text /MERGE:.data=.text /MERGE:.rdata=.text /MERGE:.bss=.text") + if(ARCH STREQUAL "arm") + add_target_link_flags(freeldr_pe "/ignore:4078 /ignore:4254 /DRIVER") + add_target_link_flags(freeldr_pe_dbg "/ignore:4078 /ignore:4254 /DRIVER") + else() + add_target_link_flags(freeldr_pe "/ignore:4078 /ignore:4254 /DRIVER /FIXED /ALIGN:0x400 /SECTION:.text,ERW /SECTION:.data,RW /MERGE:.text16=.text /MERGE:.data=.text /MERGE:.rdata=.text /MERGE:.bss=.text ") + add_target_link_flags(freeldr_pe_dbg "/ignore:4078 /ignore:4254 /DRIVER /FIXED /ALIGN:0x400 /SECTION:.text,ERW /SECTION:.data,RW /MERGE:.text16=.text /MERGE:.data=.text /MERGE:.rdata=.text /MERGE:.bss=.text") + endif() else() add_target_link_flags(freeldr_pe "-Wl,--strip-all,--exclude-all-symbols,--file-alignment,0x1000,-T,${CMAKE_CURRENT_SOURCE_DIR}/freeldr_i386.lds") add_target_link_flags(freeldr_pe_dbg "-Wl,--exclude-all-symbols,--file-alignment,0x1000,-T,${CMAKE_CURRENT_SOURCE_DIR}/freeldr_i386.lds") @@ -229,12 +227,17 @@ add_dependencies(freeldr_pe_dbg asm) # Retrieve the full path to the generated file of the 'freeldr_pe' target get_target_property(_freeldr_pe_output_file freeldr_pe LOCATION) -concatenate_files( - ${CMAKE_CURRENT_BINARY_DIR}/freeldr.sys - ${CMAKE_CURRENT_BINARY_DIR}/frldr16.bin - ${_freeldr_pe_output_file}) +if(NOT ARCH STREQUAL "arm") -add_custom_target(freeldr ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/freeldr.sys) + concatenate_files( + ${CMAKE_CURRENT_BINARY_DIR}/freeldr.sys + ${CMAKE_CURRENT_BINARY_DIR}/frldr16.bin + ${_freeldr_pe_output_file}) + + add_custom_target(freeldr ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/freeldr.sys) +else() + add_custom_target(freeldr ALL DEPENDS ${_freeldr_pe_output_file}) +endif() # rename freeldr on livecd to setupldr.sys because isoboot.bin looks for setupldr.sys add_cd_file(TARGET freeldr FILE ${CMAKE_CURRENT_BINARY_DIR}/freeldr.sys DESTINATION loader NO_CAB FOR bootcd regtest) diff --git a/reactos/boot/freeldr/freeldr/arch/arm/boot.s b/reactos/boot/freeldr/freeldr/arch/arm/boot.s index 8a116164f8e..688620487d4 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/boot.s +++ b/reactos/boot/freeldr/freeldr/arch/arm/boot.s @@ -6,7 +6,7 @@ * PROGRAMMERS: ReactOS Portable Systems Group */ -#include "ksarm.h" +#include //.title "ARM FreeLDR Entry Point" //.include "ntoskrnl/include/internal/arm/kxarm.h" @@ -16,9 +16,12 @@ NESTED_ENTRY _start PROLOG_END _start - b ArmInit + //b ArmInit ENTRY_END _start -L_ArmInit: - .long ArmInit +//L_ArmInit: +// .long ArmInit + + END +/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c index 93a8258be8a..6ec47129d1d 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c @@ -107,13 +107,6 @@ ArmDiskGetBootPath(OUT PCHAR BootPath, return TRUE; } -BOOLEAN -ArmInitializeBootDevices(VOID) -{ - /* Emulate old behavior */ - return (ArmHwDetect() != NULL); -} - PCONFIGURATION_COMPONENT_DATA ArmHwDetect(VOID) { @@ -159,11 +152,19 @@ ArmHwDetect(VOID) return RootNode; } +BOOLEAN +ArmInitializeBootDevices(VOID) +{ + /* Emulate old behavior */ + return (ArmHwDetect() != NULL); +} + FREELDR_MEMORY_DESCRIPTOR ArmMemoryMap[32]; PFREELDR_MEMORY_DESCRIPTOR ArmMemGetMemoryMap(OUT ULONG *MemoryMapSize) { + ULONG i; ASSERT(ArmBoardBlock->MemoryMapEntryCount <= 32); /* Return whatever the board returned to us (CS0 Base + Size and FLASH0) */ @@ -177,7 +178,10 @@ ArmMemGetMemoryMap(OUT ULONG *MemoryMapSize) ArmMemoryMap[i].MemoryType = MemoryFirmwarePermanent; } - return ArmBoardBlock->MemoryMapEntryCount; + *MemoryMapSize = ArmBoardBlock->MemoryMapEntryCount; + + // FIXME + return NULL; } VOID diff --git a/reactos/boot/freeldr/freeldr/arch/arm/winldr.c b/reactos/boot/freeldr/freeldr/arch/arm/winldr.c index b18a69b948a..0afb7ebf9f2 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/winldr.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/winldr.c @@ -81,7 +81,8 @@ PKPDR_PAGE PdrPage; BOOLEAN MempSetupPaging(IN PFN_NUMBER StartPage, - IN PFN_COUNT NumberOfPages) + IN PFN_NUMBER NumberOfPages, + IN BOOLEAN KernelMapping) { return TRUE; } @@ -245,9 +246,7 @@ MempAllocatePageTables(VOID) } VOID -WinLdrSetProcessorContext(PVOID GdtIdt, - IN ULONG Pcr, - IN ULONG Tss) +WinLdrSetProcessorContext(VOID) { ARM_CONTROL_REGISTER ControlRegister; ARM_TTB_REGISTER TtbRegister; @@ -272,3 +271,31 @@ WinLdrSetProcessorContext(PVOID GdtIdt, ControlRegister.ExtendedPageTables = TRUE; KeArmControlRegisterSet(ControlRegister); } + +VOID +WinLdrSetupMachineDependent( + PLOADER_PARAMETER_BLOCK LoaderBlock) +{ +} + +VOID DiskStopFloppyMotor(VOID) +{ +} + +VOID +RealEntryPoint(VOID) +{ + BootMain(""); +} + +VOID +NTAPI +FrLdrBugCheckWithMessage( + ULONG BugCode, + PCHAR File, + ULONG Line, + PSTR Format, + ...) +{ + +} diff --git a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h index b08cc2db017..1ac2774bcd7 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h +++ b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h @@ -9,12 +9,16 @@ #pragma once #ifndef __REGISTRY_H -#include "../../reactos/registry.h" +//#include "../../reactos/registry.h" #endif #include "../../../../../armllb/inc/osloader.h" #include "../../../../../armllb/inc/machtype.h" +#define FREELDR_BASE 0x0001F000 +#define FREELDR_PE_BASE 0x0001F000 +#define MAX_FREELDR_PE_SIZE 0xFFFFFF + extern PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock; extern ULONG FirstLevelDcacheSize; extern ULONG FirstLevelDcacheFillSize; @@ -26,4 +30,11 @@ extern ULONG SecondLevelIcacheSize; extern ULONG SecondLevelIcacheFillSize; extern ULONG gDiskReadBuffer, gFileSysBuffer; -#define DiskReadBuffer gDiskReadBuffer +#define DiskReadBuffer ((PVOID)gDiskReadBuffer) + +#define DriveMapGetBiosDriveNumber(DeviceName) 0 + +FORCEINLINE VOID Reboot(VOID) +{ + DbgBreakPoint(); +} diff --git a/reactos/boot/freeldr/freeldr/mm/heap.c b/reactos/boot/freeldr/freeldr/mm/heap.c index e3ff8549643..8fd09d12705 100644 --- a/reactos/boot/freeldr/freeldr/mm/heap.c +++ b/reactos/boot/freeldr/freeldr/mm/heap.c @@ -322,7 +322,9 @@ FrLdrHeapAllocateEx( PHEAP Heap = HeapHandle; PHEAP_BLOCK Block, NextBlock; USHORT BlockSize, Remaining; +#if DBG && !defined(_M_ARM) ULONGLONG Time = __rdtsc(); +#endif #ifdef FREELDR_HEAP_VERIFIER /* Verify the heap */ @@ -402,8 +404,9 @@ FrLdrHeapAllocateEx( Heap->MaxAllocBytes = max(Heap->MaxAllocBytes, Heap->CurrentAllocBytes); Heap->LargestAllocation = max(Heap->LargestAllocation, Block->Size * sizeof(HEAP_BLOCK)); +#if DBG && !defined(_M_ARM) Heap->AllocationTime += (__rdtsc() - Time); - +#endif TRACE("HeapAllocate(%p, %ld, %.4s) -> return %p\n", HeapHandle, ByteSize, &Tag, Block->Data); @@ -436,7 +439,9 @@ FrLdrHeapFreeEx( { PHEAP Heap = HeapHandle; PHEAP_BLOCK Block, PrevBlock, NextBlock; +#if DBG && !defined(_M_ARM) ULONGLONG Time = __rdtsc(); +#endif TRACE("HeapFree(%p, %p)\n", HeapHandle, Pointer); ASSERT(Tag != 'dnE#'); @@ -514,8 +519,9 @@ FrLdrHeapFreeEx( /* Update the next block's back link */ NextBlock->PreviousSize = Block->Size; - +#if DBG && !defined(_M_ARM) Heap->FreeTime += (__rdtsc() - Time); +#endif } @@ -602,3 +608,4 @@ RtlFreeHeap( FrLdrHeapFreeEx(FrLdrDefaultHeap, HeapBase, ' ltR'); return TRUE; } + diff --git a/reactos/boot/freeldr/freeldr/ui/ui.c b/reactos/boot/freeldr/freeldr/ui/ui.c index 140c1134984..9eda981a047 100644 --- a/reactos/boot/freeldr/freeldr/ui/ui.c +++ b/reactos/boot/freeldr/freeldr/ui/ui.c @@ -476,4 +476,9 @@ BOOLEAN UiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length) return UiVtbl.EditBox(MessageText, EditTextBuffer, Length); } +#else +BOOLEAN UiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length) +{ + return FALSE; +} #endif diff --git a/reactos/ntoskrnl/include/internal/arm/intrin_i.h b/reactos/ntoskrnl/include/internal/arm/intrin_i.h index fdd4b88660d..3cad9b4d6a5 100644 --- a/reactos/ntoskrnl/include/internal/arm/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/arm/intrin_i.h @@ -7,7 +7,10 @@ KeArmHaltProcessor(VOID) // // Enter Wait-For-Interrupt Mode // +#ifdef _MSC_VER +#else __asm__ __volatile__ ("mcr p15, 0, %0, c7, c0, 4" : : "r"(0) : "cc"); +#endif } FORCEINLINE @@ -15,7 +18,11 @@ ARM_CONTROL_REGISTER KeArmControlRegisterGet(VOID) { ARM_CONTROL_REGISTER Value; +#ifdef _MSC_VER + Value.AsUlong = 0; +#else __asm__ __volatile__ ("mrc p15, 0, %0, c1, c0, 0" : "=r"(Value.AsUlong) : : "cc"); +#endif return Value; } @@ -24,7 +31,11 @@ ARM_ID_CODE_REGISTER KeArmIdCodeRegisterGet(VOID) { ARM_ID_CODE_REGISTER Value; +#ifdef _MSC_VER + Value.AsUlong = 0; +#else __asm__ __volatile__ ("mrc p15, 0, %0, c0, c0, 0" : "=r"(Value.AsUlong) : : "cc"); +#endif return Value; } @@ -33,7 +44,11 @@ ULONG KeArmFaultStatusRegisterGet(VOID) { ULONG Value; +#ifdef _MSC_VER + Value = 0; +#else __asm__ __volatile__ ("mrc p15, 0, %0, c5, c0, 0" : "=r"(Value) : : "cc"); +#endif return Value; } @@ -42,7 +57,11 @@ ULONG KeArmInstructionFaultStatusRegisterGet(VOID) { ULONG Value; +#ifdef _MSC_VER + Value = 0; +#else __asm__ __volatile__ ("mrc p15, 0, %0, c5, c0, 1" : "=r"(Value) : : "cc"); +#endif return Value; } @@ -51,7 +70,11 @@ ULONG KeArmFaultAddressRegisterGet(VOID) { ULONG Value; +#ifdef _MSC_VER + Value = 0; +#else __asm__ __volatile__ ("mrc p15, 0, %0, c6, c0, 0" : "=r"(Value) : : "cc"); +#endif return Value; } @@ -60,7 +83,11 @@ ARM_LOCKDOWN_REGISTER KeArmLockdownRegisterGet(VOID) { ARM_LOCKDOWN_REGISTER Value; +#ifdef _MSC_VER + Value.AsUlong = 0; +#else __asm__ __volatile__ ("mrc p15, 0, %0, c10, c0, 0" : "=r"(Value.AsUlong) : : "cc"); +#endif return Value; } @@ -69,7 +96,11 @@ ARM_TTB_REGISTER KeArmTranslationTableRegisterGet(VOID) { ARM_TTB_REGISTER Value; +#ifdef _MSC_VER + Value.AsUlong = 0; +#else __asm__ __volatile__ ("mrc p15, 0, %0, c2, c0, 0" : "=r"(Value.AsUlong) : : "cc"); +#endif return Value; } @@ -78,7 +109,11 @@ ARM_CACHE_REGISTER KeArmCacheRegisterGet(VOID) { ARM_CACHE_REGISTER Value; +#ifdef _MSC_VER + Value.AsUlong = 0; +#else __asm__ __volatile__ ("mrc p15, 0, %0, c0, c0, 1" : "=r"(Value.AsUlong) : : "cc"); +#endif return Value; } @@ -87,69 +122,100 @@ ARM_STATUS_REGISTER KeArmStatusRegisterGet(VOID) { ARM_STATUS_REGISTER Value; +#ifdef _MSC_VER + Value.AsUlong = _ReadStatusReg(0); +#else __asm__ __volatile__ ("mrs %0, cpsr" : "=r"(Value.AsUlong) : : "cc"); - return Value; +#endif + return Value; } FORCEINLINE VOID KeArmControlRegisterSet(IN ARM_CONTROL_REGISTER ControlRegister) { - __asm__ __volatile__ ("mcr p15, 0, %0, c1, c0, 0" : : "r"(ControlRegister.AsUlong) : "cc"); +#ifdef _MSC_VER +#else + __asm__ __volatile__ ("mcr p15, 0, %0, c1, c0, 0" : : "r"(ControlRegister.AsUlong) : "cc"); +#endif } FORCEINLINE VOID KeArmTranslationTableRegisterSet(IN ARM_TTB_REGISTER Ttb) { +#ifdef _MSC_VER +#else __asm__ __volatile__ ("mcr p15, 0, %0, c2, c0, 0" : : "r"(Ttb.AsUlong) : "cc"); +#endif } FORCEINLINE VOID KeArmDomainRegisterSet(IN ARM_DOMAIN_REGISTER DomainRegister) { +#ifdef _MSC_VER +#else __asm__ __volatile__ ("mcr p15, 0, %0, c3, c0, 0" : : "r"(DomainRegister.AsUlong) : "cc"); +#endif } FORCEINLINE VOID KeArmLockdownRegisterSet(IN ARM_LOCKDOWN_REGISTER LockdownRegister) { +#ifdef _MSC_VER +#else __asm__ __volatile__ ("mcr p15, 0, %0, c10, c0, 0" : : "r"(LockdownRegister.AsUlong) : "cc"); +#endif } FORCEINLINE VOID KeArmFlushTlb(VOID) { +#ifdef _MSC_VER +#else __asm__ __volatile__ ("mcr p15, 0, %0, c8, c7, 0" : : "r"(0) : "cc"); +#endif } FORCEINLINE VOID KeArmInvalidateTlbEntry(IN PVOID Address) { +#ifdef _MSC_VER +#else __asm__ __volatile__ ("mcr p15, 0, %0, c8, c7, 1" : : "r"(Address) : "cc"); +#endif } FORCEINLINE VOID KeArmInvalidateAllCaches(VOID) { +#ifdef _MSC_VER +#else __asm__ __volatile__ ("mcr p15, 0, %0, c7, c7, 0" : : "r"(0) : "cc"); +#endif } FORCEINLINE VOID KeArmFlushIcache(VOID) { +#ifdef _MSC_VER +#else __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 0" : : "r"(0) : "cc"); +#endif } FORCEINLINE VOID KeArmWaitForInterrupt(VOID) { +#ifdef _MSC_VER +#else __asm__ __volatile__ ("mcr p15, 0, %0, c7, c0, 4" : : "r"(0) : "cc"); +#endif }