]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/BdsLib: Linux kernel supports either FDT or ATAG
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 4 Jul 2011 10:02:49 +0000 (10:02 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 4 Jul 2011 10:02:49 +0000 (10:02 +0000)
If a FDT blob is passed to the kernel it is required we can load it.
If we fail to load the binary then we must abort the Linux booting
process.

ArmPkg/CpuDxe: Ensure the reset vector passed to the CP15 VBAR register is aligned on the right boundary

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11968 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Drivers/CpuDxe/Exception.c
ArmPkg/Library/BdsLib/BdsLinuxLoader.c

index 2f7e1b637f89bff59903596ea03c16ec22e0b653..55a71321935007376be89a792b6899a3a0ea8347 100644 (file)
@@ -206,10 +206,13 @@ InitializeExceptions (
 \r
     //Note: On ARM processor with the Security Extension, the Vector Table can be located anywhere in the memory.\r
     //      The Vector Base Address Register defines the location\r
-    ArmWriteVBar(PcdGet32(PcdCpuVectorBaseAddress));\r
+    ArmWriteVBar (PcdGet32(PcdCpuVectorBaseAddress));\r
   } else {\r
+    // The Vector table must be 32-byte aligned\r
+    ASSERT(((UINT32)ExceptionHandlersStart & ((1 << 5)-1)) == 0);\r
+\r
     // We do not copy the Exception Table at PcdGet32(PcdCpuVectorBaseAddress). We just set Vector Base Address to point into CpuDxe code.\r
-    ArmWriteVBar((UINT32)ExceptionHandlersStart);\r
+    ArmWriteVBar ((UINT32)ExceptionHandlersStart);\r
   }\r
 \r
   if (FiqEnabled) {\r
index ca5e5470432489b71465d483ec6154e9210246cf..f463fd9a344f442fcfc88cd4456c01243a6ab3a7 100644 (file)
@@ -201,7 +201,7 @@ BdsBootLinux (
   EFI_STATUS            Status;
   UINT32                LinuxImageSize;
   UINT32                KernelParamsSize;
-  VOID*                 KernelParamsAddress = NULL;
+  EFI_PHYSICAL_ADDRESS  KernelParamsAddress;
   UINT32                MachineType;
   BOOLEAN               FdtSupported = FALSE;
   LINUX_KERNEL          LinuxKernel;
@@ -214,15 +214,19 @@ BdsBootLinux (
   LinuxImage = LINUX_KERNEL_MAX_OFFSET;
   Status = BdsLoadImage (LinuxKernelDevicePath, AllocateMaxAddress, &LinuxImage, &LinuxImageSize);
   if (EFI_ERROR(Status)) {
-    DEBUG ((EFI_D_ERROR, "ERROR: Do not find Linux kernel.\n"));
+    Print (L"ERROR: Did not find Linux kernel.\n");
     return Status;
   }
   LinuxKernel = (LINUX_KERNEL)(UINTN)LinuxImage;
 
-  // Load the FDT binary from a device path
-  KernelParamsAddress = (VOID*)LINUX_ATAG_MAX_OFFSET;
-  Status = BdsLoadImage (FdtDevicePath, AllocateMaxAddress, (EFI_PHYSICAL_ADDRESS*)&KernelParamsAddress, &KernelParamsSize);
-  if (!EFI_ERROR(Status)) {
+  if (FdtDevicePath) {
+    // Load the FDT binary from a device path
+    KernelParamsAddress = LINUX_ATAG_MAX_OFFSET;
+    Status = BdsLoadImage (FdtDevicePath, AllocateMaxAddress, &KernelParamsAddress, &KernelParamsSize);
+    if (EFI_ERROR(Status)) {
+      Print (L"ERROR: Did not find Device Tree blob.\n");
+      return Status;
+    }
     FdtSupported = TRUE;
   }
 
@@ -259,7 +263,7 @@ BdsBootLinux (
   // physical memory.
   if ((UINTN)KernelParamsAddress > LINUX_ATAG_MAX_OFFSET) {
     //Note: There is no requirement on the alignment
-    KernelParamsAddress = CopyMem (ALIGN32_BELOW(LINUX_ATAG_MAX_OFFSET - KernelParamsSize), KernelParamsAddress, KernelParamsSize);
+    KernelParamsAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)CopyMem (ALIGN32_BELOW(LINUX_ATAG_MAX_OFFSET - KernelParamsSize), (VOID*)(UINTN)KernelParamsAddress, KernelParamsSize);
   }
 
   if ((UINTN)LinuxImage > LINUX_KERNEL_MAX_OFFSET) {