From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 43EB1CA0EE4 for ; Thu, 14 Aug 2025 01:38:42 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1umMuM-00056l-Ba; Wed, 13 Aug 2025 21:37:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1umMu9-00050j-Ro for grub-devel@gnu.org; Wed, 13 Aug 2025 21:37:22 -0400 Received: from mail-io1-xd2d.google.com ([2607:f8b0:4864:20::d2d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1umMu2-0007CQ-K1 for grub-devel@gnu.org; Wed, 13 Aug 2025 21:37:21 -0400 Received: by mail-io1-xd2d.google.com with SMTP id ca18e2360f4ac-88432cc5bddso1296139f.0 for ; Wed, 13 Aug 2025 18:37:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755135429; x=1755740229; darn=gnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jYjrOnp/98fI4shqR2qZGODzcHFvJmoqS2F7odknl14=; b=fGeEXqFTuRxA/yBbV7PslaMhO/w5F9fO3bQpqQzXpcupu6bNzN2uP3eOlWSb3ghZ5W SZ/FcCGb+Es/9Cn+SBg0/C1V9VSZniXs5LkFm5V+Lq9E+tmL5exUmV/15pipJcnwKGoT s/P1qnsY+SOlKAmo9x4GyLk/LkgrZs7uO3Cz15MZKnfMJmDPV7FFBV2v6w/YYdU/OZog /PXAG4NRrTq7KGp+t/R4pWitPx/MHWjsndWX0HbIZQOcNfAsqZIfGi9h9K/qQRDWJSee 4MI5Sf6eeGXBcln774cTHgGeFuXYVIHlaWyJjYr/Yd0kHjP7Vkpx8sFdMVNf2J9jTwIA uTeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755135429; x=1755740229; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jYjrOnp/98fI4shqR2qZGODzcHFvJmoqS2F7odknl14=; b=ozq6QUQXUkicSME53ZUhjtzEI3/ziG182rQDSX4Iem57NLjDO1GO9XCd7UVqmCzWrE 2A2yOu5wxMUL5B5tHBtYUkC5IDyDkyCo1+d9egk1/slNozMDNMXb8RyWGRaF5VYlh0nv vfDIvC+sJjCxYMamwIFQsBCOVYIzOSKclDSr12bqD9gbZfpoi1+8SkvUMatl/TV6t2ii 4gZqoHpPHejOnY4zqfIGCNpbQka0arZfZlU2M59Bw1xZx31hAnlrYz9mKU6h70JptJgp yiHX/ECO/wmkIyglHmfpmjO6J/ykLeekxIk1Cyr4TRs9zL58rNFD48u2Uo/dycymc586 7Tag== X-Gm-Message-State: AOJu0YzKBzdzKvWB/kAOuy8xwxG2B8wk7q25dTVmlOnyatK4BhxtBtSn BIJKv6JibuKLuf+xkdsrjclYclcvSbJ2ZN4rE5ZVxcK/a4qTTvfQQqfLGqCgZELT X-Gm-Gg: ASbGncu9y8I2EnfAqQ+t9+BtxXBB/GhHf0tFNPjmsw5Q4gus5CjEeJ0v3I7yflVtBmk zp3tzIQWe+Sglh7hiIPcPAhR+XY6L3GlvPBE5/LOzqbrejpUNA7qQgLdbSPvyL5C97iRy4hp7JE LdaajeyJmKiWC21VccE6r5LYFBGdFe+KgjezZirjEeDYXpWybKzGTQLpG1GDG4s9BbkHYU3ssEQ fd37Wxm29fdDBSuaQk6FNhwpeh0p5+f7H11W+o6zIdz93ykzoYbKPmIZ/SmHAwxo3YboSBGqZjs Nsg7QW9NAzutgKMljOwtxiYmKrsMZfpM3Hczb/LMUZQ+t8BFXJ2k1UEpFwWplxdksyS57YtuKi8 af8wVCeqnny0fZ5k//aYNcrO9wyJdURuL X-Google-Smtp-Source: AGHT+IHoWdWVHYfsNfkHl6TNhXloRZxAVR1T8eFqwX+ooSg0nIZDMOVQaMkmROyH5boiVh3HNDm0RA== X-Received: by 2002:a05:6602:6011:b0:881:8274:c398 with SMTP id ca18e2360f4ac-884339c2238mr70250039f.4.1755135428621; Wed, 13 Aug 2025 18:37:08 -0700 (PDT) Received: from kf-m2g5.. ([2607:fb91:1183:972:ee53:76c5:e875:9619]) by smtp.gmail.com with ESMTPSA id ca18e2360f4ac-883f198db02sm467297239f.16.2025.08.13.18.37.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Aug 2025 18:37:08 -0700 (PDT) From: arraybolt3@gmail.com To: grub-devel@gnu.org, xen-devel@lists.xenproject.org Cc: Aaron Rainbolt Subject: [PATCH v5 3/3] kern/xen: Add Xen command line parsing Date: Wed, 13 Aug 2025 20:36:45 -0500 Message-ID: <20250814013645.2488043-4-arraybolt3@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250814013645.2488043-1-arraybolt3@gmail.com> References: <20250814013645.2488043-1-arraybolt3@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::d2d; envelope-from=arraybolt3@gmail.com; helo=mail-io1-xd2d.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: The development of GNU GRUB Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: grub-devel-bounces+grub-devel=archiver.kernel.org@gnu.org Sender: grub-devel-bounces+grub-devel=archiver.kernel.org@gnu.org RnJvbTogQWFyb24gUmFpbmJvbHQgPGFycmF5Ym9sdDNAZ21haWwuY29tPgoKWGVuIHRyYWRpdGlv bmFsbHkgYWxsb3dzIGN1c3RvbWl6aW5nIGd1ZXN0IGJlaGF2aW9yIGJ5IHBhc3NpbmcgYXJndW1l bnRzCnRvIHRoZSBWTSBrZXJuZWwgdmlhIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBUaGlzIGlz IG5vIGxvbmdlciBwb3NzaWJsZQp3aGVuIHVzaW5nIEdSVUIgd2l0aCBYZW4sIGFzIHRoZSBrZXJu ZWwgY29tbWFuZCBsaW5lIGlzIGRlY2lkZWQgYnkgdGhlCkdSVUIgY29uZmlndXJhdGlvbiBmaWxl IHdpdGhpbiB0aGUgZ3Vlc3QsIG5vdCBkYXRhIHBhc3NlZCB0byB0aGUgZ3Vlc3QKYnkgWGVuLgoK VG8gd29yayBhcm91bmQgdGhpcyBsaW1pdGF0aW9uLCBlbmFibGUgR1JVQiB0byBwYXJzZSBhIGNv bW1hbmQgbGluZQpwYXNzZWQgdG8gaXQgYnkgWGVuLCBhbmQgZXhwb3NlIGRhdGEgZnJvbSB0aGUg Y29tbWFuZCBsaW5lIHRvIHRoZSBHUlVCCmNvbmZpZ3VyYXRpb24gYXMgZW52aXJvbm1lbnQgdmFy aWFibGVzLiBUaGVzZSB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgaW4KdGhlIEdSVUIgY29uZmlndXJh dGlvbiBmb3IgYW55IGRlc2lyZWQgcHVycG9zZSwgc3VjaCBhcyBleHRlbmRpbmcgdGhlCmtlcm5l bCBjb21tYW5kIGxpbmUgcGFzc2VkIHRvIHRoZSBndWVzdC4gVGhlIGNvbW1hbmQgbGluZSBmb3Jt YXQgaXMKaW5zcGlyZWQgYnkgdGhlIExpbnV4IGtlcm5lbCdzIGNvbW1hbmQgbGluZSBmb3JtYXQu CgpUbyByZWR1Y2UgdGhlIHJpc2sgb2YgbWlzdXNlLCBhYnVzZSwgb3IgYWNjaWRlbnRzIGluIHBy b2R1Y3Rpb24sIHRoZQpjb21tYW5kIGxpbmUgd2lsbCBvbmx5IGJlIHBhcnNlZCBpZiBpdCBjb25z aXN0cyBlbnRpcmVseSBvZiA3LWJpdCBBU0NJSQpjaGFyYWN0ZXJzLCBvbmx5IGFscGhhYmV0aWNh bCBjaGFyYWN0ZXJzIGFuZCB1bmRlcnNjb3JlcyBhcmUgcGVybWl0dGVkCmluIHZhcmlhYmxlIG5h bWVzLCBhbmQgYWxsIHZhcmlhYmxlIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCB0aGUgc3RyaW5nCiJ4 ZW5fZ3J1Yl9lbnZfIi4gVGhpcyBhbHNvIGFsbG93cyByb29tIGZvciBleHBhbmRpbmcgdGhlIGNv bW1hbmQgbGluZQphcmd1bWVudHMgYWNjZXB0ZWQgYnkgR1JVQiBpbiB0aGUgZnV0dXJlLCBzaG91 bGQgb3RoZXIgYXJndW1lbnRzIGVuZCB1cApiZWNvbWluZyBkZXNpcmFibGUgaW4gdGhlIGZ1dHVy ZS4KClNpZ25lZC1vZmYtYnk6IEFhcm9uIFJhaW5ib2x0IDxhcnJheWJvbHQzQGdtYWlsLmNvbT4K LS0tCiBkb2NzL2dydWIudGV4aSAgICAgICAgICAgICAgICB8ICA1MiArKysrKwogZ3J1Yi1jb3Jl L01ha2VmaWxlLmNvcmUuZGVmICAgfCAgIDIgKwogZ3J1Yi1jb3JlL2tlcm4vaTM4Ni94ZW4vcHZo LmMgfCAgIDQgKwogZ3J1Yi1jb3JlL2tlcm4veGVuL2NtZGxpbmUuYyAgfCAzNjEgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwogZ3J1Yi1jb3JlL2tlcm4veGVuL2luaXQuYyAgICAg fCAgIDIgKwogaW5jbHVkZS9ncnViL3hlbi5oICAgICAgICAgICAgfCAgIDIgKwogNiBmaWxlcyBj aGFuZ2VkLCA0MjMgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGdydWItY29yZS9r ZXJuL3hlbi9jbWRsaW5lLmMKCmRpZmYgLS1naXQgYS9kb2NzL2dydWIudGV4aSBiL2RvY3MvZ3J1 Yi50ZXhpCmluZGV4IDM0YjM0ODQuLmNkNGU1MzkgMTAwNjQ0Ci0tLSBhL2RvY3MvZ3J1Yi50ZXhp CisrKyBiL2RvY3MvZ3J1Yi50ZXhpCkBAIC0zMjcxLDYgKzMyNzEsNyBAQCBHUlVCLiAgT3RoZXJz IG1heSBiZSB1c2VkIGZyZWVseSBpbiBHUlVCIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiBAbWVudQog KiBTcGVjaWFsIGVudmlyb25tZW50IHZhcmlhYmxlczo6CiAqIEVudmlyb25tZW50IGJsb2NrOjoK KyogUGFzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhyb3VnaCBYZW46OgogQGVuZCBtZW51 CiAKIApAQCAtMzg3MSw2ICszODcyLDU3IEBAIHVzaW5nIEJJT1Mgb3IgRUZJIGZ1bmN0aW9ucyAo bm8gQVRBLCBVU0Igb3IgSUVFRTEyNzUpLgogQGNvbW1hbmR7Z3J1Yi1ta2NvbmZpZ30gdXNlcyB0 aGlzIGZhY2lsaXR5IHRvIGltcGxlbWVudAogQHNhbXB7R1JVQl9TQVZFREVGQVVMVH0gKEBweHJl ZntTaW1wbGUgY29uZmlndXJhdGlvbn0pLgogCitAbm9kZSBQYXNzaW5nIGVudmlyb25tZW50IHZh cmlhYmxlcyB0aHJvdWdoIFhlbgorQHNlY3Rpb24gUGFzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJs ZXMgdGhyb3VnaCBYZW4KKworSWYgeW91IGFyZSB1c2luZyBhIEdSVUIgaW1hZ2UgYXMgdGhlIGtl cm5lbCBmb3IgYSBQViBvciBQVkggWGVuIHZpcnR1YWwKK21hY2hpbmUsIHlvdSBjYW4gcGFzcyBl bnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBYZW4ncyBkb20wIHRvIHRoZSBWTSB0aHJvdWdoCit0 aGUgWGVuLXByb3ZpZGVkIGtlcm5lbCBjb21tYW5kIGxpbmUuIFdoZW4gY29tYmluZWQgd2l0aCBh IHByb3Blcmx5IGNvbmZpZ3VyZWQKK2d1ZXN0LCB0aGlzIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6 ZSB0aGUgZ3Vlc3QncyBiZWhhdmlvciBvbiBib290dXAgdmlhIHRoZQorVk0ncyBYZW4gY29uZmln dXJhdGlvbiBmaWxlLgorCitHUlVCIHdpbGwgcGFyc2UgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUg cGFzc2VkIHRvIGl0IGJ5IFhlbiBkdXJpbmcgYm9vdHVwLgorVGhlIGNvbW1hbmQgbGluZSB3aWxs IGJlIHNwbGl0IGludG8gc3BhY2UtZGVsaW1pdGVkIHdvcmRzLiBTaW5nbGUgYW5kCitkb3VibGUg cXVvdGVzIG1heSBiZSB1c2VkIHRvIHF1b3RlIHdvcmRzIG9yIHBvcnRpb25zIG9mIHdvcmRzIHRo YXQgY29udGFpbgorc3BhY2VzLiBTaW5nbGUgcXVvdGVzIHdpbGwgYmUgY29uc2lkZXJlZCBwYXJ0 IG9mIGEgd29yZCBpZiBpbnNpZGUgZG91YmxlCitxdW90ZXMsIGFuZCB2aWNlIHZlcnNhLiBBcmJp dHJhcnkgY2hhcmFjdGVycyBtYXkgYmUgYmFja3NsYXNoLWVzY2FwZWQgdG8gbWFrZQordGhlbSBh IGxpdGVyYWwgY29tcG9uZW50IG9mIGEgd29yZCByYXRoZXIgdGhhbiBiZWluZyBwYXJzZWQgYXMg cXVvdGVzIG9yIHdvcmQKK3NlcGFyYXRvcnMuIFRoZSBjb21tYW5kIGxpbmUgbXVzdCBjb25zaXN0 IGVudGlyZWx5IG9mIHByaW50YWJsZSA3LWJpdCBBU0NJSQorY2hhcmFjdGVycyBhbmQgc3BhY2Vz LiBJZiBhIG5vbi1wcmludGluZyBBU0NJSSBjaGFyYWN0ZXIgaXMgZm91bmQgYW55d2hlcmUgaW4K K3RoZSBjb21tYW5kIGxpbmUsIHRoZSBlbnRpcmUgY29tbWFuZCBsaW5lIHdpbGwgYmUgaWdub3Jl ZCBieSBHUlVCLiAoVGhpcworc3BsaXR0ZXIgYWxnb3JpdGhtIGlzIG1lYW50IHRvIGJlaGF2ZSBz b21ld2hhdCBsaWtlIEJhc2gncyB3b3JkIHNwbGl0dGluZy4pCisKK0VhY2ggd29yZCBzaG91bGQg YmUgYSB2YXJpYWJsZSBhc3NpZ25tZW50IGluIHRoZSBmb3JtYXQgYGB2YXJpYWJsZScnIG9yCitg YHZhcmlhYmxlPXZhbHVlJycuIFZhcmlhYmxlIG5hbWVzIG11c3QgY29udGFpbiBvbmx5IHRoZSBj aGFyYWN0ZXJzIEEtWiwgYS16LAorYW5kIHVuZGVyc2NvcmUgKGBgXycnKS4gVmFyaWFibGUgbmFt ZXMgbXVzdCBiZWdpbiB3aXRoIHRoZSBzdHJpbmcKK2BgeGVuX2dydWJfZW52XycnLiBWYXJpYWJs ZSB2YWx1ZXMgY2FuIGNvbnRhaW4gYXJiaXRyYXJ5IHByaW50YWJsZSA3LWJpdAorQVNDSUkgY2hh cmFjdGVycyBhbmQgc3BhY2UuIElmIGFueSB2YXJpYWJsZSBjb250YWlucyBhbiBpbGxlZ2FsIG5h bWUsIHRoYXQKK3ZhcmlhYmxlIHdpbGwgYmUgaWdub3JlZC4KKworSWYgYSB2YXJpYWJsZSBuYW1l IGFuZCB2YWx1ZSBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZSB2YXJpYWJsZSB3aWxsIGJlIHNldCB0 bwordGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgb25seSBhIHZhcmlhYmxlIG5hbWUgaXMgc3BlY2lm aWVkLCB0aGUgdmFyaWFibGUncwordmFsdWUgd2lsbCBiZSBzZXQgdG8gYGAxJycuCisKK1RoZSBm b2xsb3dpbmcgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoaXMgZnVuY3Rpb25h bGl0eSB0byBhcHBlbmQKK2FyYml0cmFyeSB2YXJpYWJsZXMgdG8gYSBndWVzdCdzIGtlcm5lbCBj b21tYW5kIGxpbmU6CisKK0BleGFtcGxlCisjIEluIHRoZSBYZW4gY29uZmlndXJhdGlvbiBmaWxl IGZvciB0aGUgZ3Vlc3QKK25hbWUgPSAibGludXhfdm0iCit0eXBlID0gInB2aCIKK2tlcm5lbCA9 ICIvcGF0aC90by9ncnViLWkzODYteGVuX3B2aC5iaW4iCitleHRyYSA9ICJ4ZW5fZ3J1Yl9lbnZf bGludXhfYXBwZW5kPSdsb2dsZXZlbD0zJyIKK21lbW9yeSA9IDEwMjQKK2Rpc2sgPSBbICJmaWxl Oi9zcnYvdm1zL2xpbnV4X3ZtLmltZyxzZGEsdyIgXQorCisjIEluIHRoZSBndWVzdCdzIEdSVUIg Y29uZmlndXJhdGlvbiBmaWxlCittZW51ZW50cnkgIkxpbnV4IFZNIHdpdGggZG9tMC1zcGVjaWZp ZWQga2VybmVsIHBhcmFtZXRlcnMiIEB7CisgICAgc2VhcmNoIC0tc2V0PXJvb3QgLS1sYWJlbCBs aW51eF92bSAtLWhpbnQgaGQwLG1zZG9zMQorICAgIGxpbnV4IC9ib290L3ZtbGludXogcm9vdD1M QUJFTD1saW51eF92bSAkQHt4ZW5fZ3J1Yl9lbnZfbGludXhfYXBwZW5kQH0KKyAgICBpbml0cmQg L2Jvb3QvaW5pdHJkLmltZworQH0KK0BlbmQgZXhhbXBsZQorCiBAbm9kZSBNb2R1bGVzCiBAY2hh cHRlciBNb2R1bGVzCiAKZGlmZiAtLWdpdCBhL2dydWItY29yZS9NYWtlZmlsZS5jb3JlLmRlZiBi L2dydWItY29yZS9NYWtlZmlsZS5jb3JlLmRlZgppbmRleCBiM2Y3MTE5Li5kZjBmMjY2IDEwMDY0 NAotLS0gYS9ncnViLWNvcmUvTWFrZWZpbGUuY29yZS5kZWYKKysrIGIvZ3J1Yi1jb3JlL01ha2Vm aWxlLmNvcmUuZGVmCkBAIC0yNDgsNiArMjQ4LDcgQEAga2VybmVsID0gewogICB4ZW4gPSB0ZXJt L3hlbi9jb25zb2xlLmM7CiAgIHhlbiA9IGRpc2sveGVuL3hlbmRpc2suYzsKICAgeGVuID0gY29t bWFuZHMvYm9vdC5jOworICB4ZW4gPSBrZXJuL3hlbi9jbWRsaW5lLmM7CiAKICAgaTM4Nl94ZW5f cHZoID0gY29tbWFuZHMvYm9vdC5jOwogICBpMzg2X3hlbl9wdmggPSBkaXNrL3hlbi94ZW5kaXNr LmM7CkBAIC0yNTUsNiArMjU2LDcgQEAga2VybmVsID0gewogICBpMzg2X3hlbl9wdmggPSBrZXJu L2kzODYveGVuL3RzYy5jOwogICBpMzg2X3hlbl9wdmggPSBrZXJuL2kzODYveGVuL3B2aC5jOwog ICBpMzg2X3hlbl9wdmggPSBrZXJuL3hlbi9pbml0LmM7CisgIGkzODZfeGVuX3B2aCA9IGtlcm4v eGVuL2NtZGxpbmUuYzsKICAgaTM4Nl94ZW5fcHZoID0gdGVybS94ZW4vY29uc29sZS5jOwogCiAg IGlhNjRfZWZpID0ga2Vybi9pYTY0L2VmaS9zdGFydHVwLlM7CmRpZmYgLS1naXQgYS9ncnViLWNv cmUva2Vybi9pMzg2L3hlbi9wdmguYyBiL2dydWItY29yZS9rZXJuL2kzODYveGVuL3B2aC5jCmlu ZGV4IDkxZmJjYTguLjUyMDIwYjcgMTAwNjQ0Ci0tLSBhL2dydWItY29yZS9rZXJuL2kzODYveGVu L3B2aC5jCisrKyBiL2dydWItY29yZS9rZXJuL2kzODYveGVuL3B2aC5jCkBAIC0zNTIsNiArMzUy LDEwIEBAIGdydWJfeGVuX3NldHVwX3B2aCAodm9pZCkKICAgZ3J1Yl94ZW5fbW1faW5pdF9yZWdp b25zICgpOwogCiAgIGdydWJfcnNkcF9hZGRyID0gcHZoX3N0YXJ0X2luZm8tPnJzZHBfcGFkZHI7 CisKKyAgZ3J1Yl9zdHJuY3B5ICgoY2hhciAqKSBncnViX3hlbl9zdGFydF9wYWdlX2FkZHItPmNt ZF9saW5lLAorCQkoY29uc3QgY2hhciAqKSBwdmhfc3RhcnRfaW5mby0+Y21kbGluZV9wYWRkciwK KwkJR1JVQl9YRU5fTUFYX0dVRVNUX0NNRExJTkUpOwogfQogCiBncnViX2Vycl90CmRpZmYgLS1n aXQgYS9ncnViLWNvcmUva2Vybi94ZW4vY21kbGluZS5jIGIvZ3J1Yi1jb3JlL2tlcm4veGVuL2Nt ZGxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDIxYmY4Ci0tLSAv ZGV2L251bGwKKysrIGIvZ3J1Yi1jb3JlL2tlcm4veGVuL2NtZGxpbmUuYwpAQCAtMCwwICsxLDM2 MSBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29w eXJpZ2h0IChDKSAyMDI1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAg R1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBl aXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZQorICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcv bGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8Z3J1Yi9lbnYuaD4KKyNpbmNsdWRlIDxncnVi L21pc2MuaD4KKyNpbmNsdWRlIDxncnViL21tLmg+CisjaW5jbHVkZSA8Z3J1Yi94ZW4uaD4KKyNp bmNsdWRlIDxncnViL2Vyci5oPgorCitlbnVtIHNwbGl0dGVyX3N0YXRlCit7CisgIFNQTElUVEVS X05PUk1BTCA9IDB4MCwKKyAgU1BMSVRURVJfSElUX0JBQ0tTTEFTSCA9IDB4MSwKKyAgU1BMSVRU RVJfSU5fU0lOR0xFX1FVT1RFUyA9IDB4MiwKKyAgU1BMSVRURVJfSU5fRE9VQkxFX1FVT1RFUyA9 IDB4NCwKK307Cit0eXBlZGVmIGVudW0gc3BsaXR0ZXJfc3RhdGUgc3BsaXR0ZXJfc3RhdGVfdDsK KworLyoKKyAqIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGN1cnJlbnRfd29yZCBidWZmZXIuIFRo ZSBidWZmZXIgbWF5IGJlIHJlc2l6ZWQgYXMKKyAqIG5lZWRlZC4KKyAqLworI2RlZmluZSBQQVJT RVJfQkFTRV9XT1JEX1NJWkUgMzIKKworc3RydWN0IHBhcnNlcl9zdGF0ZQoreworICBjaGFyICoq d29yZHM7CisgIGdydWJfc2l6ZV90IHdvcmRzX2NvdW50OworICBjaGFyICpjdXJyZW50X3dvcmQ7 CisgIGdydWJfc2l6ZV90IGN1cnJlbnRfd29yZF9sZW47CisgIGdydWJfc2l6ZV90IGN1cnJlbnRf d29yZF9wb3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcGFyc2VyX3N0YXRlIHBhcnNlcl9zdGF0ZV90 OworCitzdGF0aWMgZ3J1Yl9lcnJfdAorYXBwZW5kX2NoYXJfdG9fd29yZCAocGFyc2VyX3N0YXRl X3QgKnBzLCBjaGFyIGMsIGJvb2wgYWxsb3dfbnVsbCkKK3sKKyAgLyoKKyAgICogV2UgYmFuIGFu eSBjaGFycyB0aGF0IGFyZSBub3QgaW4gdGhlIEFTQ0lJIHByaW50YWJsZSByYW5nZS4gSWYKKyAg ICogYWxsb3dfbnVsbCA9PSB0cnVlLCB3ZSBtYWtlIGFuIGV4Y2VwdGlvbiBmb3IgTlVMLiAoVGhp cyBpcyBuZWVkZWQgc28gdGhhdAorICAgKiBhcHBlbmRfd29yZF90b19saXN0IGNhbiBhZGQgYSBO VUwgdGVybWluYXRvciB0byB0aGUgd29yZCkuCisgICAqLworICBpZiAoIWdydWJfaXNwcmludCAo YykgJiYgYWxsb3dfbnVsbCA9PSBmYWxzZSkKKyAgICByZXR1cm4gR1JVQl9FUlJfQkFEX0FSR1VN RU5UOworICBlbHNlIGlmIChhbGxvd19udWxsID09IHRydWUgJiYgYyAhPSAnXDAnKQorICAgIHJl dHVybiBHUlVCX0VSUl9CQURfQVJHVU1FTlQ7CisKKyAgaWYgKHBzLT5jdXJyZW50X3dvcmRfcG9z ID09IHBzLT5jdXJyZW50X3dvcmRfbGVuKQorICAgIHsKKyAgICAgIHBzLT5jdXJyZW50X3dvcmQg PSBncnViX3JlYWxsb2MgKHBzLT5jdXJyZW50X3dvcmQsIHBzLT5jdXJyZW50X3dvcmRfbGVuICo9 IDIpOworICAgICAgaWYgKHBzLT5jdXJyZW50X3dvcmQgPT0gTlVMTCkKKyAgICAgICAgeworICAg ICAgICAgIHBzLT5jdXJyZW50X3dvcmRfbGVuIC89IDI7CisgICAgICAgICAgcmV0dXJuIGdydWJf ZXJybm87CisgICAgICAgIH0KKyAgICB9CisKKyAgcHMtPmN1cnJlbnRfd29yZFtwcy0+Y3VycmVu dF93b3JkX3BvcysrXSA9IGM7CisgIHJldHVybiBHUlVCX0VSUl9OT05FOworfQorCitzdGF0aWMg Z3J1Yl9lcnJfdAorYXBwZW5kX3dvcmRfdG9fbGlzdCAocGFyc2VyX3N0YXRlX3QgKnBzKQorewor ICAvKiBOby1vcCBvbiBlbXB0eSB3b3Jkcy4gKi8KKyAgaWYgKHBzLT5jdXJyZW50X3dvcmRfcG9z ID09IDApCisgICAgcmV0dXJuIEdSVUJfRVJSX05PTkU7CisKKyAgaWYgKGFwcGVuZF9jaGFyX3Rv X3dvcmQgKHBzLCAnXDAnLCB0cnVlKSAhPSBHUlVCX0VSUl9OT05FKQorICAgIGdydWJfZmF0YWwg KCJjb3VsZG4ndCBhcHBlbmQgTlVMIHRlcm1pbmF0b3IgdG8gd29yZCBkdXJpbmcgWGVuIGNtZGxp bmUgcGFyc2luZyIpOworCisgIHBzLT5jdXJyZW50X3dvcmRfbGVuID0gZ3J1Yl9zdHJsZW4gKHBz LT5jdXJyZW50X3dvcmQpICsgMTsKKyAgcHMtPmN1cnJlbnRfd29yZCA9IGdydWJfcmVhbGxvYyAo cHMtPmN1cnJlbnRfd29yZCwgcHMtPmN1cnJlbnRfd29yZF9sZW4pOworICBpZiAocHMtPmN1cnJl bnRfd29yZCA9PSBOVUxMKQorICAgIHJldHVybiBncnViX2Vycm5vOworICBwcy0+d29yZHMgPSBn cnViX3JlYWxsb2MgKHBzLT53b3JkcywgKytwcy0+d29yZHNfY291bnQgKiBzaXplb2YgKGNoYXIg KikpOworICBpZiAocHMtPndvcmRzID09IE5VTEwpCisgICAgcmV0dXJuIGdydWJfZXJybm87Cisg IHBzLT53b3Jkc1twcy0+d29yZHNfY291bnQgLSAxXSA9IHBzLT5jdXJyZW50X3dvcmQ7CisKKyAg cHMtPmN1cnJlbnRfd29yZF9sZW4gPSBQQVJTRVJfQkFTRV9XT1JEX1NJWkU7CisgIHBzLT5jdXJy ZW50X3dvcmRfcG9zID0gMDsKKyAgcHMtPmN1cnJlbnRfd29yZCA9IGdydWJfbWFsbG9jIChwcy0+ Y3VycmVudF93b3JkX2xlbik7CisgIGlmIChwcy0+Y3VycmVudF93b3JkID09IE5VTEwpCisgICAg cmV0dXJuIGdydWJfZXJybm87CisKKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cit9CisKK3N0YXRp YyBib29sCitpc19rZXlfc2FmZSAoY2hhciAqa2V5LCBncnViX3NpemVfdCBsZW4pCit7CisgIGdy dWJfc2l6ZV90IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIGlmICghZ3J1 Yl9pc2FscGhhIChrZXlbaV0pICYmIGtleVtpXSAhPSAnXycpCisgICAgICByZXR1cm4gZmFsc2U7 CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQKK2dydWJfcGFyc2VfeGVuX2NtZGxpbmUgKHZv aWQpCit7CisgIHBhcnNlcl9zdGF0ZV90IHBzID0gezB9OworICBzcGxpdHRlcl9zdGF0ZV90IHNz ID0gU1BMSVRURVJfTk9STUFMOworCisgIGNvbnN0IGNoYXIgKmNtZGxpbmUgPSAoY29uc3QgY2hh ciAqKSBncnViX3hlbl9zdGFydF9wYWdlX2FkZHItPmNtZF9saW5lOworICBncnViX3NpemVfdCBj bWRsaW5lX2xlbjsKKyAgYm9vbCBjbWRsaW5lX3ZhbGlkID0gZmFsc2U7CisgIGNoYXIgKipwYXJh bV9rZXlzID0gTlVMTDsKKyAgY2hhciAqKnBhcmFtX3ZhbHMgPSBOVUxMOworICBncnViX3NpemVf dCBwYXJhbV9kaWN0X2xlbiA9IDA7CisgIGdydWJfc2l6ZV90IHBhcmFtX2RpY3RfcG9zID0gMDsK KyAgY2hhciBjdXJyZW50X2NoYXIgPSAnXDAnOworICBncnViX3NpemVfdCBpID0gMDsKKworICAv KgorICAgKiBUaGUgZm9sbG93aW5nIGFsZ29yaXRobSBpcyB1c2VkIHRvIHBhcnNlIHRoZSBYZW4g Y29tbWFuZCBsaW5lOgorICAgKgorICAgKiAtIFRoZSBjb21tYW5kIGxpbmUgaXMgc3BsaXQgaW50 byBzcGFjZS1zZXBhcmF0ZWQgd29yZHMuCisgICAqICAgLSBTaW5nbGUgYW5kIGRvdWJsZSBxdW90 ZXMgbWF5IGJlIHVzZWQgdG8gc3VwcHJlc3MgdGhlIHNwbGl0dGluZworICAgKiAgICAgYmVoYXZp b3Igb2Ygc3BhY2VzLgorICAgKiAgIC0gRG91YmxlIHF1b3RlcyBhcmUgYXBwZW5kZWQgdG8gdGhl IGN1cnJlbnQgd29yZCB2ZXJiYXRpbSBpZiB0aGV5CisgICAqICAgICBhcHBlYXIgd2l0aGluIGEg c2luZ2xlLXF1b3RlZCBzdHJpbmcgcG9ydGlvbiwgYW5kIHZpY2UgdmVyc2EuCisgICAqICAgLSBC YWNrc2xhc2hlcyBtYXkgYmUgdXNlZCB0byBjYXVzZSB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUK KyAgICogICAgIGFwcGVuZGVkIHRvIHRoZSBjdXJyZW50IHdvcmQgdmVyYmF0aW0uIFRoaXMgaXMg b25seSB1c2VmdWwgd2hlbgorICAgKiAgICAgdXNlZCB0byBlc2NhcGUgcXVvdGVzLCBzcGFjZXMs IGFuZCBiYWNrc2xhc2hlcywgYnV0IGZvciBzaW1wbGljaXR5CisgICAqICAgICB3ZSBhbGxvdyBi YWNrc2xhc2gtZXNjYXBpbmcgYW55dGhpbmcuCisgICAqIC0gQWZ0ZXIgc3BsaXR0aW5nIHRoZSBj b21tYW5kIGxpbmUgaW50byB3b3JkcywgZWFjaCB3b3JkIGlzIGNoZWNrZWQgdG8KKyAgICogICBz ZWUgaWYgaXQgY29udGFpbnMgYW4gZXF1YWxzIHNpZ24uCisgICAqICAgLSBJZiBpdCBkb2VzLCBp dCBpcyBzcGxpdCBvbiB0aGUgZXF1YWxzIHNpZ24gaW50byBhIGtleS12YWx1ZSBwYWlyLiBUaGUK KyAgICogICAgIGtleSBpcyB0aGVuIHRyZWF0ZWQgYXMgYW4gdmFyaWFibGUgbmFtZSwgYW5kIHRo ZSB2YWx1ZSBpcyB0cmVhdGVkIGFzCisgICAqICAgICB0aGUgdmFyaWFibGUncyB2YWx1ZS4KKyAg ICogICAtIElmIGl0IGRvZXMgbm90LCB0aGUgZW50aXJlIHdvcmQgaXMgdHJlYXRlZCBhcyBhIHZh cmlhYmxlIG5hbWUuIFRoZQorICAgKiAgICAgdmFyaWFibGUncyB2YWx1ZSBpcyBpbXBsaWNpdGx5 IGNvbnNpZGVyZWQgdG8gYmUgYDFgLgorICAgKiAtIEFsbCB2YXJpYWJsZXMgZGV0ZWN0ZWQgb24g dGhlIGNvbW1hbmQgbGluZSBhcmUgY2hlY2tlZCB0byBzZWUgaWYgdGhlaXIKKyAgICogICBuYW1l cyBiZWdpbiB3aXRoIHRoZSBzdHJpbmcgYHhlbl9ncnViX2Vudl9gLiBWYXJpYWJsZXMgdGhhdCBk byBub3QgcGFzcworICAgKiAgIHRoaXMgY2hlY2sgYXJlIGRpc2NhcmRlZCwgdmFyaWFibGVzIHRo YXQgZG8gcGFzcyB0aGlzIGNoZWNrIGFyZQorICAgKiAgIGV4cG9ydGVkIHNvIHRoZXkgYXJlIGF2 YWlsYWJsZSB0byB0aGUgR1JVQiBjb25maWd1cmF0aW9uLgorICAgKgorICAgKiBUaGlzIGJlaGF2 aW9yIGlzIGludGVuZGVkIHRvIHNvbWV3aGF0IG1pbWljIHRoZSBzcGxpdHRlciBiZWhhdmlvciBp biBCYXNoCisgICAqIGFuZCBpbiBHUlVCJ3MgY29uZmlnIGZpbGUgcGFyc2VyLgorICAgKi8KKwor ICBwcy5jdXJyZW50X3dvcmRfbGVuID0gUEFSU0VSX0JBU0VfV09SRF9TSVpFOworICBwcy5jdXJy ZW50X3dvcmQgPSBncnViX21hbGxvYyAocHMuY3VycmVudF93b3JkX2xlbik7CisgIGlmIChwcy5j dXJyZW50X3dvcmQgPT0gTlVMTCkKKyAgICBnb3RvIGNsZWFudXBfbWFpbjsKKworICBmb3IgKGkg PSAwOyBpIDwgR1JVQl9YRU5fTUFYX0dVRVNUX0NNRExJTkU7IGkrKykKKyAgICB7CisgICAgICBp ZiAoY21kbGluZVtpXSA9PSAnXDAnKQorICAgICAgICB7CisgICAgICAgICAgY21kbGluZV92YWxp ZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGNt ZGxpbmVfdmFsaWQgPT0gZmFsc2UpCisgICAgeworICAgICAgZ3J1Yl9lcnJvciAoR1JVQl9FUlJf QkFEX0FSR1VNRU5ULAorCQkgICJjb21tYW5kIGxpbmUgZnJvbSBYZW4gaXMgbm90IE5VTC10ZXJt aW5hdGVkIik7CisgICAgICBncnViX3ByaW50X2Vycm9yICgpOworICAgICAgZ290byBjbGVhbnVw X21haW47CisgICAgfQorCisgIGNtZGxpbmVfbGVuID0gZ3J1Yl9zdHJsZW4gKGNtZGxpbmUpOwor ICBmb3IgKGkgPSAwOyBpIDwgY21kbGluZV9sZW47IGkrKykKKyAgICB7CisgICAgICBjdXJyZW50 X2NoYXIgPSBjbWRsaW5lW2ldOworCisgICAgICAvKgorICAgICAgICogSWYgdGhlIHByZXZpb3Vz IGNoYXJhY3RlciB3YXMgYSBiYWNrc2xhc2gsIGFwcGVuZCB0aGUgY3VycmVudAorICAgICAgICog Y2hhcmFjdGVyIHRvIHRoZSB3b3JkIHZlcmJhdGltCisgICAgICAgKi8KKyAgICAgIGlmIChzcyAm IFNQTElUVEVSX0hJVF9CQUNLU0xBU0gpCisgICAgICAgIHsKKyAgICAgICAgICBzcyAmPSB+U1BM SVRURVJfSElUX0JBQ0tTTEFTSDsKKyAgICAgICAgICBpZiAoYXBwZW5kX2NoYXJfdG9fd29yZCAo JnBzLCBjdXJyZW50X2NoYXIsIGZhbHNlKSAhPSBHUlVCX0VSUl9OT05FKQorICAgICAgICAgICAg Z290byBjbGVhbnVwX21haW47CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAg ICAgc3dpdGNoIChjdXJyZW50X2NoYXIpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnXFwnOgor ICAgICAgICAgIC8qIEJhY2tzbGFzaGVzIGVzY2FwZSBhcmJpdHJhcnkgY2hhcmFjdGVycy4gKi8K KyAgICAgICAgICBzcyB8PSBTUExJVFRFUl9ISVRfQkFDS1NMQVNIOworICAgICAgICAgIGJyZWFr OworCisgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIFNpbmds ZSBxdW90ZXMgc3VwcHJlc3Mgd29yZCBzcGxpdHRpbmcgYW5kIGRvdWJsZSBxdW90aW5nIHVudGls CisgICAgICAgICAgICogdGhlIG5leHQgc2luZ2xlIHF1b3RlIGlzIGVuY291bnRlcmVkLgorICAg ICAgICAgICAqLworICAgICAgICAgIGlmIChzcyAmIFNQTElUVEVSX0lOX0RPVUJMRV9RVU9URVMp CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChhcHBlbmRfY2hhcl90b193b3JkICgm cHMsIGN1cnJlbnRfY2hhciwgZmFsc2UpICE9IEdSVUJfRVJSX05PTkUpCisgICAgICAgICAgICAg ICAgZ290byBjbGVhbnVwX21haW47CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg fQorCisgICAgICAgICAgc3MgXj0gU1BMSVRURVJfSU5fU0lOR0xFX1FVT1RFUzsKKyAgICAgICAg ICBicmVhazsKKworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAvKgorICAgICAgICAgICAq IERvdWJsZSBxdW90ZXMgc3VwcHJlc3Mgd29yZCBzcGxpdHRpbmcgYW5kIHNpbmdsZSBxdW90aW5n IHVudGlsCisgICAgICAgICAgICogdGhlIG5leHQgZG91YmxlIHF1b3RlIGlzIGVuY291bnRlcmVk LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChzcyAmIFNQTElUVEVSX0lOX1NJTkdMRV9R VU9URVMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChhcHBlbmRfY2hhcl90b193 b3JkICgmcHMsIGN1cnJlbnRfY2hhciwgZmFsc2UpICE9IEdSVUJfRVJSX05PTkUpCisgICAgICAg ICAgICAgICAgZ290byBjbGVhbnVwX21haW47CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAg ICAgICAgfQorCisgICAgICAgICAgc3MgXj0gU1BMSVRURVJfSU5fRE9VQkxFX1FVT1RFUzsKKyAg ICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAvKiBTcGFjZXMg c2VwYXJhdGUgd29yZHMgaW4gdGhlIGNvbW1hbmQgbGluZSBmcm9tIGVhY2ggb3RoZXIuICovCisg ICAgICAgICAgaWYgKHNzICYgU1BMSVRURVJfSU5fU0lOR0xFX1FVT1RFUyB8fAorICAgICAgICAg ICAgICBzcyAmIFNQTElUVEVSX0lOX0RPVUJMRV9RVU9URVMpCisgICAgICAgICAgICB7CisgICAg ICAgICAgICAgIGlmIChhcHBlbmRfY2hhcl90b193b3JkICgmcHMsIGN1cnJlbnRfY2hhciwgZmFs c2UpICE9IEdSVUJfRVJSX05PTkUpCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwX21haW47 CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGFw cGVuZF93b3JkX3RvX2xpc3QgKCZwcykgIT0gR1JVQl9FUlJfTk9ORSkKKyAgICAgICAgICAgIGdv dG8gY2xlYW51cF9tYWluOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6Cisg ICAgICAgICAgaWYgKGFwcGVuZF9jaGFyX3RvX3dvcmQgKCZwcywgY3VycmVudF9jaGFyLCBmYWxz ZSkgIT0gR1JVQl9FUlJfTk9ORSkKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cF9tYWluOworICAg ICAgICB9CisgICAgfQorCisgIGlmIChhcHBlbmRfd29yZF90b19saXN0ICgmcHMpICE9IEdSVUJf RVJSX05PTkUpCisgICAgZ290byBjbGVhbnVwX21haW47CisKKyAgcGFyYW1fa2V5cyA9IGdydWJf bWFsbG9jIChwcy53b3Jkc19jb3VudCAqIHNpemVvZiAoY2hhciAqKSk7CisgIGlmIChwYXJhbV9r ZXlzID09IE5VTEwpCisgICAgZ290byBjbGVhbnVwX21haW47CisgIHBhcmFtX3ZhbHMgPSBncnVi X21hbGxvYyAocHMud29yZHNfY291bnQgKiBzaXplb2YgKGNoYXIgKikpOworICBpZiAocGFyYW1f dmFscyA9PSBOVUxMKQorICAgIGdvdG8gY2xlYW51cF9tYWluOworCisgIGZvciAoaSA9IDA7IGkg PCBwcy53b3Jkc19jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgKmVxX3BvczsKKworICAg ICAgcHMuY3VycmVudF93b3JkID0gcHMud29yZHNbaV07CisgICAgICBwcy5jdXJyZW50X3dvcmRf bGVuID0gZ3J1Yl9zdHJsZW4gKHBzLmN1cnJlbnRfd29yZCkgKyAxOworICAgICAgZXFfcG9zID0g Z3J1Yl9zdHJjaHIgKHBzLmN1cnJlbnRfd29yZCwgJz0nKTsKKworICAgICAgaWYgKGVxX3BvcyAh PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBCb3RoIHByZV9l cV9sZW4gYW5kIHBvc3RfZXFfbGVuIHJlcHJlc2VudCBzdWJzdHJpbmcgbGVuZ3RocworICAgICAg ICAgICAqIHdpdGhvdXQgYSBOVUwgdGVybWluYXRvci4KKyAgICAgICAgICAgKi8KKyAgICAgICAg ICBncnViX3NpemVfdCBwcmVfZXFfbGVuID0gKGdydWJfc2l6ZV90KSAoZXFfcG9zIC0gcHMuY3Vy cmVudF93b3JkKTsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIHBzLmN1cnJlbnRfd29yZF9s ZW4gaW5jbHVkZXMgdGhlIE5VTCB0ZXJtaW5hdG9yLCBzbyB3ZSBzdWJ0cmFjdAorICAgICAgICAg ICAqIG9uZSB0byBnZXQgcmlkIG9mIHRoZSB0ZXJtaW5hdG9yLCBhbmQgb25lIG1vcmUgdG8gZ2V0 IHJpZCBvZiB0aGUKKyAgICAgICAgICAgKiBlcXVhbHMgc2lnbi4KKyAgICAgICAgICAgKi8KKyAg ICAgICAgICBncnViX3NpemVfdCBwb3N0X2VxX2xlbiA9IChwcy5jdXJyZW50X3dvcmRfbGVuIC0g MikgLSBwcmVfZXFfbGVuOworCisgICAgICAgICAgaWYgKGlzX2tleV9zYWZlIChwcy5jdXJyZW50 X3dvcmQsIHByZV9lcV9sZW4pID09IHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAg IHBhcmFtX2RpY3RfcG9zID0gcGFyYW1fZGljdF9sZW4rKzsKKyAgICAgICAgICAgICAgcGFyYW1f a2V5c1twYXJhbV9kaWN0X3Bvc10gPSBncnViX21hbGxvYyAocHJlX2VxX2xlbiArIDEpOworICAg ICAgICAgICAgICBpZiAocGFyYW1fa2V5cyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8g Y2xlYW51cF9tYWluOworICAgICAgICAgICAgICBwYXJhbV92YWxzW3BhcmFtX2RpY3RfcG9zXSA9 IGdydWJfbWFsbG9jIChwb3N0X2VxX2xlbiArIDEpOworICAgICAgICAgICAgICBpZiAocGFyYW1f dmFscyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF9tYWluOworCisgICAg ICAgICAgICAgIGdydWJfc3RybmNweSAocGFyYW1fa2V5c1twYXJhbV9kaWN0X3Bvc10sIHBzLmN1 cnJlbnRfd29yZCwgcHJlX2VxX2xlbik7CisgICAgICAgICAgICAgIGdydWJfc3RybmNweSAocGFy YW1fdmFsc1twYXJhbV9kaWN0X3Bvc10sCisJCQkgICAgcHMuY3VycmVudF93b3JkICsgcHJlX2Vx X2xlbiArIDEsIHBvc3RfZXFfbGVuKTsKKyAgICAgICAgICAgICAgcGFyYW1fa2V5c1twYXJhbV9k aWN0X3Bvc11bcHJlX2VxX2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICBwYXJhbV92YWxzW3Bh cmFtX2RpY3RfcG9zXVtwb3N0X2VxX2xlbl0gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAg ICB9CisgICAgICBlbHNlIGlmIChpc19rZXlfc2FmZSAocHMuY3VycmVudF93b3JkLCBwcy5jdXJy ZW50X3dvcmRfbGVuIC0gMSkgPT0gdHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgIHBhcmFtX2Rp Y3RfcG9zID0gcGFyYW1fZGljdF9sZW4rKzsKKyAgICAgICAgICBwYXJhbV9rZXlzW3BhcmFtX2Rp Y3RfcG9zXSA9IGdydWJfbWFsbG9jIChwcy5jdXJyZW50X3dvcmRfbGVuKTsKKyAgICAgICAgICBp ZiAocGFyYW1fa2V5cyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBjbGVhbnVwX21haW47Cisg ICAgICAgICAgcGFyYW1fdmFsc1twYXJhbV9kaWN0X3Bvc10gPSBncnViX21hbGxvYyAoMik7Cisg ICAgICAgICAgaWYgKHBhcmFtX3ZhbHMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gY2xlYW51 cF9tYWluOworCisgICAgICAgICAgZ3J1Yl9zdHJuY3B5IChwYXJhbV9rZXlzW3BhcmFtX2RpY3Rf cG9zXSwgcHMuY3VycmVudF93b3JkLAorCQkJcHMuY3VycmVudF93b3JkX2xlbik7CisgICAgICAg ICAgaWYgKHBhcmFtX2tleXNbcGFyYW1fZGljdF9wb3NdW3BzLmN1cnJlbnRfd29yZF9sZW4gLSAx XSAhPSAnXDAnICkKKyAgICAgICAgICAgIGdydWJfZmF0YWwgKCJOVUwgdGVybWluYXRvciBtaXNz aW5nIGZyb20ga2V5IGR1cmluZyBYZW4gY21kbGluZSBwYXJzaW5nIik7CisgICAgICAgICAgZ3J1 Yl9zdHJjcHkgKHBhcmFtX3ZhbHNbcGFyYW1fZGljdF9wb3NdLCAiMSIpOworICAgICAgICB9Cisg ICAgIAorICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1fZGljdF9sZW47IGkrKykKKyAg ICB7CisgICAgICAvKgorICAgICAgICogRmluZCBrZXlzIHRoYXQgc3RhcnQgd2l0aCAieGVuX2dy dWJfZW52XyIgYW5kIGV4cG9ydCB0aGVtCisgICAgICAgKiBhcyBlbnZpcm9ubWVudCB2YXJpYWJs ZXMuCisgICAgICAgKi8KKyAgICAgIGlmIChncnViX3N0cm5jbXAgKHBhcmFtX2tleXNbaV0sCisJ CQkieGVuX2dydWJfZW52XyIsCisJCQlzaXplb2YgKCJ4ZW5fZ3J1Yl9lbnZfIikgLSAxKSAhPSAw KQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKGdydWJfZW52X3NldCAocGFyYW1fa2V5 c1tpXSwgcGFyYW1fdmFsc1tpXSkgIT0gR1JVQl9FUlJfTk9ORSkKKyAgICAgICAgeworICAgICAg ICAgIGdydWJfcHJpbnRmICgid2FybmluZzogY291bGQgbm90IHNldCBlbnZpcm9ubWVudCB2YXJp YWJsZSBgJXMnIHRvIHZhbHVlIGAlcydcbiIsCisJCSAgICAgICBwYXJhbV9rZXlzW2ldLCBwYXJh bV92YWxzW2ldKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBpZiAo Z3J1Yl9lbnZfZXhwb3J0IChwYXJhbV9rZXlzW2ldKSAhPSBHUlVCX0VSUl9OT05FKQorICAgICAg ICBncnViX3ByaW50ZiAoIndhcm5pbmc6IGNvdWxkIG5vdCBleHBvcnQgZW52aXJvbm1lbnQgdmFy aWFibGUgYCVzJyIsCisJCSAgICAgcGFyYW1fa2V5c1tpXSk7CisgICAgfQorCisgY2xlYW51cF9t YWluOgorICBmb3IgKGkgPSAwOyBpIDwgcHMud29yZHNfY291bnQ7IGkrKykKKyAgICBncnViX2Zy ZWUgKHBzLndvcmRzW2ldKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1fZGljdF9sZW47IGkr KykKKyAgICB7CisgICAgICBncnViX2ZyZWUgKHBhcmFtX2tleXNbaV0pOworICAgICAgZ3J1Yl9m cmVlIChwYXJhbV92YWxzW2ldKTsKKyAgICB9CisKKyAgZ3J1Yl9mcmVlIChwYXJhbV9rZXlzKTsK KyAgZ3J1Yl9mcmVlIChwYXJhbV92YWxzKTsKKyAgZ3J1Yl9mcmVlIChwcy53b3Jkcyk7Cit9CmRp ZmYgLS1naXQgYS9ncnViLWNvcmUva2Vybi94ZW4vaW5pdC5jIGIvZ3J1Yi1jb3JlL2tlcm4veGVu L2luaXQuYwppbmRleCA3ODJjYTcyLi42OWNmNTlmIDEwMDY0NAotLS0gYS9ncnViLWNvcmUva2Vy bi94ZW4vaW5pdC5jCisrKyBiL2dydWItY29yZS9rZXJuL3hlbi9pbml0LmMKQEAgLTU4MSw2ICs1 ODEsOCBAQCBncnViX21hY2hpbmVfaW5pdCAodm9pZCkKICAgZ3J1Yl94ZW5kaXNrX2luaXQgKCk7 CiAKICAgZ3J1Yl9ib290X2luaXQgKCk7CisKKyAgZ3J1Yl9wYXJzZV94ZW5fY21kbGluZSAoKTsK IH0KIAogdm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ncnViL3hlbi5oIGIvaW5jbHVkZS9ncnVi L3hlbi5oCmluZGV4IDkxY2I3Y2YuLjdmOWVmZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3J1Yi94 ZW4uaAorKysgYi9pbmNsdWRlL2dydWIveGVuLmgKQEAgLTg5LDYgKzg5LDggQEAgdm9pZCBncnVi X2NvbnNvbGVfaW5pdCAodm9pZCk7CiB2b2lkIGdydWJfeGVuZGlza19maW5pICh2b2lkKTsKIHZv aWQgZ3J1Yl94ZW5kaXNrX2luaXQgKHZvaWQpOwogCit2b2lkIGdydWJfcGFyc2VfeGVuX2NtZGxp bmUgKHZvaWQpOworCiAjaWZkZWYgX194ODZfNjRfXwogdHlwZWRlZiBncnViX3VpbnQ2NF90IGdy dWJfeGVuX21mbl90OwogI2Vsc2UKLS0gCjIuNTAuMQoKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCkdydWItZGV2ZWwgbWFpbGluZyBsaXN0CkdydWItZGV2 ZWxAZ251Lm9yZwpodHRwczovL2xpc3RzLmdudS5vcmcvbWFpbG1hbi9saXN0aW5mby9ncnViLWRl dmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7C037CA0EE0 for ; Thu, 14 Aug 2025 01:37:27 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.1080524.1440909 (Exim 4.92) (envelope-from ) id 1umMu0-0007eN-ME; Thu, 14 Aug 2025 01:37:12 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 1080524.1440909; Thu, 14 Aug 2025 01:37:12 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1umMu0-0007eG-IX; Thu, 14 Aug 2025 01:37:12 +0000 Received: by outflank-mailman (input) for mailman id 1080524; Thu, 14 Aug 2025 01:37:11 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1umMtz-0006vN-6m for xen-devel@lists.xenproject.org; Thu, 14 Aug 2025 01:37:11 +0000 Received: from mail-io1-xd2c.google.com (mail-io1-xd2c.google.com [2607:f8b0:4864:20::d2c]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 317619b0-78af-11f0-a328-13f23c93f187; Thu, 14 Aug 2025 03:37:10 +0200 (CEST) Received: by mail-io1-xd2c.google.com with SMTP id ca18e2360f4ac-88432d99304so500939f.1 for ; Wed, 13 Aug 2025 18:37:10 -0700 (PDT) Received: from kf-m2g5.. ([2607:fb91:1183:972:ee53:76c5:e875:9619]) by smtp.gmail.com with ESMTPSA id ca18e2360f4ac-883f198db02sm467297239f.16.2025.08.13.18.37.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Aug 2025 18:37:08 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 317619b0-78af-11f0-a328-13f23c93f187 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755135429; x=1755740229; darn=lists.xenproject.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jYjrOnp/98fI4shqR2qZGODzcHFvJmoqS2F7odknl14=; b=A5erXSIdSZV9bP/fCQS3DKmWcziIo8AGZySVjkG0Osz6gJYGdOaRUqrIQeQCHjxr4S yOos5e//m0lqWuTELmFc0XSvrf8aup0N/xMsGxBTv0YrxUJzBROChjAJeuq7ci8K0gpx m5UL4nXY9J4Gwm35fkClPsIuA9JC1UXduMr8IBnu/k3J9U+kOOxJ4BJiWf5B1PegJwHH 8k7UFi3/9H/ky57mu5MwWVB+M3yR63DAns9hsBJ6mjRyaz5kgeWan6tMnG3RcAJ/Oye9 6vJ1nMD1Jf8JlKf9goenx93oS88jRIWZbEk0d/+wSH0FMgyNriwnH560Nz0hFkBmQZkP mJ2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755135429; x=1755740229; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jYjrOnp/98fI4shqR2qZGODzcHFvJmoqS2F7odknl14=; b=qfben4jSfMdfQ9yhbUwaemJ4c5WFmTDEdF8eOnYo1rlC7d3dpO4KkfQAJymn4tAcca iiXEtRZQR86fYwKNvmWmVb/syCm9vg3fNtkZFYSKCDScL1I+66MBEHzjV+X4HQwRvhII HFgL4qrRE/HO67v1plIYCM1jCFm9Dgxih9mxKbtzBxfq0AmnOUMRVYhLMXtj1tbbcAvM yTRaaTBq3Vxtzmh5yZFK4HJdlsRfoTtnJ8k5xEm/t8k+frXJV7W3ShsOD538He99cHbl 2/9A8WfZ6I36+0gVSGW/ILQ871OJlIepGTdlhy/FGU+Bj22sFnO4b9B2Zb5eMPIa8d+z ZNfA== X-Forwarded-Encrypted: i=1; AJvYcCX+nyGSGF0VmZ6j6Pf477XdMK14eEO9VQ5RHjBXes4043BIykdEdKXreJfQUfYu6xyWkAVij1uj/to=@lists.xenproject.org X-Gm-Message-State: AOJu0YzUbm/wmsIdSI3O3gyoXR3vHipLKmnXFl7WjONPA38RPge4LFua ONpFHs4HdmaM1EdXPCiD/JrqYRGXNnTznpAJD5v+CVNsBcauLmIz9OB2 X-Gm-Gg: ASbGncuTwm0eCuhwu/xNpG/4yOdee0iAfp2tkviR98BsZSMaqeaEBx9tA8YWKSIHT+O DKk158pOY9/zNyPIOymRsXFBdwMO/3xqdroYQxOJ+WJx4eQswjUxTVsObaied7N5RRD6JlxfCCx K9VuR0Yd/LU1K1HvR3b7zWjpiXdDqZXqaO7gR9k4pqXJ1T7wdSZFmcfxyYpDhSQS23CuWROH6Lp Ty97u9e+Jy89E3J2rBexYM/wurRoNoJElJK8rQUuXLaWKgmmCXB3GURy9NFLunLaUbj7DP4tEPb njOKRUIouRaEyL2z901fE2cZ45aDyy0xJgziBuRQMoWSjIjKP2Zq8o+YkVjSplN0tVbwE1ngtCg iNOne9Wi2zW/4hCnMN1P82MoPOe+pFIkH X-Google-Smtp-Source: AGHT+IHoWdWVHYfsNfkHl6TNhXloRZxAVR1T8eFqwX+ooSg0nIZDMOVQaMkmROyH5boiVh3HNDm0RA== X-Received: by 2002:a05:6602:6011:b0:881:8274:c398 with SMTP id ca18e2360f4ac-884339c2238mr70250039f.4.1755135428621; Wed, 13 Aug 2025 18:37:08 -0700 (PDT) From: arraybolt3@gmail.com To: grub-devel@gnu.org, xen-devel@lists.xenproject.org Cc: Aaron Rainbolt Subject: [PATCH v5 3/3] kern/xen: Add Xen command line parsing Date: Wed, 13 Aug 2025 20:36:45 -0500 Message-ID: <20250814013645.2488043-4-arraybolt3@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250814013645.2488043-1-arraybolt3@gmail.com> References: <20250814013645.2488043-1-arraybolt3@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Aaron Rainbolt Xen traditionally allows customizing guest behavior by passing arguments to the VM kernel via the kernel command line. This is no longer possible when using GRUB with Xen, as the kernel command line is decided by the GRUB configuration file within the guest, not data passed to the guest by Xen. To work around this limitation, enable GRUB to parse a command line passed to it by Xen, and expose data from the command line to the GRUB configuration as environment variables. These variables can be used in the GRUB configuration for any desired purpose, such as extending the kernel command line passed to the guest. The command line format is inspired by the Linux kernel's command line format. To reduce the risk of misuse, abuse, or accidents in production, the command line will only be parsed if it consists entirely of 7-bit ASCII characters, only alphabetical characters and underscores are permitted in variable names, and all variable names must start with the string "xen_grub_env_". This also allows room for expanding the command line arguments accepted by GRUB in the future, should other arguments end up becoming desirable in the future. Signed-off-by: Aaron Rainbolt --- docs/grub.texi | 52 +++++ grub-core/Makefile.core.def | 2 + grub-core/kern/i386/xen/pvh.c | 4 + grub-core/kern/xen/cmdline.c | 361 ++++++++++++++++++++++++++++++++++ grub-core/kern/xen/init.c | 2 + include/grub/xen.h | 2 + 6 files changed, 423 insertions(+) create mode 100644 grub-core/kern/xen/cmdline.c diff --git a/docs/grub.texi b/docs/grub.texi index 34b3484..cd4e539 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -3271,6 +3271,7 @@ GRUB. Others may be used freely in GRUB configuration files. @menu * Special environment variables:: * Environment block:: +* Passing environment variables through Xen:: @end menu @@ -3871,6 +3872,57 @@ using BIOS or EFI functions (no ATA, USB or IEEE1275). @command{grub-mkconfig} uses this facility to implement @samp{GRUB_SAVEDEFAULT} (@pxref{Simple configuration}). +@node Passing environment variables through Xen +@section Passing environment variables through Xen + +If you are using a GRUB image as the kernel for a PV or PVH Xen virtual +machine, you can pass environment variables from Xen's dom0 to the VM through +the Xen-provided kernel command line. When combined with a properly configured +guest, this can be used to customize the guest's behavior on bootup via the +VM's Xen configuration file. + +GRUB will parse the kernel command line passed to it by Xen during bootup. +The command line will be split into space-delimited words. Single and +double quotes may be used to quote words or portions of words that contain +spaces. Single quotes will be considered part of a word if inside double +quotes, and vice versa. Arbitrary characters may be backslash-escaped to make +them a literal component of a word rather than being parsed as quotes or word +separators. The command line must consist entirely of printable 7-bit ASCII +characters and spaces. If a non-printing ASCII character is found anywhere in +the command line, the entire command line will be ignored by GRUB. (This +splitter algorithm is meant to behave somewhat like Bash's word splitting.) + +Each word should be a variable assignment in the format ``variable'' or +``variable=value''. Variable names must contain only the characters A-Z, a-z, +and underscore (``_''). Variable names must begin with the string +``xen_grub_env_''. Variable values can contain arbitrary printable 7-bit +ASCII characters and space. If any variable contains an illegal name, that +variable will be ignored. + +If a variable name and value are both specified, the variable will be set to +the specified value. If only a variable name is specified, the variable's +value will be set to ``1''. + +The following is a simple example of how to use this functionality to append +arbitrary variables to a guest's kernel command line: + +@example +# In the Xen configuration file for the guest +name = "linux_vm" +type = "pvh" +kernel = "/path/to/grub-i386-xen_pvh.bin" +extra = "xen_grub_env_linux_append='loglevel=3'" +memory = 1024 +disk = [ "file:/srv/vms/linux_vm.img,sda,w" ] + +# In the guest's GRUB configuration file +menuentry "Linux VM with dom0-specified kernel parameters" @{ + search --set=root --label linux_vm --hint hd0,msdos1 + linux /boot/vmlinuz root=LABEL=linux_vm $@{xen_grub_env_linux_append@} + initrd /boot/initrd.img +@} +@end example + @node Modules @chapter Modules diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index b3f7119..df0f266 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -248,6 +248,7 @@ kernel = { xen = term/xen/console.c; xen = disk/xen/xendisk.c; xen = commands/boot.c; + xen = kern/xen/cmdline.c; i386_xen_pvh = commands/boot.c; i386_xen_pvh = disk/xen/xendisk.c; @@ -255,6 +256,7 @@ kernel = { i386_xen_pvh = kern/i386/xen/tsc.c; i386_xen_pvh = kern/i386/xen/pvh.c; i386_xen_pvh = kern/xen/init.c; + i386_xen_pvh = kern/xen/cmdline.c; i386_xen_pvh = term/xen/console.c; ia64_efi = kern/ia64/efi/startup.S; diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pvh.c index 91fbca8..52020b7 100644 --- a/grub-core/kern/i386/xen/pvh.c +++ b/grub-core/kern/i386/xen/pvh.c @@ -352,6 +352,10 @@ grub_xen_setup_pvh (void) grub_xen_mm_init_regions (); grub_rsdp_addr = pvh_start_info->rsdp_paddr; + + grub_strncpy ((char *) grub_xen_start_page_addr->cmd_line, + (const char *) pvh_start_info->cmdline_paddr, + GRUB_XEN_MAX_GUEST_CMDLINE); } grub_err_t diff --git a/grub-core/kern/xen/cmdline.c b/grub-core/kern/xen/cmdline.c new file mode 100644 index 0000000..8021bf8 --- /dev/null +++ b/grub-core/kern/xen/cmdline.c @@ -0,0 +1,361 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2025 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include + +enum splitter_state +{ + SPLITTER_NORMAL = 0x0, + SPLITTER_HIT_BACKSLASH = 0x1, + SPLITTER_IN_SINGLE_QUOTES = 0x2, + SPLITTER_IN_DOUBLE_QUOTES = 0x4, +}; +typedef enum splitter_state splitter_state_t; + +/* + * The initial size of the current_word buffer. The buffer may be resized as + * needed. + */ +#define PARSER_BASE_WORD_SIZE 32 + +struct parser_state +{ + char **words; + grub_size_t words_count; + char *current_word; + grub_size_t current_word_len; + grub_size_t current_word_pos; +}; +typedef struct parser_state parser_state_t; + +static grub_err_t +append_char_to_word (parser_state_t *ps, char c, bool allow_null) +{ + /* + * We ban any chars that are not in the ASCII printable range. If + * allow_null == true, we make an exception for NUL. (This is needed so that + * append_word_to_list can add a NUL terminator to the word). + */ + if (!grub_isprint (c) && allow_null == false) + return GRUB_ERR_BAD_ARGUMENT; + else if (allow_null == true && c != '\0') + return GRUB_ERR_BAD_ARGUMENT; + + if (ps->current_word_pos == ps->current_word_len) + { + ps->current_word = grub_realloc (ps->current_word, ps->current_word_len *= 2); + if (ps->current_word == NULL) + { + ps->current_word_len /= 2; + return grub_errno; + } + } + + ps->current_word[ps->current_word_pos++] = c; + return GRUB_ERR_NONE; +} + +static grub_err_t +append_word_to_list (parser_state_t *ps) +{ + /* No-op on empty words. */ + if (ps->current_word_pos == 0) + return GRUB_ERR_NONE; + + if (append_char_to_word (ps, '\0', true) != GRUB_ERR_NONE) + grub_fatal ("couldn't append NUL terminator to word during Xen cmdline parsing"); + + ps->current_word_len = grub_strlen (ps->current_word) + 1; + ps->current_word = grub_realloc (ps->current_word, ps->current_word_len); + if (ps->current_word == NULL) + return grub_errno; + ps->words = grub_realloc (ps->words, ++ps->words_count * sizeof (char *)); + if (ps->words == NULL) + return grub_errno; + ps->words[ps->words_count - 1] = ps->current_word; + + ps->current_word_len = PARSER_BASE_WORD_SIZE; + ps->current_word_pos = 0; + ps->current_word = grub_malloc (ps->current_word_len); + if (ps->current_word == NULL) + return grub_errno; + + return GRUB_ERR_NONE; +} + +static bool +is_key_safe (char *key, grub_size_t len) +{ + grub_size_t i; + + for (i = 0; i < len; i++) + if (!grub_isalpha (key[i]) && key[i] != '_') + return false; + + return true; +} + +void +grub_parse_xen_cmdline (void) +{ + parser_state_t ps = {0}; + splitter_state_t ss = SPLITTER_NORMAL; + + const char *cmdline = (const char *) grub_xen_start_page_addr->cmd_line; + grub_size_t cmdline_len; + bool cmdline_valid = false; + char **param_keys = NULL; + char **param_vals = NULL; + grub_size_t param_dict_len = 0; + grub_size_t param_dict_pos = 0; + char current_char = '\0'; + grub_size_t i = 0; + + /* + * The following algorithm is used to parse the Xen command line: + * + * - The command line is split into space-separated words. + * - Single and double quotes may be used to suppress the splitting + * behavior of spaces. + * - Double quotes are appended to the current word verbatim if they + * appear within a single-quoted string portion, and vice versa. + * - Backslashes may be used to cause the next character to be + * appended to the current word verbatim. This is only useful when + * used to escape quotes, spaces, and backslashes, but for simplicity + * we allow backslash-escaping anything. + * - After splitting the command line into words, each word is checked to + * see if it contains an equals sign. + * - If it does, it is split on the equals sign into a key-value pair. The + * key is then treated as an variable name, and the value is treated as + * the variable's value. + * - If it does not, the entire word is treated as a variable name. The + * variable's value is implicitly considered to be `1`. + * - All variables detected on the command line are checked to see if their + * names begin with the string `xen_grub_env_`. Variables that do not pass + * this check are discarded, variables that do pass this check are + * exported so they are available to the GRUB configuration. + * + * This behavior is intended to somewhat mimic the splitter behavior in Bash + * and in GRUB's config file parser. + */ + + ps.current_word_len = PARSER_BASE_WORD_SIZE; + ps.current_word = grub_malloc (ps.current_word_len); + if (ps.current_word == NULL) + goto cleanup_main; + + for (i = 0; i < GRUB_XEN_MAX_GUEST_CMDLINE; i++) + { + if (cmdline[i] == '\0') + { + cmdline_valid = true; + break; + } + } + + if (cmdline_valid == false) + { + grub_error (GRUB_ERR_BAD_ARGUMENT, + "command line from Xen is not NUL-terminated"); + grub_print_error (); + goto cleanup_main; + } + + cmdline_len = grub_strlen (cmdline); + for (i = 0; i < cmdline_len; i++) + { + current_char = cmdline[i]; + + /* + * If the previous character was a backslash, append the current + * character to the word verbatim + */ + if (ss & SPLITTER_HIT_BACKSLASH) + { + ss &= ~SPLITTER_HIT_BACKSLASH; + if (append_char_to_word (&ps, current_char, false) != GRUB_ERR_NONE) + goto cleanup_main; + continue; + } + + switch (current_char) + { + case '\\': + /* Backslashes escape arbitrary characters. */ + ss |= SPLITTER_HIT_BACKSLASH; + break; + + case '\'': + /* + * Single quotes suppress word splitting and double quoting until + * the next single quote is encountered. + */ + if (ss & SPLITTER_IN_DOUBLE_QUOTES) + { + if (append_char_to_word (&ps, current_char, false) != GRUB_ERR_NONE) + goto cleanup_main; + break; + } + + ss ^= SPLITTER_IN_SINGLE_QUOTES; + break; + + case '"': + /* + * Double quotes suppress word splitting and single quoting until + * the next double quote is encountered. + */ + if (ss & SPLITTER_IN_SINGLE_QUOTES) + { + if (append_char_to_word (&ps, current_char, false) != GRUB_ERR_NONE) + goto cleanup_main; + break; + } + + ss ^= SPLITTER_IN_DOUBLE_QUOTES; + break; + + case ' ': + /* Spaces separate words in the command line from each other. */ + if (ss & SPLITTER_IN_SINGLE_QUOTES || + ss & SPLITTER_IN_DOUBLE_QUOTES) + { + if (append_char_to_word (&ps, current_char, false) != GRUB_ERR_NONE) + goto cleanup_main; + break; + } + + if (append_word_to_list (&ps) != GRUB_ERR_NONE) + goto cleanup_main; + break; + + default: + if (append_char_to_word (&ps, current_char, false) != GRUB_ERR_NONE) + goto cleanup_main; + } + } + + if (append_word_to_list (&ps) != GRUB_ERR_NONE) + goto cleanup_main; + + param_keys = grub_malloc (ps.words_count * sizeof (char *)); + if (param_keys == NULL) + goto cleanup_main; + param_vals = grub_malloc (ps.words_count * sizeof (char *)); + if (param_vals == NULL) + goto cleanup_main; + + for (i = 0; i < ps.words_count; i++) + { + char *eq_pos; + + ps.current_word = ps.words[i]; + ps.current_word_len = grub_strlen (ps.current_word) + 1; + eq_pos = grub_strchr (ps.current_word, '='); + + if (eq_pos != NULL) + { + /* + * Both pre_eq_len and post_eq_len represent substring lengths + * without a NUL terminator. + */ + grub_size_t pre_eq_len = (grub_size_t) (eq_pos - ps.current_word); + /* + * ps.current_word_len includes the NUL terminator, so we subtract + * one to get rid of the terminator, and one more to get rid of the + * equals sign. + */ + grub_size_t post_eq_len = (ps.current_word_len - 2) - pre_eq_len; + + if (is_key_safe (ps.current_word, pre_eq_len) == true) + { + param_dict_pos = param_dict_len++; + param_keys[param_dict_pos] = grub_malloc (pre_eq_len + 1); + if (param_keys == NULL) + goto cleanup_main; + param_vals[param_dict_pos] = grub_malloc (post_eq_len + 1); + if (param_vals == NULL) + goto cleanup_main; + + grub_strncpy (param_keys[param_dict_pos], ps.current_word, pre_eq_len); + grub_strncpy (param_vals[param_dict_pos], + ps.current_word + pre_eq_len + 1, post_eq_len); + param_keys[param_dict_pos][pre_eq_len] = '\0'; + param_vals[param_dict_pos][post_eq_len] = '\0'; + } + } + else if (is_key_safe (ps.current_word, ps.current_word_len - 1) == true) + { + param_dict_pos = param_dict_len++; + param_keys[param_dict_pos] = grub_malloc (ps.current_word_len); + if (param_keys == NULL) + goto cleanup_main; + param_vals[param_dict_pos] = grub_malloc (2); + if (param_vals == NULL) + goto cleanup_main; + + grub_strncpy (param_keys[param_dict_pos], ps.current_word, + ps.current_word_len); + if (param_keys[param_dict_pos][ps.current_word_len - 1] != '\0' ) + grub_fatal ("NUL terminator missing from key during Xen cmdline parsing"); + grub_strcpy (param_vals[param_dict_pos], "1"); + } + + } + + for (i = 0; i < param_dict_len; i++) + { + /* + * Find keys that start with "xen_grub_env_" and export them + * as environment variables. + */ + if (grub_strncmp (param_keys[i], + "xen_grub_env_", + sizeof ("xen_grub_env_") - 1) != 0) + continue; + + if (grub_env_set (param_keys[i], param_vals[i]) != GRUB_ERR_NONE) + { + grub_printf ("warning: could not set environment variable `%s' to value `%s'\n", + param_keys[i], param_vals[i]); + continue; + } + + if (grub_env_export (param_keys[i]) != GRUB_ERR_NONE) + grub_printf ("warning: could not export environment variable `%s'", + param_keys[i]); + } + + cleanup_main: + for (i = 0; i < ps.words_count; i++) + grub_free (ps.words[i]); + + for (i = 0; i < param_dict_len; i++) + { + grub_free (param_keys[i]); + grub_free (param_vals[i]); + } + + grub_free (param_keys); + grub_free (param_vals); + grub_free (ps.words); +} diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c index 782ca72..69cf59f 100644 --- a/grub-core/kern/xen/init.c +++ b/grub-core/kern/xen/init.c @@ -581,6 +581,8 @@ grub_machine_init (void) grub_xendisk_init (); grub_boot_init (); + + grub_parse_xen_cmdline (); } void diff --git a/include/grub/xen.h b/include/grub/xen.h index 91cb7cf..7f9efee 100644 --- a/include/grub/xen.h +++ b/include/grub/xen.h @@ -89,6 +89,8 @@ void grub_console_init (void); void grub_xendisk_fini (void); void grub_xendisk_init (void); +void grub_parse_xen_cmdline (void); + #ifdef __x86_64__ typedef grub_uint64_t grub_xen_mfn_t; #else -- 2.50.1