From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web11.691.1624647445547090502 for ; Fri, 25 Jun 2021 11:57:26 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=rb/smlFz; spf=pass (domain: intel.com, ip: 134.134.136.24, mailfrom: isaac.w.oram@intel.com) IronPort-SDR: IaJGat1Mf6IXH3Um7djFbiH1U/AZsaI8WKpqFTE38lklkWnPDmWPrlP2ksFT+GSqzQn4hJDszv M8zNLVSrbp7g== X-IronPort-AV: E=McAfee;i="6200,9189,10026"; a="207662788" X-IronPort-AV: E=Sophos;i="5.83,299,1616482800"; d="scan'208";a="207662788" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jun 2021 11:57:23 -0700 IronPort-SDR: 5iGYX3UOwoVgaS2DzxbbU40kcojURpvIrgts4BlDyiL7koqph8OLlF0PfNWmoL2o26Na0o8rHe 0YLkXp90bXag== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.83,299,1616482800"; d="scan'208";a="556940438" Received: from fmsmsx601.amr.corp.intel.com ([10.18.126.81]) by orsmga004.jf.intel.com with ESMTP; 25 Jun 2021 11:57:23 -0700 Received: from fmsmsx612.amr.corp.intel.com (10.18.126.92) by fmsmsx601.amr.corp.intel.com (10.18.126.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4; Fri, 25 Jun 2021 11:57:23 -0700 Received: from fmsmsx606.amr.corp.intel.com (10.18.126.86) by fmsmsx612.amr.corp.intel.com (10.18.126.92) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4; Fri, 25 Jun 2021 11:57:22 -0700 Received: from fmsedg602.ED.cps.intel.com (10.1.192.136) by fmsmsx606.amr.corp.intel.com (10.18.126.86) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4 via Frontend Transport; Fri, 25 Jun 2021 11:57:22 -0700 Received: from NAM02-BN1-obe.outbound.protection.outlook.com (104.47.51.47) by edgegateway.intel.com (192.55.55.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.4; Fri, 25 Jun 2021 11:57:22 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TgtrvkvmiVIJIY06ICagSYbuaAOo0ozxTYPvi7N7MNWYmmjej2A7EfoDI5i8dN/Qlo06Xc5nCCdU3VkpHe+mWyB4uhI68ytioLP7W3tDXxd0txZWIeSonvp3La6CjuLRCRt55JQKc0VefftKw95sUPnUqkesPcqZaQMuiL4q93yPxA/qdCuIL1IOeVrOXLD1OrcDxzGGDhx88meL/AungzwhkPloqnD59GfasnqTp+f8trMkhbYlxABT2GtJM4BPTtlKvjp6C+6GPnhD7tR4EIpCxI6WcsqAB3qTDUSNU5m+JWUa+XmyughiSJzhxmOMlLno0ZCuYB49K1SzSC1/kA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TfhNvtuUQ54p/AUml2DP3jLSTUAf3WLYo0JnahrFiHE=; b=KbBpPxVwpDLikpstmiWVsD0PfTlNvQ/Ej47xPUv4mkqhH55perVn7MqepmMLkuGxHlFSO62GjCU6ylTSD/SAFTLY0c3iLYYZx04SF0YDBczjUV/PiFVkujqhNqANb0mw1raD4tyjzulIkEFWc+pF9wUVFFfuinaR2ko68o9lWsiQ2sCQyqHuFT1Z9xcZLaMyyezKx/OoRjkIjxKmue9mgi/HRlgelG6vWo7JdMNqI8VPcHdACaZfEIenSJentw/1HIsR/GSfh/J1wkDOzZNbtxBH9EmBy3tfJUQTkABikY8Lz4FhOCHWJGVoU13TOyp5lhJIPjZbS+awCv3wt9TuRg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TfhNvtuUQ54p/AUml2DP3jLSTUAf3WLYo0JnahrFiHE=; b=rb/smlFzL+RQGfd+F4loiZJ9t5HTwRo9Pm0fAPwmlaYtNXBB0dJFQwTgY7FuWwDLforUSz/zlRv28U+pA8XmUS74mi0BTwuBOsT69Gd/LzOaeXvhEiwqjiMF/I+3VRBwvDWGka7t4jCHL24lkMO6WAaYwKCAdtlD5jTq0HxGXgQ= Received: from MW3PR11MB4747.namprd11.prod.outlook.com (2603:10b6:303:2f::11) by CO1PR11MB4865.namprd11.prod.outlook.com (2603:10b6:303:9c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.18; Fri, 25 Jun 2021 18:57:20 +0000 Received: from MW3PR11MB4747.namprd11.prod.outlook.com ([fe80::4cc2:7196:5a55:629e]) by MW3PR11MB4747.namprd11.prod.outlook.com ([fe80::4cc2:7196:5a55:629e%3]) with mapi id 15.20.4264.023; Fri, 25 Jun 2021 18:57:20 +0000 From: "Oram, Isaac W" To: "Desimone, Nathaniel L" , "devel@edk2.groups.io" CC: "KARPAGAVINAYAGAM, MANICKAVASAKAM" , "Felix Polyudov" , "DOPPALAPUDI, HARIKRISHNA" , "Jha, Manish" , "Bobroff, Zachary" Subject: Re: [edk2-platforms] [PATCH V1] PurleyOpenBoardPkg : Support for LINUX Boot Thread-Topic: [edk2-platforms] [PATCH V1] PurleyOpenBoardPkg : Support for LINUX Boot Thread-Index: AQHXYxMV5lm+3jz74E6hbT2hRYYm/qsg5xkg Date: Fri, 25 Jun 2021 18:57:20 +0000 Message-ID: References: <20210617005137.2583-1-nathaniel.l.desimone@intel.com> In-Reply-To: <20210617005137.2583-1-nathaniel.l.desimone@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.5.1.3 dlp-reaction: no-action authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; x-originating-ip: [134.134.136.211] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 7cd7eb3d-984e-466a-1cba-08d9380b0f5e x-ms-traffictypediagnostic: CO1PR11MB4865: x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:356; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: bLy/LQ4yfq4PJzAWw8Rs1tYdFSlV8jdsPEVTyHu1tGK1FoPQz4jNie34HUV0VgeGeogknZTW/+ghrkShv88wkyqHoqCuwdukfVD8XulgWJQDEK8XdbgJhUQWe+v0HhFR+3J984WwIqRGuLd9VcLtIfY/cUtJhc6U7PiKo5qMEI5pLbhJZqRQk1T4ZrKJEfsqp3rve0rOXs5/fwcJbiutnu2T2eIXg92hhXxZ09UCcXcpSr3Znex3+hBJg3V4PurznD4m6tiW/2vgeBdLODHBnUunI77kEvlVI78HnDvZcRCGYygeWWb1F5dP4UNVQqmS43f7u4hNXopzP/JNSVNpusQeMtbbEXVdxERfeOGpGMVTwDlClbWZsV7cQYTttB6NRvkA4r05czllzoBsYlzrQbtBPMI4yby0oRMDel0/MTIwHlUsLY1EykhjrkVLg801mntN9g1hp4+jS/dBM00mMMl/7zFkHK/q1t3jBtOI4Mbdr9/OwMpHxAY8e49XL7B+r1yWSCLEz6jk7RBQUXg8LKgMvhpL2HyB/8yUYvN27GryzV7pMcwF/Nuh/rx0NpkNLqZP5eEL6Bh7xA4svVNtO/xNjBlh336cETFKB5StJqjKF3zrUN6BvR5/8gv+PMNETOEYO5akaZc9F7yApX4lkXVS5W+4ZUVTxnG6FCeoQoa6vo9KyJIT4TU4QTp7et3sYHis8lghv8UQTIhD2FIzOU4FJU8sJq7bjv0OWBXoWxUPNp/ZPqrE9DGRcqm0Be0txdY40SgqcO1GqBopBYJ5aQ== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW3PR11MB4747.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(366004)(396003)(346002)(376002)(136003)(39860400002)(83380400001)(5660300002)(186003)(53546011)(6506007)(33656002)(478600001)(966005)(8936002)(71200400001)(45080400002)(8676002)(54906003)(30864003)(86362001)(110136005)(26005)(7696005)(52536014)(66556008)(66476007)(2906002)(9686003)(64756008)(4326008)(122000001)(76116006)(66946007)(316002)(38100700002)(66446008)(19627235002)(55016002)(579004)(559001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?AburVUw0AucKQ2QeERIjHdpb0nOZAbEGP7AeueHZEhTUS8R5FWHZ/iqQ8CEU?= =?us-ascii?Q?AimhvhM4mRKt37yYCKBOOlDZxovnzxGwvfn53yeOQZY2Sb1ryEeGQSyWhpCh?= =?us-ascii?Q?3+btujz4rOmtAsvZLee5GVjnro2RxtrulFLE1kqBJej/aE+xKrtIbqtfdFju?= =?us-ascii?Q?Kxg8Qmfb7mIbeu/xgJCJUtT1Cm2rfKSIjcgAkn7dCuKyS3+axeQXqQphm6uR?= =?us-ascii?Q?zN1EMUNq7PDQk7PA8YVWcG/Zw5McSjZYNsDed6rZANyli7FNAPoGw8m878Wn?= =?us-ascii?Q?iLoCKIhsmcMhWwZ+gCeW+F5IFtt0shFol/JncZb/LyH6GOKvYSMRzUR7inzH?= =?us-ascii?Q?fe9gLV49JzFoJz8oTmWu1Z7xzJPVh40WeTrDZJYf2+KJqecm3hdHFs0STEZm?= =?us-ascii?Q?kA5RITqTJ1vR5F5QM5FVD5TzdD6g6PpbFjtXcC5X2a0PImtcGtf/IUNbnVq3?= =?us-ascii?Q?YQvbNvfHUSqZ+FZmG6uFq9MkzAM7Tpr3naig0AymOoBiVVCtga6V7GeSUa6f?= =?us-ascii?Q?AbQD4FqvbmjKlanMMoU6nckYyyl47UjKEN7QcEoZ9YGEDVx/xWVJYYQI0te2?= =?us-ascii?Q?6X5PLcwtIk/PgsiJZMfBP5aq1trF4yYA3CTVxTOFVROqw4TDoya7M2zpkq3V?= =?us-ascii?Q?FqZr23O/SNXV/VFxSnUNzC0DTUvdrucHHVd+8dN4Lx0sT913V8hrBFEMmHoE?= =?us-ascii?Q?l000jVvfrbJ0NRJ4j04OnUMUFdbJ40tkVPbDq4L2S7qe95qgvCeUbGfRslpM?= =?us-ascii?Q?xlsoUricUXz+zm0VNgCFLqJz3phQCBL2Wxch6/stk4SZUZT8x9P6rMVz3uAr?= =?us-ascii?Q?wQYnbMV6j6mM/R3ZYKjv31ceWGkPbiXaTBMbSIDcXMY2/fI82URt42m70+MT?= =?us-ascii?Q?ULyG8fDCmSTPOEqgSqdlPT9H+ny6v/RWXLxHbPcisnuPj702SkB8Jobbz9Lb?= =?us-ascii?Q?KBi0njPxtqt8nT8vjCKtbSmD6R1WbHzO/BI+Gdgca8dtjKOvUUIw/c949vKJ?= =?us-ascii?Q?b6YLdMFQS5pOLMyvBu62IoiPAeSI53VSE9Dop4sjI1efHCZidmL5OKh0AyKY?= =?us-ascii?Q?MeRDwU4xwhq/4qnoH+gBx0+FdelYBU5OibYW4wcyPb88maJNbKaG+hYv2gsH?= =?us-ascii?Q?ZMlqsBxJfDK5gUmth7sbyUEoA5RymJpNGIx0TE4oTOKpmySv54wkm4rsMUwu?= =?us-ascii?Q?CaKv4A22pbjS14AA1NZ4cRdugdvVzHAJMowuN+90FEccIB+1kDfqCNp4DbqD?= =?us-ascii?Q?U+gXhUZ8BhWoeDjdixdyI8av2x3K5jtb9Dr5S6QtgMRKynsbn0RFsE7iZO9i?= =?us-ascii?Q?3NIWWJ2/+q4YdHUlVhOC0Q8J?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW3PR11MB4747.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7cd7eb3d-984e-466a-1cba-08d9380b0f5e X-MS-Exchange-CrossTenant-originalarrivaltime: 25 Jun 2021 18:57:20.1316 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 4WAyiNmxp15tZGrJ4aaDkKEDXcjrl3bONN2vllhyOexFiGuoSX8hKNATmE4bmAoa57O2XGMJMgrVu0yL2Ojx9w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR11MB4865 Return-Path: isaac.w.oram@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Manic, I don't think that there is much value in having two different flash maps f= or LinuxBoot enabled or disabled. It strikes me as unnecessary code to mai= ntain. =20 LinuxKernel.inf is missing a properly formatted file header. LinuxBoot.c should be run through code style compliance tools. Also there = is unnecessary commented out code and things like #if 1 that should be remo= ved. LinuxBoot.h has tabs in the source disrupting structure layout and not foll= owing coding style. Please rename LinuxBootPkg as it is not an edk2 package and the name is a b= it misleading. We should do an RFC to talk about the various LinuxBoot integrations that w= e see across the community and maybe discuss at the design meeting. I thin= k you are fine to commit this version as it is fairly specific to your use = case, so that design discussion shouldn't block this fix. Regards, Isaac -----Original Message----- From: Desimone, Nathaniel L =20 Sent: Wednesday, June 16, 2021 5:52 PM To: devel@edk2.groups.io Cc: KARPAGAVINAYAGAM, MANICKAVASAKAM ; Oram, Isaac= W ; Felix Polyudov ; DOPPALAPUDI, = HARIKRISHNA ; Jha, Manish ; Bobroff,= Zachary Subject: [edk2-platforms] [PATCH V1] PurleyOpenBoardPkg : Support for LINUX= Boot From: Manickavasakam Karpagavinayagam Support for LINUX Boot To enable/disable feature, PcdLinuxBootEnable can be used 1. Follow directions on http://osresearch.net/Building/ to compile the head= s kernel and initrd for qemu-system_x86_64 2. Copy the following built files (1) initrd.cpio.xz to LinuxBootPkg/LinuxBinaries/initrd.cpio.xz (2) bzimage to LinuxBootPkg/LinuxBinaries/linux.efi Cc: Isaac Oram Cc: Felix Polyudov Cc: Harikrishna Doppalapudi Cc: Manish Jha Cc: Zachary Bobroff Cc: Manickavasakam Karpagavinayagam --- .../BoardTiogaPass/CoreDxeInclude.dsc | 5 +- .../BoardTiogaPass/CoreUefiBootInclude.fdf | 5 +- .../BoardTiogaPass/OpenBoardPkg.dsc | 7 + .../BoardTiogaPass/OpenBoardPkg.fdf | 57 ++- .../BoardTiogaPass/PlatformPkgConfig.dsc | 7 + .../LinuxBinaries/LinuxKernel.inf | 9 + .../LinuxBootPkg/LinuxBinaries/initrd.cpio.xz | Bin 0 -> 16 bytes .../LinuxBootPkg/LinuxBinaries/linux.efi | Bin 0 -> 16 bytes .../LinuxBootPkg/LinuxBoot.c | 422 ++++++++++++++++++ .../LinuxBootPkg/LinuxBoot.h | 193 ++++++++ .../LinuxBootPkg/LinuxBoot.inf | 46 ++ .../LinuxBootPkg/LinuxBootNull.c | 43 ++ .../LinuxBootPkg/LinuxBootNull.inf | 31 ++ .../Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec | 2 + .../DxePlatformBootManagerLib/BdsPlatform.c | 9 + .../DxePlatformBootManagerLib.inf | 2 + Platform/Intel/Readme.md | 42 ++ 17 files changed, 872 insertions(+), 8 deletions(-) create mode 100644 Pl= atform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/LinuxKernel.inf create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBin= aries/initrd.cpio.xz create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBin= aries/linux.efi create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= t.c create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= t.h create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= t.inf create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= tNull.c create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= tNull.inf diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclud= e.dsc b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.dsc index b0660d72dd..a17015704b 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.dsc +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.ds +++ c @@ -83,6 +83,7 @@ $(PLATFORM_BOARD_PACKAGE)/Override/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus= Dxe.inf #TiogaPass Override END =20 +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf @@ -97,10 +98,11 @@ MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf FatPkg/EnhancedFatDxe/Fat.inf - +!endif #MdeModulePkg/Universal/Console/GraphicsOutputDxe/GraphicsOutputDxe.inf MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf =20 +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf =20 @@ -124,6 +126,7 @@ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf } +!endif =20 !if gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly =3D=3D FALSE MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootI= nclude.fdf b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootI= nclude.fdf index 141ce5dda3..6cd8ba6626 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInclude.= fdf +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInclu +++ de.fdf @@ -47,6 +47,7 @@ INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf INF $(PLATFORM_BOARD_PACKAGE)/Override/MdeModulePkg/Bus/Pci/PciBusDxe/Pc= iBusDxe.inf #TiogaPass Override END =20 +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf INF MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf @@ -62,10 +63,12 @@ INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.in= f INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.in= f INF FatPkg/EnhancedFatDxe/Fat.inf +!endif =20 #INF MdeModulePkg/Universal/Console/GraphicsOutputDxe/GraphicsOutputDxe.i= nf INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.= inf =20 +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf =20 @@ -79,4 +82,4 @@ INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngin= eDxe.inf =20 INF MdeModulePkg/Application/UiApp/UiApp.inf INF MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf - +!endif diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.= dsc b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc index e4c8e7fbf1..06ed3f610e 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc @@ -104,6 +104,13 @@ ##########################################################################= ###### =20 [LibraryClasses.common] +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE + LinuxBootLib|$(PLATFORM_BOARD_PACKAGE)/LinuxBootPkg/LinuxBoot.inf + LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf +!else + LinuxBootLib|$(PLATFORM_BOARD_PACKAGE)/LinuxBootPkg/LinuxBootNull.inf +!endif + !if gPlatformTokenSpaceGuid.PcdFastBoot =3D=3D FALSE PlatformBootManagerLib|$(PLATFORM_PACKAGE)/Bds/Library/DxePlatformBootMa= nagerLib/DxePlatformBootManagerLib.inf !else diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.= fdf b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf index 43cd8d94e1..adbf28a936 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf @@ -19,6 +19,38 @@ # Also all values will have a PCD assigned so that they can be used = in the system, and # the FlashMap edit tool can be used to change the values here, with= out effecting the code. # This requires all code to only use the PCD tokens to recover the v= alues. +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE + +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset =3D 0x= 00000000 # Flash addr (0xFF840000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedSize =3D 0x= 00300000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset =3D 0x= 00300000 # Flash addr (0xFF8A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecuritySize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset =3D 0x= 00400000 # Flash addr (0xFF910000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootSize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset =3D 0x= 00500000 # Flash addr (0xFFE00000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUSize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset =3D 0x= 00600000 # Flash addr (0xFF9A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootSize =3D 0x= 00600000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset =3D 0x= 00C00000 # Flash addr (0xFF800000) +SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize =3D 0x= 0007C000 # + +!else + +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset =3D 0x= 00000000 # Flash addr (0xFF840000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedSize =3D 0x= 00500000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset =3D 0x= 00500000 # Flash addr (0xFF8A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecuritySize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset =3D 0x= 00600000 # Flash addr (0xFF910000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootSize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset =3D 0x= 00700000 # Flash addr (0xFFE00000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUSize =3D 0x= 00200000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset =3D 0x= 00900000 # Flash addr (0xFF9A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootSize =3D 0x= 00300000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset =3D 0x= 00C00000 # Flash addr (0xFF800000) +SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize =3D 0x= 0007C000 # + +!endif + =20 [FD.Platform] BaseAddress =3D 0xFF000000 | gEfiPchTokenSpaceGuid.PcdFlashAreaBaseA= ddress @@ -27,27 +59,27 @@ ErasePolarity =3D 1 BlockSize =3D 0x10000 NumBlocks =3D 0x100 =20 -0x00000000|0x00500000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset|gMinPlatformPkgT +okenSpaceGuid.PcdFlashFvAdvancedSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedBase|gMinPlatformPkgTokenS= paceGuid.PcdFlashFvAdvancedSize FV =3D FvAdvanced =20 -0x00500000|0x00100000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset|gMinPlatformPkgT +okenSpaceGuid.PcdFlashFvSecuritySize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityBase|gMinPlatformPkgTokenS= paceGuid.PcdFlashFvSecuritySize FV =3D FvSecurity =20 -0x00600000|0x00100000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset|gMinPlatformPkgTok +enSpaceGuid.PcdFlashFvOsBootSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootBase|gMinPlatformPkgTokenSpa= ceGuid.PcdFlashFvOsBootSize FV =3D FvOsBoot =20 -0x00700000|0x00200000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset|gMinPlatformPkgToken +SpaceGuid.PcdFlashFvFspUSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUBase|gMinPlatformPkgTokenSpace= Guid.PcdFlashFvFspUSize FV =3D FvLateSiliconCompressed =20 -0x00900000|0x00300000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset|gMinPlatformPkgT +okenSpaceGuid.PcdFlashFvUefiBootSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootBase|gMinPlatformPkgTokenS= paceGuid.PcdFlashFvUefiBootSize FV =3D FvUefiBoot =20 -0x00C00000|0x0007C000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset|gEfiMdeMo +dulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|gEfiMdeModule= PkgTokenSpaceGuid.PcdFlashNvStorageVariableSize #NV_VARIABLE_STORE DATA =3D { @@ -303,6 +335,19 @@ FILE DRIVER =3D db90bb7e-e4ba-4f07-96d6-b7076713bd2c { =20 INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf =20 +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE + +FILE DRIVER =3D 81339b04-fa8c-4be0-9ca7-916fc5319eb5 { + SECTION DXE_DEPEX_EXP =3D {FALSE} + SECTION PE32 =3D=20 +$(PLATFORM_BOARD_PACKAGE)/LinuxBootPkg/LinuxBinaries/linux.efi +} + +FILE FREEFORM =3D 16b60e5d-f1c5-42f0-9b34-08C81C430473 { + SECTION RAW =3D=20 +$(PLATFORM_BOARD_PACKAGE)/LinuxBootPkg/LinuxBinaries/initrd.cpio.xz +} + +!endif + =20 [FV.FvUefiBoot] FvAlignment =3D 16 diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgCo= nfig.dsc b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgConf= ig.dsc index 36a29c8d68..ff27252233 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgConfig.ds= c +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgConfig +++ .dsc @@ -51,7 +51,14 @@ =20 gMinPlatformPkgTokenSpaceGuid.PcdPerformanceEnable|TRUE =20 + gPlatformTokenSpaceGuid.PcdLinuxBootEnable|FALSE + +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE + gPlatformTokenSpaceGuid.PcdFastBoot|TRUE +!else gPlatformTokenSpaceGuid.PcdFastBoot|FALSE +!endif + !if gPlatformTokenSpaceGuid.PcdFastBoot =3D=3D TRUE gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiFeatureEnable|FALSE gPlatformTokenSpaceGuid.PcdUpdateConsoleInBds|FALSE diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/L= inuxKernel.inf b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinari= es/LinuxKernel.inf new file mode 100644 index 0000000000..a249027d22 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/Linux +++ Kernel.inf @@ -0,0 +1,9 @@ +[Defines] + INF_VERSION =3D 1.27 + BASE_NAME =3D LinuxKernel + FILE_GUID =3D 81339b04-fa8c-4be0-9ca7-916fc5319eb5 + MODULE_TYPE =3D UEFI_DRIVER + VERSION_STRING =3D 1.0 + +[Binaries.common.AARCH64] + PE32|linux.efi|* diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/i= nitrd.cpio.xz b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinarie= s/initrd.cpio.xz new file mode 100644 index 0000000000000000000000000000000000000000..01d633b27e8ea9b17084fc911d0= c8cc43a4170a9 GIT binary patch literal 16 KcmZQzKm`B*5C8!H literal 0 HcmV?d00001 diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/l= inux.efi b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/lin= ux.efi new file mode 100644 index 0000000000000000000000000000000000000000..01d633b27e8ea9b17084fc911d0= c8cc43a4170a9 GIT binary patch literal 16 KcmZQzKm`B*5C8!H literal 0 HcmV?d00001 diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.c b/P= latform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.c new file mode 100644 index 0000000000..eec05824d6 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.c @@ -0,0 +1,422 @@ +/** @file + +Copyright (c) 2021, American Megatrends International LLC. All rights=20 +reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + * + * This library will load the Linux kernel and initrd from the BIOS and l= aunch it. + * + */ + +//--------------------------------------------------------------------- +------ + +#include +#include +#include +#include +#include +#include +#include #include=20 + +#include +#include #include =20 +#include #include =20 +#include #include =20 +#include #include #include=20 + #include "LinuxBoot.h" + +//16b60e5d-f1c5-42f0-9b34-08C81C430473 +#define LINUX_BOOT_INITRD_GUID \ + { \ + 0x16b60e5d, 0xf1c5, 0x42f0, {0x9b, 0x34, 0x08, 0xc8, 0x1c, 0x43,=20 +0x04, 0x73} \ + } + +#define LINUX_BOOT_KERNEL_GUID \ + { \ + 0x81339b04, 0xfa8c, 0x4be0, {0x9c, 0xa7, 0x91, 0x6f, 0xc5, 0x31,=20 +0x9e, 0xb5} \ + } + + +EFI_STATUS +EFIAPI +LoadLinuxCheckKernelSetup ( + IN VOID *KernelSetup, + IN UINTN KernelSetupSize + ); + +VOID* +EFIAPI +LoadLinuxAllocateKernelSetupPages ( + IN UINTN Pages + ); + +EFI_STATUS +EFIAPI +LoadLinuxInitializeKernelSetup ( + IN VOID *KernelSetup + ); + +VOID* +EFIAPI +LoadLinuxAllocateKernelPages ( + IN VOID *KernelSetup, + IN UINTN Pages + ); + +EFI_STATUS +EFIAPI +LoadLinuxSetCommandLine ( + IN OUT VOID *KernelSetup, + IN CHAR8 *CommandLine + ); + +EFI_STATUS +EFIAPI +LoadLinux ( + IN VOID *Kernel, + IN OUT VOID *KernelSetup + ); + +VOID* +EFIAPI +LoadLinuxAllocateInitrdPages ( + IN VOID *KernelSetup, + IN UINTN Pages + ); + +EFI_GUID gLinuxBootInitrdFileGuid =3D LINUX_BOOT_INITRD_GUID; + +EFI_GUID gLinuxBootKernelFileGuid =3D LINUX_BOOT_KERNEL_GUID; + +//--------------------------------------------------------------------- +------ + +/** + Dump some hexadecimal data to the screen. + + @note Function taken from=20 + ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c in EDKII + + @param[in] Indent How many spaces to indent the output. + @param[in] Offset The offset of the printing. + @param[in] DataSize The size in bytes of UserData. + @param[in] UserData The data to print out. +**/ +static +VOID +DumpHex ( + IN UINTN Indent, + IN UINTN Offset, + IN UINTN DataSize, + IN VOID *UserData + ) +{ + UINT8 *Data; + CHAR8 Val[50]; + CHAR8 Str[20]; + UINT8 TempByte; + UINTN Size; + UINTN Index; + CHAR8 Hex[] =3D { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + DEBUG((DEBUG_INFO, "%*a 00 01 02 03 04 05 06 07 08 09 0A 0B 0C = 0D 0E 0F\n", Indent, "")); + DEBUG((DEBUG_INFO, "%*a ---------------------------------------= ---------\n", Indent, "")); + + Data =3D UserData; + while (DataSize !=3D 0) { + Size =3D 16; + if (Size > DataSize) { + Size =3D DataSize; + } + + for (Index =3D 0; Index < Size; Index +=3D 1) { + TempByte =3D Data[Index]; + Val[Index * 3 + 0] =3D Hex[TempByte >> 4]; + Val[Index * 3 + 1] =3D Hex[TempByte & 0xF]; + Val[Index * 3 + 2] =3D (CHAR8) ((Index =3D=3D 7) ? '-' : ' '); + Str[Index] =3D (CHAR8) ((TempByte < ' ' || TempByte > 'z') = ? '.' : TempByte); + } + + Val[Index * 3] =3D 0; + Str[Index] =3D 0; + DEBUG((DEBUG_INFO, "%*a%08X: %-48a %a\n", Indent, "", Offset, Val,=20 + Str)); + + Data +=3D Size; + Offset +=3D Size; + DataSize -=3D Size; + } +} + + +/** + * This function completes a minimal amount of the necessary BDS=20 +functions to prepare + * for booting the kernel. + * + * @param None + * + * @retval EFI_SUCCESS Successfully completed remaining tasks + * @return EFI_ERROR Could not complete BDS tasks + */ +EFI_STATUS +CompleteBdsTasks ( + VOID +) +{ + + return EFI_SUCCESS; +} + +/** + * This function will load and launch the Linux kernel from a BIOS FV. + * + * @note This function is not intended to return. Any exiting from this= function indicates + * a problem loading or launching the kernel. + * + * @param None + * + * @return EFI_ERROR Any error code + */ +EFI_STATUS +LoadAndLaunchKernel ( + VOID +) +{ + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage =3D NULL; + EFI_STATUS Status; + EFI_HANDLE KernelHandle =3D NULL; + VOID *KernelBuffer =3D NULL; + VOID *KernelFfsBuffer =3D NULL; + UINTN KernelFfsSize =3D 0; + VOID *InitrdData =3D NULL; + VOID *InitrdBuffer =3D NULL; + UINTN InitrdSize =3D 0; + struct boot_params *BootParams =3D NULL; + struct boot_params *HandoverParams =3D NULL; + UINT32 StartOffset =3D 0; + UINT32 KernelLength =3D 0; + UINT8 *Temp; + UINT8 CmdLine[] =3D " "; + + DEBUG((DEBUG_INFO, "LoadAndLaunchKernel Entry\n")); + + /// + /// Kernel load and preparation + /// + DEBUG((DEBUG_INFO, "Preparing the kernel...\n")); + + // Retrieve the kernel from the firmware volume + Status =3D GetSectionFromAnyFv( + &gLinuxBootKernelFileGuid, + EFI_SECTION_PE32, + 0, + &KernelFfsBuffer, + &KernelFfsSize + ); + =20 + DEBUG((DEBUG_INFO, "Status %r\n",Status)); + DEBUG((DEBUG_INFO, "KernelFfsBuffer %x\n",KernelFfsBuffer)); + DEBUG((DEBUG_INFO, "KernelFfsSize %x\n",KernelFfsSize)); =20 + + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "Could not retrieve kernel; %r.\n", Status)); + goto FatalError; + } + =20 + DEBUG((DEBUG_INFO, "Loaded kernel to buffer at 0x%p with size 0x%X.\n"= , KernelFfsBuffer, KernelFfsSize)); + DEBUG((DEBUG_INFO, "Printing first 0x%X bytes:\n",=20 + MIN(KernelFfsSize, 0x100))); + =20 + DumpHex(2, 0, MIN(0x100, KernelFfsSize), KernelFfsBuffer); + + // Create a LoadImage protocol for the kernel + Status =3D gBS->LoadImage(TRUE, gImageHandle, NULL, KernelFfsBuffer, K= ernelFfsSize, &KernelHandle); + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "Could not create LoadImage for kernel %r\n", = Status)); + goto FatalError; + } + + // Get the new LoadedImage protocol to retrieve information about the = kernel + Status =3D gBS->HandleProtocol(KernelHandle, &gEfiLoadedImageProtocolG= uid, (VOID **) &LoadedImage); + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "Could not get kernel LoadedImage protocol; %r= \n", Status)); + goto FatalError; + } + + DEBUG((DEBUG_INFO, "Kernel LoadedImage information:\n")); + DEBUG((DEBUG_INFO, " ImageBase =3D 0x%p\n", LoadedImage->ImageBase)); + DEBUG((DEBUG_INFO, " ImageSize =3D 0x%p\n",=20 + LoadedImage->ImageSize)); + + // Verify the kernel boot parameters from the LoadedImage and allocate= an initalization buffer once verified + BootParams =3D (struct boot_params*) LoadedImage->ImageBase; + + Status =3D LoadLinuxCheckKernelSetup((VOID *) BootParams, sizeof(struc= t boot_params)); + if (EFI_ERROR (Status)) { + DEBUG((DEBUG_ERROR, "LoadLinuxCheckKernelSetup failed; %r.\n", Sta= tus)); + goto FatalError; + } + + HandoverParams =3D LoadLinuxAllocateKernelSetupPages(EFI_SIZE_TO_PAGES= (KERNEL_SETUP_SIZE)); + if (HandoverParams =3D=3D NULL) { + DEBUG((DEBUG_ERROR, "Could not allocate memory for kernel handover= parameters.\n")); + goto FatalError; + } + DEBUG((DEBUG_INFO, "Handover parameters allocated at 0x%p\n",=20 + HandoverParams)); + + gBS->CopyMem(&HandoverParams->hdr, &BootParams->hdr, sizeof(struct=20 + setup_header)); + + Status =3D LoadLinuxInitializeKernelSetup(HandoverParams); + if (EFI_ERROR (Status)) { + DEBUG((DEBUG_ERROR, "Unable to initialize the handover parameters;= %r.\n", Status)); + goto FatalError; + } + + // Allocate space for the kernel and copy it into the new buffer + KernelBuffer =3D LoadLinuxAllocateKernelPages(HandoverParams, EFI_SIZE= _TO_PAGES(HandoverParams->hdr.init_size)); + if (KernelBuffer =3D=3D NULL) { + DEBUG((DEBUG_ERROR, "Unable to allocate memory for kernel.\n")); + goto FatalError; + } + + StartOffset =3D (HandoverParams->hdr.setup_secs + 1) * 512; + KernelLength =3D (UINT32) (KernelFfsSize - StartOffset); + Temp =3D (UINT8 *) LoadedImage->ImageBase; + + DEBUG((DEBUG_INFO, "Kernel starts at offset 0x%X with length=20 + 0x%X\n", StartOffset, KernelLength)); + + gBS->CopyMem(KernelBuffer, (Temp + StartOffset), KernelLength); + DEBUG((DEBUG_INFO, "First 0x%X bytes of new kernel buffer=20 + contents:\n", MIN(0x100, KernelLength))); + + DumpHex(2, 0, MIN(0x100, KernelLength), KernelBuffer); + + // Prepare the command line + Status =3D LoadLinuxSetCommandLine(HandoverParams, (UINT8 *) &CmdLine)= ; + if (EFI_ERROR (Status)) { + DEBUG((EFI_D_INFO, "Unable to set linux command line; %r.\n", Stat= us)); + goto FatalError; + } + + HandoverParams->hdr.code32_start =3D (UINT32)(UINTN) KernelBuffer; + HandoverParams->hdr.loader_id =3D 0x21; + + DEBUG((DEBUG_INFO, "Kernel loaded.\n")); + +#if 1 +//#if defined(INTEGRATED_INITRAM_FS) && (INTEGRATED_INITRAM_FS =3D=3D0) + /// + /// Initrd load and preparation + /// + DEBUG((DEBUG_INFO, "Preparing the initrd...\n")); + + // Retrieve the initrd from the firmware volume + Status =3D GetSectionFromAnyFv( + &gLinuxBootInitrdFileGuid, + EFI_SECTION_RAW, + 0, + &InitrdBuffer, + &InitrdSize + ); + + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "Could not retrieve initrd; %r.\n", Status)); + goto FatalError; + } + + DEBUG((DEBUG_INFO, "Loaded initrd to buffer at 0x%p with size 0x%X.\n"= , InitrdBuffer, InitrdSize)); + DEBUG((DEBUG_INFO, "Printing first 0x%X bytes:\n", MIN(0x100, InitrdSi= ze))); + DumpHex(2, 0, MIN(0x100, InitrdSize), InitrdBuffer); + + // Allocate the initrd for the kernel and copy it in + InitrdData =3D LoadLinuxAllocateInitrdPages(HandoverParams, EFI_SIZE_T= O_PAGES(InitrdSize)); + if (InitrdData =3D=3D NULL) { + DEBUG((DEBUG_ERROR, "Unable to allocate memory for initrd.\n")); + goto FatalError; + } + + gBS->CopyMem(InitrdData, InitrdBuffer, InitrdSize); + + HandoverParams->hdr.ramdisk_start =3D (UINT32)(UINTN) InitrdData; + HandoverParams->hdr.ramdisk_len =3D (UINT32) InitrdSize; + + DEBUG((DEBUG_INFO, "Initrd loaded.\n")); + DEBUG((DEBUG_INFO, "Printing first 0x%X bytes of initrd buffer:\n", MI= N(0x100, InitrdSize))); + DumpHex(2, 0, MIN(0x100, InitrdSize), InitrdData); + + // General cleanup before launching the kernel + gBS->FreePool(InitrdBuffer); + InitrdBuffer =3D NULL; +#endif + + gBS->UnloadImage(KernelHandle); + gBS->FreePool(KernelFfsBuffer); + KernelFfsBuffer =3D NULL; + + DEBUG((DEBUG_ERROR, "Launching the kernel\n")); + + + // + // Signal the EFI_EVENT_GROUP_READY_TO_BOOT event. + // + EfiSignalEventReadyToBoot(); + + + // Launch the kernel + Status =3D LoadLinux(KernelBuffer, HandoverParams); + + /// + /// LoadLinux should never return if the kernel boots. Anything past h= ere is an error scenario + /// + DEBUG((DEBUG_ERROR, "ERROR: LoadLinux has returned with status;=20 + %r.\n", Status)); + +FatalError: + // Free everything + if (InitrdData !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Initrd= Data, EFI_SIZE_TO_PAGES(InitrdSize)); + if (KernelBuffer !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Kern= elBuffer, EFI_SIZE_TO_PAGES(HandoverParams->hdr.init_size)); + if (HandoverParams !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Ha= ndoverParams, EFI_SIZE_TO_PAGES(KERNEL_SETUP_SIZE)); + if (InitrdBuffer !=3D NULL) gBS->FreePool(InitrdBuffer); + if (KernelHandle !=3D NULL) gBS->UnloadImage(KernelHandle); + if (KernelFfsBuffer !=3D NULL) gBS->FreePool(KernelFfsBuffer); + + return EFI_NOT_FOUND; +} + +/** + * This is the main function for this feature. This will handle=20 +finding and launching + * the Linux kernel. + * + * @note In general, this function will never return to BDS. The LINUXB= OOT_ALLOW_RETURN_TO_BDS + * token will allow you to return to BDS if the kernel fails to l= aunch for some reason. + * + * @param None + * + * @retval None + */ + +EFI_STATUS +LinuxBootStart ( + VOID + ) +{ + EFI_STATUS Status =3D EFI_SUCCESS; + + // Finish BDS and then try to launch the kernel + //Status =3D CompleteBdsTasks(); =20 + + if (!EFI_ERROR(Status)) { + LoadAndLaunchKernel(); + } + + DEBUG((DEBUG_ERROR, "-----------------------------------\n")); + DEBUG((DEBUG_ERROR, " ERROR: Kernel failed to launch.\n")); + DEBUG((DEBUG_ERROR, "-----------------------------------\n")); + return Status; +} + +//--------------------------------------------------------------------- +------ diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.h b/P= latform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.h new file mode 100644 index 0000000000..479fb8cbfd --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.h @@ -0,0 +1,193 @@ +/** @file + +Copyright (c) 2021, American Megatrends International LLC. All rights=20 +reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + * + * Header for library definitions and prototypes. + * + */ + +#ifndef __LINUX_BOOT_PRIVATE__H__ +#define __LINUX_BOOT_PRIVATE__H__ +#ifdef __cplusplus +extern "C" { +#endif // #ifdef __cplusplus + +//--------------------------------------------------------------------- +------ + +//#include + +#define BOOTSIG 0x1FE +#define SETUP_HDR 0x53726448 /* 0x53726448 =3D=3D "HdrS" */ + +#define E820_RAM 1 +#define E820_RESERVED 2 +#define E820_ACPI 3 +#define E820_NVS 4 +#define E820_UNUSABLE 5 + +#pragma pack(1) + +struct setup_header { + UINT8 setup_secs; /* Sectors for setup code */ + UINT16 root_flags; + UINT32 sys_size; + UINT16 ram_size; + UINT16 video_mode; + UINT16 root_dev; + UINT16 signature; /* Boot signature */ + UINT16 jump; + UINT32 header; + UINT16 version; + UINT16 su_switch; + UINT16 setup_seg; + UINT16 start_sys; + UINT16 kernel_ver; + UINT8 loader_id; + UINT8 load_flags; + UINT16 movesize; + UINT32 code32_start; /* Start of code loaded high */ + UINT32 ramdisk_start; /* Start of initial ramdisk */ + UINT32 ramdisk_len; /* Length of initial ramdisk */ + UINT32 bootsect_kludge; + UINT16 heap_end; + UINT8 ext_loader_ver; /* Extended boot loader version */ + UINT8 ext_loader_type; /* Extended boot loader ID */ + UINT32 cmd_line_ptr; /* 32-bit pointer to the kernel command line */ + UINT32 ramdisk_max; /* Highest legal initrd address */ + UINT32 kernel_alignment; /* Physical addr alignment required for kernel *= / + UINT8 relocatable_kernel; /* Whether kernel is relocatable or not */ + UINT8 min_alignment; + UINT16 xloadflags; + UINT32 cmdline_size; + UINT32 hardware_subarch; + UINT64 hardware_subarch_data; + UINT32 payload_offset; + UINT32 payload_length; + UINT64 setup_data; + UINT64 pref_address; + UINT32 init_size; + UINT32 handover_offset; +}; + +struct efi_info { + UINT32 efi_loader_signature; + UINT32 efi_systab; + UINT32 efi_memdesc_size; + UINT32 efi_memdesc_version; + UINT32 efi_memmap; + UINT32 efi_memmap_size; + UINT32 efi_systab_hi; + UINT32 efi_memmap_hi; +}; + +struct e820_entry { + UINT64 addr; /* start of memory segment */ + UINT64 size; /* size of memory segment */ + UINT32 type; /* type of memory segment */ +}; + +struct screen_info { + UINT8 orig_x; /* 0x00 */ + UINT8 orig_y; /* 0x01 */ + UINT16 ext_mem_k; /* 0x02 */ + UINT16 orig_video_page; /* 0x04 */ + UINT8 orig_video_mode; /* 0x06 */ + UINT8 orig_video_cols; /* 0x07 */ + UINT8 flags; /* 0x08 */ + UINT8 unused2; /* 0x09 */ + UINT16 orig_video_ega_bx;/* 0x0a */ + UINT16 unused3; /* 0x0c */ + UINT8 orig_video_lines; /* 0x0e */ + UINT8 orig_video_isVGA; /* 0x0f */ + UINT16 orig_video_points;/* 0x10 */ + + /* VESA graphic mode -- linear frame buffer */ + UINT16 lfb_width; /* 0x12 */ + UINT16 lfb_height; /* 0x14 */ + UINT16 lfb_depth; /* 0x16 */ + UINT32 lfb_base; /* 0x18 */ + UINT32 lfb_size; /* 0x1c */ + UINT16 cl_magic, cl_offset; /* 0x20 */ + UINT16 lfb_linelength; /* 0x24 */ + UINT8 red_size; /* 0x26 */ + UINT8 red_pos; /* 0x27 */ + UINT8 green_size; /* 0x28 */ + UINT8 green_pos; /* 0x29 */ + UINT8 blue_size; /* 0x2a */ + UINT8 blue_pos; /* 0x2b */ + UINT8 rsvd_size; /* 0x2c */ + UINT8 rsvd_pos; /* 0x2d */ + UINT16 vesapm_seg; /* 0x2e */ + UINT16 vesapm_off; /* 0x30 */ + UINT16 pages; /* 0x32 */ + UINT16 vesa_attributes; /* 0x34 */ + UINT32 capabilities; /* 0x36 */ + UINT8 _reserved[6]; /* 0x3a */ +}; + +struct boot_params { + struct screen_info screen_info; + UINT8 apm_bios_info[0x14]; + UINT8 _pad2[4]; + UINT64 tboot_addr; + UINT8 ist_info[0x10]; + UINT8 _pad3[16]; + UINT8 hd0_info[16]; + UINT8 hd1_info[16]; + UINT8 sys_desc_table[0x10]; + UINT8 olpc_ofw_header[0x10]; + UINT8 _pad4[128]; + UINT8 edid_info[0x80]; + struct efi_info efi_info; + UINT32 alt_mem_k; + UINT32 scratch; + UINT8 e820_entries; + UINT8 eddbuf_entries; + UINT8 edd_mbr_sig_buf_entries; + UINT8 _pad6[6]; + struct setup_header hdr; + UINT8 _pad7[0x290-0x1f1-sizeof(struct setup_header)]; + UINT32 edd_mbr_sig_buffer[16]; + struct e820_entry e820_map[128]; + UINT8 _pad8[48]; + UINT8 eddbuf[0x1ec]; + UINT8 _pad9[276]; +}; +#pragma pack () + +//--------------------------------------------------------------------- +------ + +#ifndef MIN +#define MIN(x,y) ((x) < (y) ? (x) : (y)) +#endif // #ifndef MIN + +#define KERNEL_SETUP_SIZE 16384 + +//--------------------------------------------------------------------- +------ + +/// +/// Function prototypes from Bds module /// VOID ConnectEverything();=20 +VOID RecoverTheMemoryAbove4Gb(); VOID SignalAllDriversConnectedEvent();=20 +VOID SignalProtocolEvent(IN EFI_GUID *ProtocolGuid); + +#if LINUXBOOT_SIGNAL_EXITPMAUTH =3D=3D 1 +VOID SignalExitPmAuthProtocolEvent(VOID); +#endif // #if LINUXBOOT_SIGNAL_EXITPMAUTH =3D=3D 1 + +typedef VOID (BDS_CONTROL_FLOW_FUNCTION)(); + +//--------------------------------------------------------------------- +------ + +/****** DO NOT WRITE BELOW THIS LINE *******/ #ifdef __cplusplus }=20 +#endif // #ifdef __cplusplus #endif // #ifndef=20 +__LINUX_BOOT_PRIVATE__H__ diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.inf b= /Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.inf new file mode 100644 index 0000000000..62e09a75c8 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.inf @@ -0,0 +1,46 @@ +## @file +# +# Copyright (c) 2021, American Megatrends International LLC. All rights=20 +reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # ## + +## +# +# This library links with the Bds module to launch the Linux kernel. +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + VERSION_STRING =3D 1.0 + BASE_NAME =3D LinuxBoot + FILE_GUID =3D 74a41ddc-fac5-4787-afad-d81ee30a8b63= # {0x74a41ddc, 0xfac5, 0x4787, {0xaf, 0xad, 0xd8, 0x1e, 0xe3, 0x0a, 0= x8b, 0x63}} + MODULE_TYPE =3D DXE_DRIVER + LIBRARY_CLASS =3D LinuxBootLib|DXE_DRIVER +[Sources] + LinuxBoot.c + LinuxBoot.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + MinPlatformPkg/MinPlatformPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DxeServicesLib + BaseMemoryLib + DebugLib + UefiRuntimeServicesTableLib + UefiBootServicesTableLib + UefiLib + LoadLinuxLib + =20 +[Guids] + =20 +[Protocols] + gEfiLoadedImageProtocolGuid + +[Pcd] diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.c= b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.c new file mode 100644 index 0000000000..fa6ea117f4 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.c @@ -0,0 +1,43 @@ +/** @file + +Copyright (c) 2021, American Megatrends International LLC. All rights=20 +reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + * + * This library will load the Linux kernel and initrd from the BIOS and l= aunch it. + * + */ + +//--------------------------------------------------------------------- +------ + +#include +#include +#include +#include + + +/** + * This is the main function for this feature. This will handle=20 +finding and launching + * the Linux kernel. + * + * @note In general, this function will never return to BDS. The LINUXB= OOT_ALLOW_RETURN_TO_BDS + * token will allow you to return to BDS if the kernel fails to l= aunch for some reason. + * + * @param None + * + * @retval None + */ + +EFI_STATUS +LinuxBootStart ( + VOID + ) +{ + + return EFI_SUCCESS; +} + +//--------------------------------------------------------------------- +------ diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.i= nf b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.inf new file mode 100644 index 0000000000..3ed53c6ba0 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.inf @@ -0,0 +1,31 @@ +## @file +# +# Copyright (c) 2021, American Megatrends International LLC. All rights=20 +reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # ## + +## +# +# This library links with the Bds module to launch the Linux kernel. +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + VERSION_STRING =3D 1.0 + BASE_NAME =3D LinuxBoot + FILE_GUID =3D 0551B6D3-0594-4B02-AF42-5A9C7515CEC8 + MODULE_TYPE =3D DXE_DRIVER + LIBRARY_CLASS =3D LinuxBootLib|DXE_DRIVER +[Sources] + LinuxBootNull.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DxeServicesLib \ No newline at end of file diff --git a/Platform/Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec b/Platform/= Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec index 4dcec5430b..0c1ab318b8 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec +++ b/Platform/Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec @@ -49,6 +49,8 @@ =20 gPlatformTokenSpaceGuid.PcdUpdateConsoleInBds|TRUE|BOOLEAN|0x30000035 =20 + gPlatformTokenSpaceGuid.PcdLinuxBootEnable|FALSE|BOOLEAN|0x30000036 + =20 [PcdsDynamicEx] gPlatformTokenSpaceGuid.PcdDfxAdvDebugJumper|FALSE|BOOLEAN|0x6000001D =20 diff --git a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinP= latformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c b/Platform/I= ntel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/Bds/Library/= DxePlatformBootManagerLib/BdsPlatform.c index b3b8ceba6f..bd0509ab10 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatf +++ ormPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c @@ -2,6 +2,7 @@ This file include all platform action which can be customized by IBV/OEM= . =20 Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2021, American Megatrends International LLC.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -31,6 +32,12 @@ BOOLEAN gPPRequireUIConfirm; =20 extern UINTN mBootMenuOptionNumber; =20 +EFI_STATUS +LinuxBootStart ( + VOID + ); + + GLOBAL_REMOVE_IF_UNREFERENCED USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboa= rdDevicePath =3D { { { @@ -1268,6 +1275,8 @@ PlatformBootManagerAfterConsole ( LocalBootMode =3D gBootMode; DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode)); =20 + LinuxBootStart(); + =20 // // Go the different platform policy with different boot mode // Notes: this part code can be change with the table policy diff --git = a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/= Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf b/Platf= orm/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/Bds/Lib= rary/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf index 5790743565..21ac65257c 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatf +++ ormPkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerL +++ ib.inf @@ -2,6 +2,7 @@ # Component name for module DxePlatformBootManagerLib # # Copyright (c) = 2017 - 2021, Intel Corporation. All rights reserved.
+# Copyright (c) 2021, American Megatrends International LLC.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -40,6 +41,7 @@ PerformanceLib TimerLib Tcg2PhysicalPresenceLib + LinuxBootLib =20 [Packages] MdePkg/MdePkg.dec diff --git a/Platform/Intel/Readme.md b/Platform/Intel/Readme.md index 06c5= f32b1e..a34784ccb8 100644 --- a/Platform/Intel/Readme.md +++ b/Platform/Intel/Readme.md @@ -87,6 +87,11 @@ A UEFI firmware implementation using MinPlatformPkg is c= onstructed using the fol ----------------------------------------|--------= ------------------------------------|------------------------------|-------= -------------| | Mt. Olympus | Purley = | PurleyOpenBoardPkg | BoardMtOlympus | =20 +| Machine Name | Supported Chipsets = | BoardPkg | Board Name | +----------------------------------------|---------------------------------= -----------|------------------------------|--------------------| +| TiogaPass | Purley = | PurleyOpenBoardPkg | BoardTiogaPass | + + #### Simics =20 | Machine Name | Supported Chipsets = | BoardPkg | Board Name | @@ -250,6 +255,12 @@ return back to the minimum platform caller. | | | | build set= tings, environment variables. | | | |---build_board.py: Optional bo= ard-specific pre-build, | | | build, post= -build and clean functions. + | | |------PurleyOpenBoardPkg + | | | |------BoardTiogaPass + | | | |---build_config.cfg: BoardTiog= aPass specific + | | | | build set= tings, environment variables. + | | | |---build_board.py: Optional bo= ard-specific pre-build, + | | | build, post= -build and clean functions. =20 | | | | | |------SimicsOpenBoardPkg | | | |------BoardX58Ich10 @@ -292,6 +303,18 @@ For PurleyOpenBoardPkg "bld cache-consume" Consume a cache of binary files from the specified = directory, BINARY_CACHE_PATH is empty, used "BinCache" as default path. =20 +For PurleyOpenBoardPkg (TiogaPass) +1. Open command window, go to the workspace directory, e.g. c:\Edk2Workspa= ce. +2. Type "cd edk2-platforms\Platform\Intel\PurleyOpenBoardPkg\BoardTiogaPas= s". +3. Type "GitEdk2MinBoardTiogaPass.bat" to setup GIT environment. +4. Type "bld" to build Purley BoardTiogaPass board UEFI firmware image, "b= ld release" for release build, "bld clean" to + remove intermediate files."bld cache-produce" Generate a cache of binar= y files in the specified directory, + "bld cache-consume" Consume a cache of binary files from the specified = directory, BINARY_CACHE_PATH is empty, + used "BinCache" as default path. =20 +5. Final BIOS image will be Build\PurleyOpenBoardPkg\BoardTiagoPass\DEBUG_= VS2015x86\FV\PLATFORM.fd or =20 + Build\PurleyOpenBoardPkg\BoardTiagoPass\RELEASE_VS2015x86\FV\PLATFORM.f= d, depending on bld batch script input. +6. This BIOS image needs to be merged with SPS FW =20 + ### **Known limitations** =20 **KabylakeOpenBoardPkg** @@ -307,6 +330,25 @@ For PurleyOpenBoardPkg 2. This firmware project does = not build with the GCC compiler. 3. The validated version of iASL compiler that can build MinPurley is 2018= 0629. Older versions may generate ACPI build errors. =20 +**PurleyOpenBoardPkg Tioga Pass ** +1. This firmware project has only been tested on the Tioga Pass hardware. +2. This firmware project build has only been tested using the Microsoft Vi= sual Studio 2015 build tools. +3. This firmware project does not build with the GCC compiler. +4. The validated version of iASL compiler that can build MinPurley is 2018= 0629. Older versions may generate ACPI build errors. +5. Installed and booted to UEFI Windows 2016 on M.2 NVME slot 6.=20 +Installed and booted to UEFI Windows 2019 on M.2 NVME slot and with SATA H= DD. +7. Installed and booted to UEFI RHEL 7.3 on SATA HDD 8. Installed and=20 +booted to Ubuntu 18.04 on M.2 NVME slot. +9. Verified Mellanox card detection during POST and OS 10. LINUX Boot=20 +Support (PcdLinuxBootEnable needs to be enabled) + +1. Follow directions on http://osresearch.net/Building/ to compile the hea= ds kernel and initrd for qemu-system_x86_64=20 +2. Copy the following built files=20 +(1) initrd.cpio.xz to LinuxBootPkg/LinuxBinaries/initrd.cpio.xz +(2) bzimage to LinuxBootPkg/LinuxBinaries/linux.efi + + + **SimicsOpenBoardPkg** 1. This firmware project has only been tested booting to Microsoft Windows= 10 x64 and Ubuntu 17.10 with AHCI mode. =20 -- 2.25.0.windows.1 Please consider the environment before printing this email. The information contained in this message may be confidential and proprieta= ry to American Megatrends (AMI). This communication is intended to be read= only by the individual or entity to whom it is addressed or by their desig= nee. If the reader of this message is not the intended recipient, you are o= n notice that any distribution of this message, in any form, is strictly pr= ohibited. Please promptly notify the sender by reply e-mail or by telephon= e at 770-246-8600, and then delete or destroy all copies of the transmissio= n. GitPatchExtractor 1.1