mirror of
https://github.com/ventoy/Ventoy.git
synced 2025-09-19 10:21:14 +00:00
Compare commits
277 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5a649f96f | ||
|
|
443a1344f2 | ||
|
|
d3de1a91f8 | ||
|
|
580ad598f6 | ||
|
|
0891e34d47 | ||
|
|
4d777090cb | ||
|
|
b0568922d2 | ||
|
|
69b6bb8fca | ||
|
|
3d686c27d7 | ||
|
|
90ba217ec7 | ||
|
|
fab070ef64 | ||
|
|
b3869b6894 | ||
|
|
563214ed40 | ||
|
|
b67f738b00 | ||
|
|
a9c539572b | ||
|
|
32602a79ab | ||
|
|
863eafd2cc | ||
|
|
0f135b6646 | ||
|
|
675c24ffa3 | ||
|
|
cd309eb663 | ||
|
|
5cdd6540a4 | ||
|
|
fde2e4430c | ||
|
|
9a471f4956 | ||
|
|
1f3b3afa35 | ||
|
|
6947f2a047 | ||
|
|
0a15e4e427 | ||
|
|
e763d7590f | ||
|
|
f842d46f90 | ||
|
|
cc1cc6c301 | ||
|
|
9f3d209798 | ||
|
|
fc742244ab | ||
|
|
3e66227dae | ||
|
|
f32d342f66 | ||
|
|
09d7ae68e7 | ||
|
|
68fefbc1fc | ||
|
|
8d893d4c94 | ||
|
|
84798a4f7a | ||
|
|
87f88eeb2b | ||
|
|
7b2615744c | ||
|
|
d7faff4438 | ||
|
|
f15dfd7409 | ||
|
|
09162e8d97 | ||
|
|
eb8fcc8f30 | ||
|
|
5fcb3971bc | ||
|
|
e47e4484ce | ||
|
|
7e26decb31 | ||
|
|
e713946fd0 | ||
|
|
a93b0f6656 | ||
|
|
836e1aa11e | ||
|
|
154bbc6e5f | ||
|
|
d151e74336 | ||
|
|
df87cafdfb | ||
|
|
09494a5b23 | ||
|
|
e15a1c5ece | ||
|
|
f5843f576b | ||
|
|
be5bc6f3b7 | ||
|
|
f3b65452f4 | ||
|
|
ec4b6c2a2c | ||
|
|
be8b6e8976 | ||
|
|
82b1faa132 | ||
|
|
52ae65f54d | ||
|
|
ee104bfa97 | ||
|
|
9cfd05811b | ||
|
|
0c66908935 | ||
|
|
f53de3bdb0 | ||
|
|
8516786b31 | ||
|
|
f7c78879c7 | ||
|
|
f3e267a09e | ||
|
|
7c1370dcb0 | ||
|
|
1b5aa9c61d | ||
|
|
d6eba15d71 | ||
|
|
734c7b8ac4 | ||
|
|
0fa25c4526 | ||
|
|
1473be0e4c | ||
|
|
cd9aa16b20 | ||
|
|
a9be2fd4d9 | ||
|
|
f354d2b733 | ||
|
|
aa033e1fb6 | ||
|
|
9351fe4f97 | ||
|
|
67b8a34e8c | ||
|
|
c18399e8b4 | ||
|
|
5a591c1ae7 | ||
|
|
e208199cca | ||
|
|
4c9065a60d | ||
|
|
4fd4977c3a | ||
|
|
93614c3251 | ||
|
|
1db0827463 | ||
|
|
72d0fd0dd4 | ||
|
|
47797f0285 | ||
|
|
849eb7bf2c | ||
|
|
32c5b5deea | ||
|
|
d72bb15956 | ||
|
|
89a34bac18 | ||
|
|
8cecdae8f9 | ||
|
|
471432fc50 | ||
|
|
a78e19608b | ||
|
|
5e97d56033 | ||
|
|
a5041ad43c | ||
|
|
3149a67599 | ||
|
|
d0b7927b51 | ||
|
|
8775684367 | ||
|
|
d148139227 | ||
|
|
dd2411d7d4 | ||
|
|
7db83dc0f1 | ||
|
|
787d950f28 | ||
|
|
892a819da4 | ||
|
|
bfc5eaebb9 | ||
|
|
e7d05df9fa | ||
|
|
ca07b52cb2 | ||
|
|
1a2a35f5bc | ||
|
|
d71514f23e | ||
|
|
c5af17e04e | ||
|
|
05e208ea2a | ||
|
|
112c557428 | ||
|
|
92db873b5c | ||
|
|
3c01eec4af | ||
|
|
5c6d18fcd4 | ||
|
|
84ec4b0de4 | ||
|
|
9615e7eaa0 | ||
|
|
6a244ff260 | ||
|
|
b5503a7375 | ||
|
|
0b7fa630a4 | ||
|
|
7babe823d6 | ||
|
|
6db513a067 | ||
|
|
bafac7479d | ||
|
|
d3138479d7 | ||
|
|
56a1543f7d | ||
|
|
659ac1cfe3 | ||
|
|
c83daa86b6 | ||
|
|
dfcfaa9967 | ||
|
|
188f9e707c | ||
|
|
8b975b5e80 | ||
|
|
2ab717cc66 | ||
|
|
88793d548a | ||
|
|
5fea6eab7e | ||
|
|
5d55dc68ae | ||
|
|
2c320aad60 | ||
|
|
b63034b2c7 | ||
|
|
6c113880e5 | ||
|
|
e2656c287b | ||
|
|
d8433985e7 | ||
|
|
b003105925 | ||
|
|
2ca2c83b6b | ||
|
|
dff7e495ca | ||
|
|
cf0f395c56 | ||
|
|
69bc90da42 | ||
|
|
ffc40234ca | ||
|
|
e57daa5065 | ||
|
|
5c733a20f8 | ||
|
|
069342ab9a | ||
|
|
32a964eded | ||
|
|
51b92f398a | ||
|
|
5d0ebf4510 | ||
|
|
cf94487ad5 | ||
|
|
af83f46a3d | ||
|
|
4910e9f380 | ||
|
|
fb38b321c2 | ||
|
|
7b78fe555e | ||
|
|
094ba61848 | ||
|
|
faa0e46d3a | ||
|
|
537f0eaa7e | ||
|
|
c8cf9b7ce2 | ||
|
|
4c71d7c190 | ||
|
|
47f9f2c42c | ||
|
|
fc3a5fae36 | ||
|
|
b3982d4930 | ||
|
|
c280baae27 | ||
|
|
425d640480 | ||
|
|
07d4140cf4 | ||
|
|
90ae07d227 | ||
|
|
e3e21eb6e6 | ||
|
|
c8ce2ae85a | ||
|
|
c02a6955c3 | ||
|
|
6b78603dd3 | ||
|
|
07a386c963 | ||
|
|
eb048c0075 | ||
|
|
37ac3f312f | ||
|
|
092cff8429 | ||
|
|
b347c1b5da | ||
|
|
da746c608f | ||
|
|
81aa56955a | ||
|
|
d1679871a6 | ||
|
|
f383052013 | ||
|
|
667f5bcc1b | ||
|
|
af69cb7f44 | ||
|
|
7bb13fc18a | ||
|
|
7fce7e0aba | ||
|
|
2a435084c2 | ||
|
|
c0c454a436 | ||
|
|
63924fa8bd | ||
|
|
3e47f5e8de | ||
|
|
b5eb347244 | ||
|
|
9225c940a6 | ||
|
|
a8edb99d28 | ||
|
|
ac3ab97686 | ||
|
|
c42a8c6d93 | ||
|
|
4b1dd4d3af | ||
|
|
f342be1d6c | ||
|
|
f4774ee0e4 | ||
|
|
d3cfa73631 | ||
|
|
331080fb95 | ||
|
|
99fbd14f08 | ||
|
|
1c5aeb35dc | ||
|
|
f7b3bd1729 | ||
|
|
672632a0c2 | ||
|
|
d07aa6ce07 | ||
|
|
93996cf7e2 | ||
|
|
ca62128f9b | ||
|
|
265b70f1c7 | ||
|
|
491f0bea8a | ||
|
|
47e77e003c | ||
|
|
d05eab2be1 | ||
|
|
849dfb463d | ||
|
|
7715bd705c | ||
|
|
042ca4b5e3 | ||
|
|
e1099e1e5b | ||
|
|
c6be35f2c0 | ||
|
|
b15a96b747 | ||
|
|
6bd0463d34 | ||
|
|
1ce568d971 | ||
|
|
f82475d950 | ||
|
|
aad154616c | ||
|
|
83c3a932d3 | ||
|
|
0aff8f5109 | ||
|
|
2750f0c5a7 | ||
|
|
f71a1fcce9 | ||
|
|
e252fab9a4 | ||
|
|
37212a8ea4 | ||
|
|
e71221cdba | ||
|
|
65a2cb1685 | ||
|
|
e23e76f54e | ||
|
|
8ded032c92 | ||
|
|
fc5cd0a00a | ||
|
|
6cc400b8d4 | ||
|
|
ffc915ca53 | ||
|
|
8ebe972f6e | ||
|
|
39975dd1c3 | ||
|
|
1a648d8689 | ||
|
|
8234961228 | ||
|
|
e1ffbad431 | ||
|
|
4a66104c6e | ||
|
|
32bcd8f87b | ||
|
|
26c1756e8d | ||
|
|
f4bbec65ba | ||
|
|
58d387f732 | ||
|
|
2e10aabe94 | ||
|
|
a63a41f79d | ||
|
|
64748308a3 | ||
|
|
33cc1e271a | ||
|
|
291e0a3a38 | ||
|
|
0717195481 | ||
|
|
26b3bca25b | ||
|
|
5d3285356e | ||
|
|
1e12969555 | ||
|
|
db892d5e12 | ||
|
|
7166164afe | ||
|
|
67e839b9f2 | ||
|
|
dce5d1b769 | ||
|
|
83d91c525f | ||
|
|
78df21fc40 | ||
|
|
1840cb8f38 | ||
|
|
b63ce2a3df | ||
|
|
bb7e10d93e | ||
|
|
324c97883a | ||
|
|
3c35345e38 | ||
|
|
9f357f8ed1 | ||
|
|
eb1a014d5b | ||
|
|
cbbd57eee5 | ||
|
|
7b08954e57 | ||
|
|
08634fba9f | ||
|
|
96c5a25263 | ||
|
|
43e8ec5785 | ||
|
|
7279ba9bc8 | ||
|
|
3929ed55ca | ||
|
|
fd6580be72 | ||
|
|
12e8ae26ae | ||
|
|
82977d9b8a |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -9,4 +9,4 @@ community_bridge: # Replace with a single Community Bridge project-name e.g., cl
|
|||||||
liberapay: # Replace with a single Liberapay username
|
liberapay: # Replace with a single Liberapay username
|
||||||
issuehunt: # Replace with a single IssueHunt username
|
issuehunt: # Replace with a single IssueHunt username
|
||||||
otechie: # Replace with a single Otechie username
|
otechie: # Replace with a single Otechie username
|
||||||
custom: ['https://www.ventoy.net/en/donation.html'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
custom: ['https://www.paypal.me/ventoy', 'https://www.ventoy.net/en/donation.html'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||||
|
|||||||
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
100
.github/ISSUE_TEMPLATE/issue_template.yml
vendored
Normal file
100
.github/ISSUE_TEMPLATE/issue_template.yml
vendored
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
name: Issue Report
|
||||||
|
description: File an issue report
|
||||||
|
title: "[issue]: "
|
||||||
|
assignees:
|
||||||
|
- octocat
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out this issue report!
|
||||||
|
- type: checkboxes
|
||||||
|
id: faq
|
||||||
|
attributes:
|
||||||
|
label: Official FAQ
|
||||||
|
description: Have you checked the official FAQ at [https://www.ventoy.net/en/faq.html](https://www.ventoy.net/en/faq.html) ?
|
||||||
|
options:
|
||||||
|
- label: I have checked the official FAQ.
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Ventoy Version
|
||||||
|
description: What version of ventoy are you running?
|
||||||
|
placeholder: 1.0.61
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: latestrelease
|
||||||
|
attributes:
|
||||||
|
label: What about latest release
|
||||||
|
description: Have you tried with the latest release of Ventoy?
|
||||||
|
options:
|
||||||
|
- Yes. I have tried the latest release, but the bug still exist.
|
||||||
|
- No. I didn't try the latest release.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: bios
|
||||||
|
attributes:
|
||||||
|
label: BIOS Mode
|
||||||
|
description: In which BIOS mode did you find the bug?
|
||||||
|
options:
|
||||||
|
- Legacy BIOS Mode
|
||||||
|
- UEFI Mode
|
||||||
|
- Both
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: partstyle
|
||||||
|
attributes:
|
||||||
|
label: Partition Style
|
||||||
|
description: Which partition style did you select when you install Ventoy?
|
||||||
|
options:
|
||||||
|
- MBR
|
||||||
|
- GPT
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: capacity
|
||||||
|
attributes:
|
||||||
|
label: Disk Capacity
|
||||||
|
description: What is the capacity of the disk installed with Ventoy?
|
||||||
|
placeholder: 32GB
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: vendor
|
||||||
|
attributes:
|
||||||
|
label: Disk Manufacturer
|
||||||
|
description: What is the manufacturer of the disk installed with Ventoy? (e.g. SanDisk/Kingston...)
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: dropdown
|
||||||
|
id: checksum
|
||||||
|
attributes:
|
||||||
|
label: Image file checksum (if applicable)
|
||||||
|
description: Have you checked the image file in Ventoy's menu as [https://www.ventoy.net/en/faq.html#faq_boot_checksum](https://www.ventoy.net/en/faq.html#faq_boot_checksum) ?
|
||||||
|
options:
|
||||||
|
- Yes.
|
||||||
|
- No.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: input
|
||||||
|
id: link
|
||||||
|
attributes:
|
||||||
|
label: Image file download link (if applicable)
|
||||||
|
description: What is the image file download link?
|
||||||
|
placeholder: https://xxx
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
id: what-happened
|
||||||
|
attributes:
|
||||||
|
label: What happened?
|
||||||
|
description: Tell me what happened. It's highly recommended to include some photo or video about the bug.
|
||||||
|
placeholder: Tell us what you see!
|
||||||
|
value: "A bug happened!"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
101
.github/ISSUE_TEMPLATE/success_image_report.yml
vendored
Normal file
101
.github/ISSUE_TEMPLATE/success_image_report.yml
vendored
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
name: Success Image Report
|
||||||
|
description: To report an image file that boot successfully in Ventoy and is not yet listed in https://www.ventoy.net/en/isolist.html
|
||||||
|
title: "[Success Image Report]: "
|
||||||
|
assignees:
|
||||||
|
- octocat
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
I list all the successfully tested image files in the official website: https://www.ventoy.net/en/isolist.html
|
||||||
|
If you successfully test an image file which is not listed in the above page, you can tell me and I will be very glad to add it to the tested list.
|
||||||
|
- type: checkboxes
|
||||||
|
id: faq
|
||||||
|
attributes:
|
||||||
|
label: Official Website List
|
||||||
|
description: Have you checked the list at [https://www.ventoy.net/en/isolist.html](https://www.ventoy.net/en/isolist.html) and the image file is not listed?
|
||||||
|
options:
|
||||||
|
- label: I have checked the list in official website and the image file is not listed there.
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Ventoy Version
|
||||||
|
description: What version of ventoy did you test with the image file.
|
||||||
|
placeholder: 1.0.57
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: bios
|
||||||
|
attributes:
|
||||||
|
label: BIOS Mode
|
||||||
|
description: In which BIOS mode did you successfully test the image file? (It's recommended to test in both mode)
|
||||||
|
options:
|
||||||
|
- Legacy BIOS Mode
|
||||||
|
- UEFI Mode
|
||||||
|
- Both
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: partstyle
|
||||||
|
attributes:
|
||||||
|
label: Partition Style
|
||||||
|
description: Which partition style did you use with Ventoy?
|
||||||
|
options:
|
||||||
|
- MBR
|
||||||
|
- GPT
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: filename
|
||||||
|
attributes:
|
||||||
|
label: Image file name
|
||||||
|
description: The successfully tested image file name.
|
||||||
|
placeholder: xxxx.iso
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: checksum
|
||||||
|
attributes:
|
||||||
|
label: Image file checksum type
|
||||||
|
description:
|
||||||
|
options:
|
||||||
|
- MD5
|
||||||
|
- SHA1
|
||||||
|
- SHA256
|
||||||
|
- SHA512
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: checkvalue
|
||||||
|
attributes:
|
||||||
|
label: Image file checksum value
|
||||||
|
description: What is the image file checksum value corresponding to the above checksum type?
|
||||||
|
placeholder: xxxx
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: link
|
||||||
|
attributes:
|
||||||
|
label: Image file download link (if applicable)
|
||||||
|
description: What is the image file download link?
|
||||||
|
placeholder: https://xxx
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: input
|
||||||
|
id: testenv
|
||||||
|
attributes:
|
||||||
|
label: Test envrionment
|
||||||
|
description: The manufacturer/model and other details about your computer (or VM).
|
||||||
|
placeholder: Lenovo Thinkpad T420 laptop
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: details
|
||||||
|
attributes:
|
||||||
|
label: More Details?
|
||||||
|
description: You can give more details here.
|
||||||
|
value: "This image file booted successfully in Ventoy."
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
3
.github/workflows/sync2gitee.yml
vendored
3
.github/workflows/sync2gitee.yml
vendored
@@ -4,8 +4,6 @@ on:
|
|||||||
# Triggers the workflow on push or pull request events but only for the main branch
|
# Triggers the workflow on push or pull request events but only for the main branch
|
||||||
push:
|
push:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
# Allows you to run this workflow manually from the Actions tab
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@@ -13,6 +11,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run:
|
run:
|
||||||
name: Sync-GitHub-to-Gitee
|
name: Sync-GitHub-to-Gitee
|
||||||
|
if: ${{ github.repository_owner == 'ventoy' }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Mirror the Github repos to Gitee.
|
- name: Mirror the Github repos to Gitee.
|
||||||
|
|||||||
@@ -13,6 +13,25 @@ ARCH=arm64 CROSS_COMPILE=aarch64-linux- make
|
|||||||
rename ./busybox to xzcat
|
rename ./busybox to xzcat
|
||||||
|
|
||||||
|
|
||||||
|
======== How to build ash/hexdump/xzcat for mips64el ========
|
||||||
|
#download mips64el-musl cross toolchain from https://github.com/ventoy/musl-cross-make/releases/download/latest/
|
||||||
|
#How to get ash.config/hexdump.cofig/xzcat.config
|
||||||
|
#ARCH=mips CROSS_COMPILE=mips64el-linux-musl- make allnoconfig "CFLAGS+=-mips64r2 -mabi=64 -Os" "LDFLAGS+=-mips64r2 -mabi=64 -Os"
|
||||||
|
#ARCH=mips CROSS_COMPILE=mips64el-linux-musl- make menuconfig "CFLAGS+=-mips64r2 -mabi=64 -Os" "LDFLAGS+=-mips64r2 -mabi=64 -Os"
|
||||||
|
#----> enable static build
|
||||||
|
#----> enable xzcat
|
||||||
|
#get mips64el_xzcat.config
|
||||||
|
|
||||||
|
tar xf busybox-1.32.0.tar.bz2
|
||||||
|
cd busybox-1.32.0
|
||||||
|
copy mips64el_xzcat.config as .config
|
||||||
|
ARCH=mips CROSS_COMPILE=mips64el-linux-musl- make "CFLAGS+=-mips64r2 -mabi=64 -Os" "LDFLAGS+=-mips64r2 -mabi=64 -Os"
|
||||||
|
rename ./busybox to xzcat
|
||||||
|
|
||||||
|
|
||||||
|
======== How to build full busybox =========
|
||||||
|
#make defconfig
|
||||||
|
#make menuconfig select static build
|
||||||
|
|
||||||
======== How to build ash/hexdump/xzcat for x86_64 ==========
|
======== How to build ash/hexdump/xzcat for x86_64 ==========
|
||||||
#How to get ash.config/hexdump.cofig/xzcat.config
|
#How to get ash.config/hexdump.cofig/xzcat.config
|
||||||
|
|||||||
@@ -3,13 +3,17 @@
|
|||||||
DSTDIR=../../IMG/cpio/ventoy/busybox
|
DSTDIR=../../IMG/cpio/ventoy/busybox
|
||||||
|
|
||||||
rm -f vtchmod32 vtchmod64 vtchmod64_musl vtchmodaa64
|
rm -f vtchmod32 vtchmod64 vtchmod64_musl vtchmodaa64
|
||||||
rm -f $DSTDIR/vtchmod32 $DSTDIR/vtchmod64 $DSTDIR/vtchmodaa64
|
rm -f $DSTDIR/vtchmod32 $DSTDIR/vtchmod64 $DSTDIR/vtchmodaa64 $DSTDIR/vtchmodm64e
|
||||||
|
|
||||||
/opt/diet32/bin/diet gcc -Os -m32 vtchmod.c -o vtchmod32
|
/opt/diet32/bin/diet gcc -Os -m32 vtchmod.c -o vtchmod32
|
||||||
/opt/diet64/bin/diet gcc -Os vtchmod.c -o vtchmod64
|
/opt/diet64/bin/diet gcc -Os vtchmod.c -o vtchmod64
|
||||||
aarch64-linux-gcc -Os -static vtchmod.c -o vtchmodaa64
|
aarch64-linux-gcc -Os -static vtchmod.c -o vtchmodaa64
|
||||||
aarch64-linux-strip --strip-all vtchmodaa64
|
aarch64-linux-strip --strip-all vtchmodaa64
|
||||||
|
|
||||||
|
mips64el-linux-musl-gcc -mips64r2 -mabi=64 -Os -static vtchmod.c -o vtchmodm64e
|
||||||
|
mips64el-linux-musl-strip --strip-all vtchmodm64e
|
||||||
|
|
||||||
|
|
||||||
gcc -specs "/usr/local/musl/lib/musl-gcc.specs" -Os -static vtchmod.c -o vtchmod64_musl
|
gcc -specs "/usr/local/musl/lib/musl-gcc.specs" -Os -static vtchmod.c -o vtchmod64_musl
|
||||||
strip --strip-all vtchmod64_musl
|
strip --strip-all vtchmod64_musl
|
||||||
|
|
||||||
@@ -17,9 +21,11 @@ chmod 777 vtchmod32
|
|||||||
chmod 777 vtchmod64
|
chmod 777 vtchmod64
|
||||||
chmod 777 vtchmodaa64
|
chmod 777 vtchmodaa64
|
||||||
chmod 777 vtchmod64_musl
|
chmod 777 vtchmod64_musl
|
||||||
|
chmod 777 vtchmodm64e
|
||||||
|
|
||||||
cp -a vtchmod32 $DSTDIR/
|
cp -a vtchmod32 $DSTDIR/
|
||||||
cp -a vtchmod64 $DSTDIR/
|
cp -a vtchmod64 $DSTDIR/
|
||||||
cp -a vtchmodaa64 $DSTDIR/
|
cp -a vtchmodaa64 $DSTDIR/
|
||||||
cp -a vtchmod64_musl $DSTDIR/
|
cp -a vtchmod64_musl $DSTDIR/
|
||||||
|
cp -a vtchmodm64e $DSTDIR/
|
||||||
|
|
||||||
|
|||||||
BIN
BUSYBOX/chmod/vtchmodm64e
Normal file
BIN
BUSYBOX/chmod/vtchmodm64e
Normal file
Binary file not shown.
1166
BUSYBOX/mips64el_ash.config
Normal file
1166
BUSYBOX/mips64el_ash.config
Normal file
File diff suppressed because it is too large
Load Diff
1166
BUSYBOX/mips64el_hexdump.config
Normal file
1166
BUSYBOX/mips64el_hexdump.config
Normal file
File diff suppressed because it is too large
Load Diff
1166
BUSYBOX/mips64el_xzcat.config
Normal file
1166
BUSYBOX/mips64el_xzcat.config
Normal file
File diff suppressed because it is too large
Load Diff
@@ -55,6 +55,16 @@ build for 32bit, static linked with dietlibc
|
|||||||
6. get dmsetup/dmsetup.static as the dmsetupaa64 binary file
|
6. get dmsetup/dmsetup.static as the dmsetupaa64 binary file
|
||||||
|
|
||||||
|
|
||||||
|
======================== Build for mips64 dmsetup =========================
|
||||||
|
1. extract device mapper source code
|
||||||
|
2. ./configure CC="mips64el-linux-musl-gcc -mips64r2 -mabi=64" --target=mips --host=x86_64-linux-gnu --disable-nls --disable-selinux --disable-shared --enable-static_link
|
||||||
|
3. modify include/configure.h file
|
||||||
|
--- delete the line with "#define malloc rpl_malloc"
|
||||||
|
4. make
|
||||||
|
5. mips64el-linux-musl-strip dmsetup/dmsetup.static
|
||||||
|
6. get dmsetup/dmsetup.static as the dmsetupm64e binary file
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
DMSETUP/dmsetupm64e
Normal file
BIN
DMSETUP/dmsetupm64e
Normal file
Binary file not shown.
@@ -34,17 +34,13 @@
|
|||||||
https://codeload.github.com/libfuse/libfuse/zip/fuse-2.9.9 ===> /home/Ventoy-master/ExFAT/libfuse-fuse-2.9.9.zip
|
https://codeload.github.com/libfuse/libfuse/zip/fuse-2.9.9 ===> /home/Ventoy-master/ExFAT/libfuse-fuse-2.9.9.zip
|
||||||
https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz ===> /opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
|
https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz ===> /opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
|
||||||
https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--uclibc--stable-2020.08-1.tar.bz2 ===> /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2
|
https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--uclibc--stable-2020.08-1.tar.bz2 ===> /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2
|
||||||
|
http://ftp.loongnix.org/toolchain/gcc/release/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz ===> /opt/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz
|
||||||
|
https://github.com/ventoy/musl-cross-make/releases/download/latest/output.tar.bz2 ===> /opt/output.tar.bz2
|
||||||
|
|
||||||
|
|
||||||
http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/vmlinuz64 ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/vmlinuz64
|
http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/vmlinuz64 ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/vmlinuz64
|
||||||
http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/corepure64.gz ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/corepure64.gz
|
http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/corepure64.gz ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/corepure64.gz
|
||||||
http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/modules64.gz ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/modules64.gz
|
http://www.tinycorelinux.net/11.x/x86_64/release/distribution_files/modules64.gz ===> /home/Ventoy-master/LiveCD/ISO/EFI/boot/modules64.gz
|
||||||
http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/glib2.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/glib2.tcz
|
|
||||||
http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/libffi.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/libffi.tcz
|
|
||||||
http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/liblvm2.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/liblvm2.tcz
|
|
||||||
http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/ncursesw.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/ncursesw.tcz
|
|
||||||
http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/parted.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/parted.tcz
|
|
||||||
http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/readline.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/readline.tcz
|
|
||||||
http://distro.ibiblio.org/tinycorelinux/11.x/x86_64/tcz/udev-lib.tcz /home/Ventoy-master/LiveCD/VTOY/ventoy/tcz/udev-lib.tcz
|
|
||||||
|
|
||||||
2.3 Prepare third-part tools
|
2.3 Prepare third-part tools
|
||||||
cd /home/Ventoy-master/DOC/
|
cd /home/Ventoy-master/DOC/
|
||||||
@@ -54,9 +50,12 @@
|
|||||||
|
|
||||||
tar xf /opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz -C /opt
|
tar xf /opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz -C /opt
|
||||||
tar xf /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2 -C /opt
|
tar xf /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2 -C /opt
|
||||||
|
tar xf /opt/output.tar.bz2 -C /opt
|
||||||
|
mv /opt/output /opt/mips64el-linux-musl-gcc730
|
||||||
|
|
||||||
|
|
||||||
2.4 Set PATH envrioment
|
2.4 Set PATH envrioment
|
||||||
export PATH=$PATH:/opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin:/opt/aarch64--uclibc--stable-2020.08-1/bin
|
export PATH=$PATH:/opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin:/opt/aarch64--uclibc--stable-2020.08-1/bin:/opt/mips64el-linux-musl-gcc730/bin
|
||||||
better to add this line to /root/.bashrc and relogin as root
|
better to add this line to /root/.bashrc and relogin as root
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,3 +6,4 @@
|
|||||||
|
|
||||||
[ -d /opt/aarch64--uclibc--stable-2020.08-1 ] || tar xf /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2 -C /opt
|
[ -d /opt/aarch64--uclibc--stable-2020.08-1 ] || tar xf /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2 -C /opt
|
||||||
|
|
||||||
|
[ -d /opt/mips-loongson-gcc7.3-linux-gnu ] || tar xf /opt/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz -C /opt
|
||||||
|
|||||||
@@ -5,6 +5,6 @@ RUN yum -y -q install \
|
|||||||
mpfr.i686 mpfr-devel.i686 rsync autogen autoconf automake libtool gettext* bison binutils \
|
mpfr.i686 mpfr-devel.i686 rsync autogen autoconf automake libtool gettext* bison binutils \
|
||||||
flex device-mapper-devel SDL libpciaccess libusb freetype freetype-devel gnu-free-* qemu-* virt-* \
|
flex device-mapper-devel SDL libpciaccess libusb freetype freetype-devel gnu-free-* qemu-* virt-* \
|
||||||
libvirt* vte* NetworkManager-bluetooth brlapi fuse-devel dejavu* gnu-efi* pesign shim \
|
libvirt* vte* NetworkManager-bluetooth brlapi fuse-devel dejavu* gnu-efi* pesign shim \
|
||||||
iscsi-initiator-utils grub2-tools zip nasm acpica-tools glibc-static zlib-static xorriso
|
iscsi-initiator-utils grub2-tools zip nasm acpica-tools glibc-static zlib-static xorriso lz4 squashfs-tools
|
||||||
|
|
||||||
CMD cd /ventoy/INSTALL && ls -la && sh docker_ci_build.sh
|
CMD cd /ventoy/INSTALL && ls -la && sh docker_ci_build.sh
|
||||||
|
|||||||
@@ -34,14 +34,17 @@
|
|||||||
#include <Protocol/BlockIo.h>
|
#include <Protocol/BlockIo.h>
|
||||||
#include <Protocol/RamDisk.h>
|
#include <Protocol/RamDisk.h>
|
||||||
#include <Protocol/SimpleFileSystem.h>
|
#include <Protocol/SimpleFileSystem.h>
|
||||||
|
#include <Protocol/DriverBinding.h>
|
||||||
#include <Ventoy.h>
|
#include <Ventoy.h>
|
||||||
|
|
||||||
BOOLEAN gDebugPrint = FALSE;
|
BOOLEAN gDebugPrint = FALSE;
|
||||||
|
BOOLEAN gBootFallBack = FALSE;
|
||||||
BOOLEAN gDotEfiBoot = FALSE;
|
BOOLEAN gDotEfiBoot = FALSE;
|
||||||
BOOLEAN gLoadIsoEfi = FALSE;
|
BOOLEAN gLoadIsoEfi = FALSE;
|
||||||
BOOLEAN gIsoUdf = FALSE;
|
BOOLEAN gIsoUdf = FALSE;
|
||||||
ventoy_ram_disk g_ramdisk_param;
|
ventoy_ram_disk g_ramdisk_param;
|
||||||
ventoy_chain_head *g_chain;
|
ventoy_chain_head *g_chain;
|
||||||
|
void *g_vtoy_img_location_buf;
|
||||||
ventoy_img_chunk *g_chunk;
|
ventoy_img_chunk *g_chunk;
|
||||||
UINT8 *g_os_param_reserved;
|
UINT8 *g_os_param_reserved;
|
||||||
UINT32 g_img_chunk_num;
|
UINT32 g_img_chunk_num;
|
||||||
@@ -56,6 +59,9 @@ static grub_env_set_pf grub_env_set = NULL;
|
|||||||
ventoy_grub_param_file_replace *g_file_replace_list = NULL;
|
ventoy_grub_param_file_replace *g_file_replace_list = NULL;
|
||||||
ventoy_efi_file_replace g_efi_file_replace;
|
ventoy_efi_file_replace g_efi_file_replace;
|
||||||
|
|
||||||
|
ventoy_grub_param_file_replace *g_img_replace_list = NULL;
|
||||||
|
ventoy_efi_file_replace g_img_file_replace;
|
||||||
|
|
||||||
CONST CHAR16 gIso9660EfiDriverPath[] = ISO9660_EFI_DRIVER_PATH;
|
CONST CHAR16 gIso9660EfiDriverPath[] = ISO9660_EFI_DRIVER_PATH;
|
||||||
CONST CHAR16 gUdfEfiDriverPath[] = UDF_EFI_DRIVER_PATH;
|
CONST CHAR16 gUdfEfiDriverPath[] = UDF_EFI_DRIVER_PATH;
|
||||||
|
|
||||||
@@ -269,6 +275,7 @@ static int ventoy_update_image_location(ventoy_os_param *param)
|
|||||||
}
|
}
|
||||||
|
|
||||||
address = (UINTN)buffer;
|
address = (UINTN)buffer;
|
||||||
|
g_vtoy_img_location_buf = buffer;
|
||||||
|
|
||||||
if (address % 4096)
|
if (address % 4096)
|
||||||
{
|
{
|
||||||
@@ -359,10 +366,22 @@ EFI_HANDLE EFIAPI ventoy_get_parent_handle(IN EFI_DEVICE_PATH_PROTOCOL *pDevPath
|
|||||||
return Handle;
|
return Handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC ventoy_ram_disk g_backup_ramdisk_param;
|
||||||
|
STATIC ventoy_os_param g_backup_os_param_var;
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS EFIAPI ventoy_save_ramdisk_param(VOID)
|
EFI_STATUS EFIAPI ventoy_save_ramdisk_param(VOID)
|
||||||
{
|
{
|
||||||
|
UINTN DataSize;
|
||||||
EFI_STATUS Status = EFI_SUCCESS;
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
EFI_GUID VarGuid = VENTOY_GUID;
|
EFI_GUID VarGuid = VENTOY_GUID;
|
||||||
|
|
||||||
|
DataSize = sizeof(g_backup_ramdisk_param);
|
||||||
|
Status = gRT->GetVariable(L"VentoyRamDisk", &VarGuid, NULL, &DataSize, &g_backup_ramdisk_param);
|
||||||
|
if (!EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
debug("find previous ramdisk variable <%llu>", g_backup_ramdisk_param.DiskSize);
|
||||||
|
}
|
||||||
|
|
||||||
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
||||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
@@ -376,21 +395,38 @@ EFI_STATUS EFIAPI ventoy_delete_ramdisk_param(VOID)
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status = EFI_SUCCESS;
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
EFI_GUID VarGuid = VENTOY_GUID;
|
EFI_GUID VarGuid = VENTOY_GUID;
|
||||||
|
|
||||||
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
if (g_backup_ramdisk_param.DiskSize > 0 && g_backup_ramdisk_param.PhyAddr > 0)
|
||||||
|
{
|
||||||
|
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
||||||
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
|
sizeof(g_backup_ramdisk_param), &g_backup_ramdisk_param);
|
||||||
|
debug("resotre ramdisk variable %r", Status);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
|
||||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
0, NULL);
|
0, NULL);
|
||||||
debug("delete efi variable %r", Status);
|
debug("delete ramdisk variable %r", Status);
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS EFIAPI ventoy_save_variable(VOID)
|
EFI_STATUS EFIAPI ventoy_save_variable(VOID)
|
||||||
{
|
{
|
||||||
|
UINTN DataSize;
|
||||||
EFI_STATUS Status = EFI_SUCCESS;
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
EFI_GUID VarGuid = VENTOY_GUID;
|
EFI_GUID VarGuid = VENTOY_GUID;
|
||||||
|
|
||||||
|
DataSize = sizeof(g_backup_os_param_var);
|
||||||
|
Status = gRT->GetVariable(L"VentoyOsParam", &VarGuid, NULL, &DataSize, &g_backup_os_param_var);
|
||||||
|
if (!EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
debug("find previous efi variable <%a>", g_backup_os_param_var.vtoy_img_path);
|
||||||
|
}
|
||||||
|
|
||||||
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
||||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
sizeof(g_chain->os_param), &(g_chain->os_param));
|
sizeof(g_chain->os_param), &(g_chain->os_param));
|
||||||
@@ -403,11 +439,21 @@ EFI_STATUS EFIAPI ventoy_delete_variable(VOID)
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status = EFI_SUCCESS;
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
EFI_GUID VarGuid = VENTOY_GUID;
|
EFI_GUID VarGuid = VENTOY_GUID;
|
||||||
|
|
||||||
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
if (0 == CompareMem(&(g_backup_os_param_var.guid), &VarGuid, sizeof(EFI_GUID)))
|
||||||
|
{
|
||||||
|
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
||||||
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
|
sizeof(g_backup_os_param_var), &(g_backup_os_param_var));
|
||||||
|
debug("restore efi variable %r", Status);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
|
||||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
0, NULL);
|
0, NULL);
|
||||||
debug("delete efi variable %r", Status);
|
debug("delete efi variable %r", Status);
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@@ -664,6 +710,35 @@ STATIC EFI_STATUS EFIAPI ventoy_load_isoefi_driver(IN EFI_HANDLE ImageHandle)
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS ventoy_proc_img_replace_name(ventoy_grub_param_file_replace *replace)
|
||||||
|
{
|
||||||
|
UINT32 i;
|
||||||
|
char tmp[256];
|
||||||
|
|
||||||
|
if (replace->magic != GRUB_IMG_REPLACE_MAGIC)
|
||||||
|
{
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (replace->old_file_name[0][0] == 0)
|
||||||
|
{
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
AsciiStrCpyS(tmp, sizeof(tmp), replace->old_file_name[0]);
|
||||||
|
|
||||||
|
for (i = 0; i < 256 && tmp[i]; i++)
|
||||||
|
{
|
||||||
|
if (tmp[i] == '/')
|
||||||
|
{
|
||||||
|
tmp[i] = '\\';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AsciiStrCpyS(replace->old_file_name[0], 256, tmp);
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||||
{
|
{
|
||||||
UINT32 i = 0;
|
UINT32 i = 0;
|
||||||
@@ -694,6 +769,11 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
|||||||
gDebugPrint = TRUE;
|
gDebugPrint = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (StrStr(pCmdLine, L"fallback"))
|
||||||
|
{
|
||||||
|
gBootFallBack = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (StrStr(pCmdLine, L"dotefi"))
|
if (StrStr(pCmdLine, L"dotefi"))
|
||||||
{
|
{
|
||||||
gDotEfiBoot = TRUE;
|
gDotEfiBoot = TRUE;
|
||||||
@@ -769,6 +849,19 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
|||||||
old_cnt > 3 ? g_file_replace_list->old_file_name[3] : ""
|
old_cnt > 3 ? g_file_replace_list->old_file_name[3] : ""
|
||||||
);
|
);
|
||||||
|
|
||||||
|
g_img_replace_list = &pGrubParam->img_replace;
|
||||||
|
ventoy_proc_img_replace_name(g_img_replace_list);
|
||||||
|
old_cnt = g_img_replace_list->old_file_cnt;
|
||||||
|
debug("img replace: magic:0x%x virtid:%u name count:%u <%a> <%a> <%a> <%a>",
|
||||||
|
g_img_replace_list->magic,
|
||||||
|
g_img_replace_list->new_file_virtual_id,
|
||||||
|
old_cnt,
|
||||||
|
old_cnt > 0 ? g_img_replace_list->old_file_name[0] : "",
|
||||||
|
old_cnt > 1 ? g_img_replace_list->old_file_name[1] : "",
|
||||||
|
old_cnt > 2 ? g_img_replace_list->old_file_name[2] : "",
|
||||||
|
old_cnt > 3 ? g_img_replace_list->old_file_name[3] : ""
|
||||||
|
);
|
||||||
|
|
||||||
pPos = StrStr(pCmdLine, L"mem:");
|
pPos = StrStr(pCmdLine, L"mem:");
|
||||||
chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4);
|
chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4);
|
||||||
|
|
||||||
@@ -873,12 +966,15 @@ EFI_STATUS EFIAPI ventoy_clean_env(VOID)
|
|||||||
|
|
||||||
ventoy_delete_variable();
|
ventoy_delete_variable();
|
||||||
|
|
||||||
if (g_chain->os_param.vtoy_img_location_addr)
|
if (g_vtoy_img_location_buf)
|
||||||
{
|
{
|
||||||
FreePool((VOID *)(UINTN)g_chain->os_param.vtoy_img_location_addr);
|
FreePool(g_vtoy_img_location_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool(g_chain);
|
if (!gMemdiskMode)
|
||||||
|
{
|
||||||
|
FreePool(g_chain);
|
||||||
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -999,7 +1095,8 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
|||||||
gST->ConIn->Reset(gST->ConIn, FALSE);
|
gST->ConIn->Reset(gST->ConIn, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC)
|
if ((g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC) ||
|
||||||
|
(g_img_replace_list && g_img_replace_list->magic == GRUB_IMG_REPLACE_MAGIC))
|
||||||
{
|
{
|
||||||
ventoy_wrapper_push_openvolume(pFile->OpenVolume);
|
ventoy_wrapper_push_openvolume(pFile->OpenVolume);
|
||||||
pFile->OpenVolume = ventoy_wrapper_open_volume;
|
pFile->OpenVolume = ventoy_wrapper_open_volume;
|
||||||
@@ -1030,7 +1127,7 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
debug("Fs not found, now wait and retry...");
|
debug("Fs not found, now wait and retry...");
|
||||||
sleep(2);
|
sleep(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1074,6 +1171,8 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ventoy_disable_ex_filesystem();
|
||||||
|
|
||||||
if (gMemdiskMode)
|
if (gMemdiskMode)
|
||||||
{
|
{
|
||||||
g_ramdisk_param.PhyAddr = (UINT64)(UINTN)g_iso_data_buf;
|
g_ramdisk_param.PhyAddr = (UINT64)(UINTN)g_iso_data_buf;
|
||||||
@@ -1130,7 +1229,7 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
|||||||
ventoy_clean_env();
|
ventoy_clean_env();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FALSE == gDotEfiBoot)
|
if (FALSE == gDotEfiBoot && FALSE == gBootFallBack)
|
||||||
{
|
{
|
||||||
if (EFI_NOT_FOUND == Status)
|
if (EFI_NOT_FOUND == Status)
|
||||||
{
|
{
|
||||||
@@ -1148,6 +1247,8 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
|||||||
grub_env_set("vtoy_dotefi_retry", "YES");
|
grub_env_set("vtoy_dotefi_retry", "YES");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ventoy_enable_ex_filesystem();
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -169,7 +169,6 @@ typedef struct ventoy_virt_chunk
|
|||||||
{ 0x37b87ac6, 0xc180, 0x4583, { 0xa7, 0x05, 0x41, 0x4d, 0xa8, 0xf7, 0x7e, 0xd2 }}
|
{ 0x37b87ac6, 0xc180, 0x4583, { 0xa7, 0x05, 0x41, 0x4d, 0xa8, 0xf7, 0x7e, 0xd2 }}
|
||||||
|
|
||||||
|
|
||||||
#define VTOY_BLOCK_DEVICE_PATH_NAME L"ventoy"
|
|
||||||
|
|
||||||
#if defined (MDE_CPU_IA32)
|
#if defined (MDE_CPU_IA32)
|
||||||
#define VENTOY_UEFI_DESC L"IA32 UEFI"
|
#define VENTOY_UEFI_DESC L"IA32 UEFI"
|
||||||
@@ -244,6 +243,7 @@ typedef int (*grub_env_printf_pf)(const char *fmt, ...);
|
|||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
|
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
|
||||||
|
#define GRUB_IMG_REPLACE_MAGIC 0x1259BEEF
|
||||||
|
|
||||||
typedef struct ventoy_efi_file_replace
|
typedef struct ventoy_efi_file_replace
|
||||||
{
|
{
|
||||||
@@ -268,6 +268,7 @@ typedef struct ventoy_grub_param
|
|||||||
grub_env_get_pf grub_env_get;
|
grub_env_get_pf grub_env_get;
|
||||||
grub_env_set_pf grub_env_set;
|
grub_env_set_pf grub_env_set;
|
||||||
ventoy_grub_param_file_replace file_replace;
|
ventoy_grub_param_file_replace file_replace;
|
||||||
|
ventoy_grub_param_file_replace img_replace;
|
||||||
grub_env_printf_pf grub_env_printf;
|
grub_env_printf_pf grub_env_printf;
|
||||||
}ventoy_grub_param;
|
}ventoy_grub_param;
|
||||||
|
|
||||||
@@ -344,6 +345,14 @@ typedef struct ventoy_system_wrapper
|
|||||||
EFI_LOCATE_DEVICE_PATH OriLocateDevicePath;
|
EFI_LOCATE_DEVICE_PATH OriLocateDevicePath;
|
||||||
} ventoy_system_wrapper;
|
} ventoy_system_wrapper;
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_DRIVER_BIND_WRAPPER 64
|
||||||
|
typedef struct DriverBindWrapper
|
||||||
|
{
|
||||||
|
EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;
|
||||||
|
EFI_DRIVER_BINDING_SUPPORTED pfOldSupport;
|
||||||
|
}DRIVER_BIND_WRAPPER;
|
||||||
|
|
||||||
#define ventoy_wrapper(bs, wrapper, func, newfunc) \
|
#define ventoy_wrapper(bs, wrapper, func, newfunc) \
|
||||||
{\
|
{\
|
||||||
wrapper.Ori##func = bs->func;\
|
wrapper.Ori##func = bs->func;\
|
||||||
@@ -351,6 +360,22 @@ typedef struct ventoy_system_wrapper
|
|||||||
bs->func = wrapper.New##func;\
|
bs->func = wrapper.New##func;\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define VENTOY_GET_COMPONENT_NAME(Protocol, DriverName) \
|
||||||
|
{\
|
||||||
|
DriverName = NULL;\
|
||||||
|
Status = Protocol->GetDriverName(Protocol, "en", &DriverName);\
|
||||||
|
if (EFI_ERROR(Status) || NULL == DriverName) \
|
||||||
|
{\
|
||||||
|
DriverName = NULL;\
|
||||||
|
Status = Protocol->GetDriverName(Protocol, "eng", &DriverName);\
|
||||||
|
if (EFI_ERROR(Status) || NULL == DriverName) \
|
||||||
|
{\
|
||||||
|
continue;\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
|
||||||
extern BOOLEAN gDebugPrint;
|
extern BOOLEAN gDebugPrint;
|
||||||
VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...);
|
VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...);
|
||||||
EFI_STATUS EFIAPI ventoy_wrapper_system(VOID);
|
EFI_STATUS EFIAPI ventoy_wrapper_system(VOID);
|
||||||
@@ -373,6 +398,7 @@ extern ventoy_virt_chunk *g_virt_chunk;
|
|||||||
extern UINT32 g_virt_chunk_num;
|
extern UINT32 g_virt_chunk_num;
|
||||||
extern vtoy_block_data gBlockData;
|
extern vtoy_block_data gBlockData;
|
||||||
extern ventoy_efi_file_replace g_efi_file_replace;
|
extern ventoy_efi_file_replace g_efi_file_replace;
|
||||||
|
extern ventoy_efi_file_replace g_img_file_replace;
|
||||||
extern ventoy_sector_flag *g_sector_flag;
|
extern ventoy_sector_flag *g_sector_flag;
|
||||||
extern UINT32 g_sector_flag_num;
|
extern UINT32 g_sector_flag_num;
|
||||||
extern BOOLEAN gMemdiskMode;
|
extern BOOLEAN gMemdiskMode;
|
||||||
@@ -380,6 +406,7 @@ extern BOOLEAN gSector512Mode;
|
|||||||
extern UINTN g_iso_buf_size;
|
extern UINTN g_iso_buf_size;
|
||||||
extern UINT8 *g_iso_data_buf;
|
extern UINT8 *g_iso_data_buf;
|
||||||
extern ventoy_grub_param_file_replace *g_file_replace_list;
|
extern ventoy_grub_param_file_replace *g_file_replace_list;
|
||||||
|
extern ventoy_grub_param_file_replace *g_img_replace_list;
|
||||||
extern BOOLEAN g_fixup_iso9660_secover_enable;
|
extern BOOLEAN g_fixup_iso9660_secover_enable;
|
||||||
extern EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *g_con_simple_input_ex;
|
extern EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *g_con_simple_input_ex;
|
||||||
extern BOOLEAN g_fix_windows_1st_cdrom_issue;
|
extern BOOLEAN g_fix_windows_1st_cdrom_issue;
|
||||||
@@ -396,6 +423,8 @@ EFI_STATUS ventoy_hook_keyboard_stop(VOID);
|
|||||||
BOOLEAN ventoy_is_cdrom_dp_exist(VOID);
|
BOOLEAN ventoy_is_cdrom_dp_exist(VOID);
|
||||||
EFI_STATUS ventoy_hook_1st_cdrom_start(VOID);
|
EFI_STATUS ventoy_hook_1st_cdrom_start(VOID);
|
||||||
EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID);
|
EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID);
|
||||||
|
EFI_STATUS ventoy_disable_ex_filesystem(VOID);
|
||||||
|
EFI_STATUS ventoy_enable_ex_filesystem(VOID);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#include <Protocol/BlockIo.h>
|
#include <Protocol/BlockIo.h>
|
||||||
#include <Protocol/RamDisk.h>
|
#include <Protocol/RamDisk.h>
|
||||||
#include <Protocol/SimpleFileSystem.h>
|
#include <Protocol/SimpleFileSystem.h>
|
||||||
|
#include <Protocol/DriverBinding.h>
|
||||||
#include <Ventoy.h>
|
#include <Ventoy.h>
|
||||||
|
|
||||||
#define PROCOTOL_SLEEP_MSECONDS 0
|
#define PROCOTOL_SLEEP_MSECONDS 0
|
||||||
|
|||||||
@@ -34,8 +34,12 @@
|
|||||||
#include <Protocol/BlockIo.h>
|
#include <Protocol/BlockIo.h>
|
||||||
#include <Protocol/RamDisk.h>
|
#include <Protocol/RamDisk.h>
|
||||||
#include <Protocol/SimpleFileSystem.h>
|
#include <Protocol/SimpleFileSystem.h>
|
||||||
|
#include <Protocol/DriverBinding.h>
|
||||||
#include <Ventoy.h>
|
#include <Ventoy.h>
|
||||||
|
|
||||||
|
#define ASSIGN_REPLACE(This, replace) \
|
||||||
|
replace = (This->FlushEx == ventoy_wrapper_file_flush_ex) ? &g_efi_file_replace : &g_img_file_replace
|
||||||
|
|
||||||
UINT8 *g_iso_data_buf = NULL;
|
UINT8 *g_iso_data_buf = NULL;
|
||||||
UINTN g_iso_buf_size = 0;
|
UINTN g_iso_buf_size = 0;
|
||||||
BOOLEAN gMemdiskMode = FALSE;
|
BOOLEAN gMemdiskMode = FALSE;
|
||||||
@@ -73,6 +77,9 @@ STATIC UINT8 g_sector_buf[2048];
|
|||||||
STATIC EFI_BLOCK_READ g_sector_2048_read = NULL;
|
STATIC EFI_BLOCK_READ g_sector_2048_read = NULL;
|
||||||
STATIC EFI_BLOCK_WRITE g_sector_2048_write = NULL;
|
STATIC EFI_BLOCK_WRITE g_sector_2048_write = NULL;
|
||||||
|
|
||||||
|
STATIC UINTN g_DriverBindWrapperCnt = 0;
|
||||||
|
STATIC DRIVER_BIND_WRAPPER g_DriverBindWrapperList[MAX_DRIVER_BIND_WRAPPER];
|
||||||
|
|
||||||
BOOLEAN ventoy_is_cdrom_dp_exist(VOID)
|
BOOLEAN ventoy_is_cdrom_dp_exist(VOID)
|
||||||
{
|
{
|
||||||
UINTN i = 0;
|
UINTN i = 0;
|
||||||
@@ -148,7 +155,7 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
|||||||
ventoy_override_chunk *pOverride = g_override_chunk;
|
ventoy_override_chunk *pOverride = g_override_chunk;
|
||||||
EFI_BLOCK_IO_PROTOCOL *pRawBlockIo = gBlockData.pRawBlockIo;
|
EFI_BLOCK_IO_PROTOCOL *pRawBlockIo = gBlockData.pRawBlockIo;
|
||||||
|
|
||||||
debug("read iso sector %lu count %u", Sector, Count);
|
debug("read iso sector %lu count %u Buffer:%p Align:%u", Sector, Count, Buffer, pRawBlockIo->Media->IoAlign);
|
||||||
|
|
||||||
ReadStart = Sector * 2048;
|
ReadStart = Sector * 2048;
|
||||||
ReadEnd = (Sector + Count) * 2048;
|
ReadEnd = (Sector + Count) * 2048;
|
||||||
@@ -173,7 +180,6 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
|||||||
{
|
{
|
||||||
MapLba = ((Sector - pchunk->img_start_sector) >> 1) + pchunk->disk_start_sector;
|
MapLba = ((Sector - pchunk->img_start_sector) >> 1) + pchunk->disk_start_sector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
secLeft = pchunk->img_end_sector + 1 - Sector;
|
secLeft = pchunk->img_end_sector + 1 - Sector;
|
||||||
secRead = (Count < secLeft) ? Count : secLeft;
|
secRead = (Count < secLeft) ? Count : secLeft;
|
||||||
@@ -182,7 +188,7 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
|||||||
MapLba, secRead * 2048, pCurBuf);
|
MapLba, secRead * 2048, pCurBuf);
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
debug("Raw disk read block failed %r LBA:%lu Count:%u", Status, MapLba, secRead);
|
debug("Raw disk read block failed %r LBA:%lu Count:%u %p", Status, MapLba, secRead, pCurBuf);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -425,7 +431,7 @@ end:
|
|||||||
return Lba;
|
return Lba;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_STATUS EFIAPI ventoy_block_io_read
|
EFI_STATUS EFIAPI ventoy_block_io_read_real
|
||||||
(
|
(
|
||||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
IN UINT32 MediaId,
|
IN UINT32 MediaId,
|
||||||
@@ -438,6 +444,8 @@ EFI_STATUS EFIAPI ventoy_block_io_read
|
|||||||
UINT32 j = 0;
|
UINT32 j = 0;
|
||||||
UINT32 lbacount = 0;
|
UINT32 lbacount = 0;
|
||||||
UINT32 secNum = 0;
|
UINT32 secNum = 0;
|
||||||
|
UINT32 TmpNum = 0;
|
||||||
|
UINT64 VirtSec = 0;
|
||||||
UINT64 offset = 0;
|
UINT64 offset = 0;
|
||||||
EFI_LBA curlba = 0;
|
EFI_LBA curlba = 0;
|
||||||
EFI_LBA lastlba = 0;
|
EFI_LBA lastlba = 0;
|
||||||
@@ -445,7 +453,7 @@ EFI_STATUS EFIAPI ventoy_block_io_read
|
|||||||
ventoy_sector_flag *cur_flag;
|
ventoy_sector_flag *cur_flag;
|
||||||
ventoy_virt_chunk *node;
|
ventoy_virt_chunk *node;
|
||||||
|
|
||||||
//debug("### ventoy_block_io_read sector:%u count:%u", (UINT32)Lba, (UINT32)BufferSize / 2048);
|
debug("### block_io_read_real sector:%u count:%u Buffer:%p", (UINT32)Lba, (UINT32)BufferSize / 2048, Buffer);
|
||||||
|
|
||||||
secNum = BufferSize / 2048;
|
secNum = BufferSize / 2048;
|
||||||
|
|
||||||
@@ -461,6 +469,28 @@ EFI_STATUS EFIAPI ventoy_block_io_read
|
|||||||
{
|
{
|
||||||
return ventoy_read_iso_sector(Lba, secNum, Buffer);
|
return ventoy_read_iso_sector(Lba, secNum, Buffer);
|
||||||
}
|
}
|
||||||
|
else if (offset < g_chain->real_img_size_in_bytes)
|
||||||
|
{
|
||||||
|
TmpNum = (g_chain->real_img_size_in_bytes - offset) / 2048;
|
||||||
|
ventoy_read_iso_sector(Lba, TmpNum, Buffer);
|
||||||
|
|
||||||
|
Lba += TmpNum;
|
||||||
|
secNum -= TmpNum;
|
||||||
|
Buffer = (UINT8 *)Buffer + (g_chain->real_img_size_in_bytes - offset);
|
||||||
|
offset = Lba * 2048;
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtSec = g_chain->virt_img_size_in_bytes / 2048;
|
||||||
|
if (Lba >= VirtSec)
|
||||||
|
{
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
else if (Lba + secNum > VirtSec)
|
||||||
|
{
|
||||||
|
secNum = VirtSec - Lba;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("XXX block_io_read_real sector:%u count:%u Buffer:%p", (UINT32)Lba, (UINT32)BufferSize / 2048, Buffer);
|
||||||
|
|
||||||
if (secNum > g_sector_flag_num)
|
if (secNum > g_sector_flag_num)
|
||||||
{
|
{
|
||||||
@@ -529,6 +559,42 @@ EFI_STATUS EFIAPI ventoy_block_io_read
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI ventoy_block_io_read
|
||||||
|
(
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
|
IN UINT32 MediaId,
|
||||||
|
IN EFI_LBA Lba,
|
||||||
|
IN UINTN BufferSize,
|
||||||
|
OUT VOID *Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINT32 IoAlign = 0;
|
||||||
|
VOID *NewBuf = NULL;
|
||||||
|
EFI_STATUS Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
|
||||||
|
if (gBlockData.pRawBlockIo && gBlockData.pRawBlockIo->Media)
|
||||||
|
{
|
||||||
|
IoAlign = gBlockData.pRawBlockIo->Media->IoAlign;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((IoAlign == 0) || (((UINTN) Buffer & (IoAlign - 1)) == 0))
|
||||||
|
{
|
||||||
|
Status = ventoy_block_io_read_real(This, MediaId, Lba, BufferSize, Buffer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NewBuf = AllocatePages(EFI_SIZE_TO_PAGES(BufferSize + IoAlign));
|
||||||
|
if (NewBuf)
|
||||||
|
{
|
||||||
|
Status = ventoy_block_io_read_real(This, MediaId, Lba, BufferSize, NewBuf);
|
||||||
|
CopyMem(Buffer, NewBuf, BufferSize);
|
||||||
|
FreePages(NewBuf, EFI_SIZE_TO_PAGES(BufferSize + IoAlign));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
EFI_STATUS EFIAPI ventoy_block_io_write
|
EFI_STATUS EFIAPI ventoy_block_io_write
|
||||||
(
|
(
|
||||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
@@ -561,26 +627,74 @@ EFI_STATUS EFIAPI ventoy_block_io_flush(IN EFI_BLOCK_IO_PROTOCOL *This)
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC UINTN ventoy_get_current_device_path_id(VOID)
|
||||||
|
{
|
||||||
|
UINTN i = 0;
|
||||||
|
UINTN Count = 0;
|
||||||
|
UINTN MaxId = 0;
|
||||||
|
UINTN CurId = 0;
|
||||||
|
BOOLEAN Find = FALSE;
|
||||||
|
EFI_HANDLE *Handles = NULL;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL;
|
||||||
|
VENDOR_DEVICE_PATH *venPath = NULL;
|
||||||
|
|
||||||
|
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDevicePathProtocolGuid,
|
||||||
|
NULL, &Count, &Handles);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
Status = gBS->HandleProtocol(Handles[i], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DevicePath->Type == HARDWARE_DEVICE_PATH && DevicePath->SubType == HW_VENDOR_DP)
|
||||||
|
{
|
||||||
|
venPath = (VENDOR_DEVICE_PATH *)DevicePath;
|
||||||
|
if (CompareGuid(&venPath->Guid, &gVtoyBlockDevicePathGuid))
|
||||||
|
{
|
||||||
|
CurId = StrDecimalToUintn((CHAR16 *)(venPath + 1) + StrLen(L"ventoy_"));
|
||||||
|
MaxId = MAX(MaxId, CurId);
|
||||||
|
Find = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FreePool(Handles);
|
||||||
|
|
||||||
|
return Find ? (MaxId + 1) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
EFI_STATUS EFIAPI ventoy_fill_device_path(VOID)
|
EFI_STATUS EFIAPI ventoy_fill_device_path(VOID)
|
||||||
{
|
{
|
||||||
|
UINTN CurVtoyDpId = 0;
|
||||||
UINTN NameLen = 0;
|
UINTN NameLen = 0;
|
||||||
UINT8 TmpBuf[128] = {0};
|
UINT8 TmpBuf[128] = {0};
|
||||||
VENDOR_DEVICE_PATH *venPath = NULL;
|
VENDOR_DEVICE_PATH *venPath = NULL;
|
||||||
|
CHAR16 VtoyDpName[32];
|
||||||
|
|
||||||
|
CurVtoyDpId = ventoy_get_current_device_path_id();
|
||||||
|
UnicodeSPrintAsciiFormat(VtoyDpName, sizeof(VtoyDpName), "ventoy_%03lu", CurVtoyDpId);
|
||||||
|
|
||||||
venPath = (VENDOR_DEVICE_PATH *)TmpBuf;
|
venPath = (VENDOR_DEVICE_PATH *)TmpBuf;
|
||||||
NameLen = StrSize(VTOY_BLOCK_DEVICE_PATH_NAME);
|
NameLen = StrSize(VtoyDpName);
|
||||||
venPath->Header.Type = HARDWARE_DEVICE_PATH;
|
venPath->Header.Type = HARDWARE_DEVICE_PATH;
|
||||||
venPath->Header.SubType = HW_VENDOR_DP;
|
venPath->Header.SubType = HW_VENDOR_DP;
|
||||||
venPath->Header.Length[0] = sizeof(VENDOR_DEVICE_PATH) + NameLen;
|
venPath->Header.Length[0] = sizeof(VENDOR_DEVICE_PATH) + NameLen;
|
||||||
venPath->Header.Length[1] = 0;
|
venPath->Header.Length[1] = 0;
|
||||||
CopyMem(&venPath->Guid, &gVtoyBlockDevicePathGuid, sizeof(EFI_GUID));
|
CopyMem(&venPath->Guid, &gVtoyBlockDevicePathGuid, sizeof(EFI_GUID));
|
||||||
CopyMem(venPath + 1, VTOY_BLOCK_DEVICE_PATH_NAME, NameLen);
|
CopyMem(venPath + 1, VtoyDpName, NameLen);
|
||||||
|
|
||||||
gBlockData.Path = AppendDevicePathNode(NULL, (EFI_DEVICE_PATH_PROTOCOL *)TmpBuf);
|
gBlockData.Path = AppendDevicePathNode(NULL, (EFI_DEVICE_PATH_PROTOCOL *)TmpBuf);
|
||||||
gBlockData.DevicePathCompareLen = sizeof(VENDOR_DEVICE_PATH) + NameLen;
|
gBlockData.DevicePathCompareLen = sizeof(VENDOR_DEVICE_PATH) + NameLen;
|
||||||
|
|
||||||
debug("gBlockData.Path=<%s>\n", ConvertDevicePathToText(gBlockData.Path, FALSE, FALSE));
|
debug("gBlockData.Path=<%lu><%s>\n", CurVtoyDpId, ConvertDevicePathToText(gBlockData.Path, FALSE, FALSE));
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -613,11 +727,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = Name2Protocol->GetDriverName(Name2Protocol, "en", &DriverName);
|
VENTOY_GET_COMPONENT_NAME(Name2Protocol, DriverName);
|
||||||
if (EFI_ERROR(Status) || NULL == DriverName)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StrStr(DriverName, DrvName))
|
if (StrStr(DriverName, DrvName))
|
||||||
{
|
{
|
||||||
@@ -655,11 +765,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = NameProtocol->GetDriverName(NameProtocol, "en", &DriverName);
|
VENTOY_GET_COMPONENT_NAME(NameProtocol, DriverName);
|
||||||
if (EFI_ERROR(Status))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StrStr(DriverName, DrvName))
|
if (StrStr(DriverName, DrvName))
|
||||||
{
|
{
|
||||||
@@ -684,6 +790,223 @@ end:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
STATIC BOOLEAN ventoy_filesystem_need_wrapper(IN CONST CHAR16 *DrvName)
|
||||||
|
{
|
||||||
|
UINTN i;
|
||||||
|
CHAR16 UpperDrvName[256];
|
||||||
|
|
||||||
|
StrCpyS(UpperDrvName, 256, DrvName);
|
||||||
|
|
||||||
|
for (i = 0; i < 256 && UpperDrvName[i]; i++)
|
||||||
|
{
|
||||||
|
if (UpperDrvName[i] >= 'a' && UpperDrvName[i] <= 'z')
|
||||||
|
{
|
||||||
|
UpperDrvName[i] = 'A' + (UpperDrvName[i] - 'a');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* suppress some file system drivers
|
||||||
|
* 1. rEFInd File System Driver
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (StrStr(UpperDrvName, L"REFIND") && StrStr(UpperDrvName, L"FILE SYSTEM"))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC VOID ventoy_add_filesystem_wrapper
|
||||||
|
(
|
||||||
|
IN EFI_DRIVER_BINDING_PROTOCOL *DriverBindProtocol,
|
||||||
|
IN CONST CHAR16 *DriverName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN j;
|
||||||
|
|
||||||
|
if (g_DriverBindWrapperCnt >= MAX_DRIVER_BIND_WRAPPER)
|
||||||
|
{
|
||||||
|
debug("driver binding wrapper overflow %lu", g_DriverBindWrapperCnt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ventoy_filesystem_need_wrapper(DriverName))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < g_DriverBindWrapperCnt; j++)
|
||||||
|
{
|
||||||
|
if (g_DriverBindWrapperList[j].DriverBinding == DriverBindProtocol)
|
||||||
|
{
|
||||||
|
debug("Duplicate driverbinding <%s> %p %lu %lu", DriverName, DriverBindProtocol, j, g_DriverBindWrapperCnt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j >= g_DriverBindWrapperCnt)
|
||||||
|
{
|
||||||
|
g_DriverBindWrapperList[g_DriverBindWrapperCnt].DriverBinding = DriverBindProtocol;
|
||||||
|
g_DriverBindWrapperList[g_DriverBindWrapperCnt].pfOldSupport = DriverBindProtocol->Supported;
|
||||||
|
g_DriverBindWrapperCnt++;
|
||||||
|
debug("Add driverbinding <%s> %p %lu", DriverName, DriverBindProtocol, g_DriverBindWrapperCnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS ventoy_find_filesystem_driverbind(VOID)
|
||||||
|
{
|
||||||
|
UINTN i = 0;
|
||||||
|
UINTN Count = 0;
|
||||||
|
CHAR16 *DriverName = NULL;
|
||||||
|
EFI_HANDLE *Handles = NULL;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL;
|
||||||
|
EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL;
|
||||||
|
EFI_DRIVER_BINDING_PROTOCOL *DriverBindProtocol = NULL;
|
||||||
|
|
||||||
|
debug("ventoy_find_filesystem_driverbind...");
|
||||||
|
|
||||||
|
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid,
|
||||||
|
NULL, &Count, &Handles);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
Status = gBS->HandleProtocol(Handles[i], &gEfiComponentName2ProtocolGuid, (VOID **)&Name2Protocol);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
VENTOY_GET_COMPONENT_NAME(Name2Protocol, DriverName);
|
||||||
|
|
||||||
|
Status = gBS->HandleProtocol(Handles[i], &gEfiDriverBindingProtocolGuid, (VOID **)&DriverBindProtocol);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
debug("### 2 No DriverBind <%s> <%r>", DriverName, Status);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_add_filesystem_wrapper(DriverBindProtocol, DriverName);
|
||||||
|
}
|
||||||
|
|
||||||
|
Count = 0;
|
||||||
|
FreePool(Handles);
|
||||||
|
Handles = NULL;
|
||||||
|
|
||||||
|
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid,
|
||||||
|
NULL, &Count, &Handles);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
Status = gBS->HandleProtocol(Handles[i], &gEfiComponentNameProtocolGuid, (VOID **)&NameProtocol);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
VENTOY_GET_COMPONENT_NAME(NameProtocol, DriverName);
|
||||||
|
|
||||||
|
Status = gBS->HandleProtocol(Handles[i], &gEfiDriverBindingProtocolGuid, (VOID **)&DriverBindProtocol);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
debug("### 1 No DriverBind <%s> <%r>", DriverName, Status);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_add_filesystem_wrapper(DriverBindProtocol, DriverName);
|
||||||
|
}
|
||||||
|
|
||||||
|
FreePool(Handles);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_wrapper_driver_bind_support
|
||||||
|
(
|
||||||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN i;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL;
|
||||||
|
EFI_DRIVER_BINDING_SUPPORTED pfOldSupport = NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < g_DriverBindWrapperCnt; i++)
|
||||||
|
{
|
||||||
|
if (g_DriverBindWrapperList[i].DriverBinding == This)
|
||||||
|
{
|
||||||
|
pfOldSupport = g_DriverBindWrapperList[i].pfOldSupport;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("ventoy_wrapper_driver_bind_support %lu %p", i, pfOldSupport);
|
||||||
|
|
||||||
|
if (!pfOldSupport)
|
||||||
|
{
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->HandleProtocol(ControllerHandle, &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == CompareMem(gBlockData.Path, DevicePath, gBlockData.DevicePathCompareLen))
|
||||||
|
{
|
||||||
|
debug("return EFI_UNSUPPORTED for ventoy");
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
return pfOldSupport(This, ControllerHandle, RemainingDevicePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS ventoy_disable_ex_filesystem(VOID)
|
||||||
|
{
|
||||||
|
UINTN i;
|
||||||
|
|
||||||
|
ventoy_find_filesystem_driverbind();
|
||||||
|
|
||||||
|
for (i = 0; i < g_DriverBindWrapperCnt; i++)
|
||||||
|
{
|
||||||
|
g_DriverBindWrapperList[i].DriverBinding->Supported = ventoy_wrapper_driver_bind_support;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("Wrapper Ex Driver Binding %lu", g_DriverBindWrapperCnt);
|
||||||
|
ventoy_debug_pause();
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS ventoy_enable_ex_filesystem(VOID)
|
||||||
|
{
|
||||||
|
UINTN i;
|
||||||
|
|
||||||
|
for (i = 0; i < g_DriverBindWrapperCnt; i++)
|
||||||
|
{
|
||||||
|
g_DriverBindWrapperList[i].DriverBinding->Supported = g_DriverBindWrapperList[i].pfOldSupport;
|
||||||
|
}
|
||||||
|
g_DriverBindWrapperCnt = 0;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
EFI_STATUS EFIAPI ventoy_block_io_read_512
|
EFI_STATUS EFIAPI ventoy_block_io_read_512
|
||||||
(
|
(
|
||||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||||
@@ -698,7 +1021,7 @@ EFI_STATUS EFIAPI ventoy_block_io_read_512
|
|||||||
UINT8 *CurBuf = NULL;
|
UINT8 *CurBuf = NULL;
|
||||||
EFI_STATUS Status = EFI_SUCCESS;
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
|
||||||
debug("ventoy_block_io_read_512 %lu %lu\n", Lba, BufferSize / 512);
|
debug("ventoy_block_io_read_512 %lu %lu Buffer:%p\n", Lba, BufferSize / 512, Buffer);
|
||||||
|
|
||||||
CurBuf = (UINT8 *)Buffer;
|
CurBuf = (UINT8 *)Buffer;
|
||||||
|
|
||||||
@@ -818,14 +1141,15 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im
|
|||||||
{
|
{
|
||||||
gBlockData.Media.BlockSize = 512;
|
gBlockData.Media.BlockSize = 512;
|
||||||
gBlockData.Media.LastBlock = ImgSize / 512 - 1;
|
gBlockData.Media.LastBlock = ImgSize / 512 - 1;
|
||||||
|
gBlockData.Media.ReadOnly = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gBlockData.Media.BlockSize = 2048;
|
gBlockData.Media.BlockSize = 2048;
|
||||||
gBlockData.Media.LastBlock = ImgSize / 2048 - 1;
|
gBlockData.Media.LastBlock = ImgSize / 2048 - 1;
|
||||||
|
gBlockData.Media.ReadOnly = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gBlockData.Media.ReadOnly = TRUE;
|
|
||||||
gBlockData.Media.MediaPresent = 1;
|
gBlockData.Media.MediaPresent = 1;
|
||||||
gBlockData.Media.LogicalBlocksPerPhysicalBlock = 1;
|
gBlockData.Media.LogicalBlocksPerPhysicalBlock = 1;
|
||||||
|
|
||||||
@@ -924,6 +1248,15 @@ ventoy_wrapper_file_flush_ex(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token)
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Ex version */
|
||||||
|
STATIC EFI_STATUS EFIAPI
|
||||||
|
ventoy_wrapper_file_flush_ex_img(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token)
|
||||||
|
{
|
||||||
|
(VOID)This;
|
||||||
|
(VOID)Token;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC EFI_STATUS EFIAPI
|
STATIC EFI_STATUS EFIAPI
|
||||||
ventoy_wrapper_file_write(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
|
ventoy_wrapper_file_write(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
|
||||||
@@ -949,19 +1282,20 @@ ventoy_wrapper_file_close(EFI_FILE_HANDLE This)
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC EFI_STATUS EFIAPI
|
STATIC EFI_STATUS EFIAPI
|
||||||
ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
|
ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
|
||||||
{
|
{
|
||||||
(VOID)This;
|
ventoy_efi_file_replace *replace = NULL;
|
||||||
|
|
||||||
if (Position <= g_efi_file_replace.FileSizeBytes)
|
ASSIGN_REPLACE(This, replace);
|
||||||
|
|
||||||
|
if (Position <= replace->FileSizeBytes)
|
||||||
{
|
{
|
||||||
g_efi_file_replace.CurPos = Position;
|
replace->CurPos = Position;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_efi_file_replace.CurPos = g_efi_file_replace.FileSizeBytes;
|
replace->CurPos = replace->FileSizeBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@@ -970,9 +1304,11 @@ ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
|
|||||||
STATIC EFI_STATUS EFIAPI
|
STATIC EFI_STATUS EFIAPI
|
||||||
ventoy_wrapper_file_get_pos(EFI_FILE_HANDLE This, UINT64 *Position)
|
ventoy_wrapper_file_get_pos(EFI_FILE_HANDLE This, UINT64 *Position)
|
||||||
{
|
{
|
||||||
(VOID)This;
|
ventoy_efi_file_replace *replace = NULL;
|
||||||
|
|
||||||
*Position = g_efi_file_replace.CurPos;
|
ASSIGN_REPLACE(This, replace);
|
||||||
|
|
||||||
|
*Position = replace->CurPos;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -982,6 +1318,9 @@ STATIC EFI_STATUS EFIAPI
|
|||||||
ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, VOID *Data)
|
ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, VOID *Data)
|
||||||
{
|
{
|
||||||
EFI_FILE_INFO *Info = (EFI_FILE_INFO *) Data;
|
EFI_FILE_INFO *Info = (EFI_FILE_INFO *) Data;
|
||||||
|
ventoy_efi_file_replace *replace = NULL;
|
||||||
|
|
||||||
|
ASSIGN_REPLACE(This, replace);
|
||||||
|
|
||||||
debug("ventoy_wrapper_file_get_info ... %u", *Len);
|
debug("ventoy_wrapper_file_get_info ... %u", *Len);
|
||||||
|
|
||||||
@@ -999,8 +1338,8 @@ ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, V
|
|||||||
ZeroMem(Data, sizeof(EFI_FILE_INFO));
|
ZeroMem(Data, sizeof(EFI_FILE_INFO));
|
||||||
|
|
||||||
Info->Size = sizeof(EFI_FILE_INFO);
|
Info->Size = sizeof(EFI_FILE_INFO);
|
||||||
Info->FileSize = g_efi_file_replace.FileSizeBytes;
|
Info->FileSize = replace->FileSizeBytes;
|
||||||
Info->PhysicalSize = g_efi_file_replace.FileSizeBytes;
|
Info->PhysicalSize = replace->FileSizeBytes;
|
||||||
Info->Attribute = EFI_FILE_READ_ONLY;
|
Info->Attribute = EFI_FILE_READ_ONLY;
|
||||||
//Info->FileName = EFI_FILE_READ_ONLY;
|
//Info->FileName = EFI_FILE_READ_ONLY;
|
||||||
|
|
||||||
@@ -1014,23 +1353,24 @@ ventoy_wrapper_file_read(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
|
|||||||
{
|
{
|
||||||
EFI_LBA Lba;
|
EFI_LBA Lba;
|
||||||
UINTN ReadLen = *Len;
|
UINTN ReadLen = *Len;
|
||||||
|
ventoy_efi_file_replace *replace = NULL;
|
||||||
(VOID)This;
|
|
||||||
|
|
||||||
|
ASSIGN_REPLACE(This, replace);
|
||||||
|
|
||||||
debug("ventoy_wrapper_file_read ... %u", *Len);
|
debug("ventoy_wrapper_file_read ... %u", *Len);
|
||||||
|
|
||||||
if (g_efi_file_replace.CurPos + ReadLen > g_efi_file_replace.FileSizeBytes)
|
if (replace->CurPos + ReadLen > replace->FileSizeBytes)
|
||||||
{
|
{
|
||||||
ReadLen = g_efi_file_replace.FileSizeBytes - g_efi_file_replace.CurPos;
|
ReadLen = replace->FileSizeBytes - replace->CurPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
Lba = g_efi_file_replace.CurPos / 2048 + g_efi_file_replace.BlockIoSectorStart;
|
Lba = replace->CurPos / 2048 + replace->BlockIoSectorStart;
|
||||||
|
|
||||||
ventoy_block_io_read(NULL, 0, Lba, ReadLen, Data);
|
ventoy_block_io_read(NULL, 0, Lba, ReadLen, Data);
|
||||||
|
|
||||||
*Len = ReadLen;
|
*Len = ReadLen;
|
||||||
|
|
||||||
g_efi_file_replace.CurPos += ReadLen;
|
replace->CurPos += ReadLen;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -1041,7 +1381,7 @@ ventoy_wrapper_file_read_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN
|
|||||||
return ventoy_wrapper_file_read(This, &(Token->BufferSize), Token->Buffer);
|
return ventoy_wrapper_file_read(This, &(Token->BufferSize), Token->Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File)
|
STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, BOOLEAN Img)
|
||||||
{
|
{
|
||||||
File->Revision = EFI_FILE_PROTOCOL_REVISION2;
|
File->Revision = EFI_FILE_PROTOCOL_REVISION2;
|
||||||
File->Open = ventoy_wrapper_fs_open;
|
File->Open = ventoy_wrapper_fs_open;
|
||||||
@@ -1057,7 +1397,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File)
|
|||||||
File->OpenEx = ventoy_wrapper_file_open_ex;
|
File->OpenEx = ventoy_wrapper_file_open_ex;
|
||||||
File->ReadEx = ventoy_wrapper_file_read_ex;
|
File->ReadEx = ventoy_wrapper_file_read_ex;
|
||||||
File->WriteEx = ventoy_wrapper_file_write_ex;
|
File->WriteEx = ventoy_wrapper_file_write_ex;
|
||||||
File->FlushEx = ventoy_wrapper_file_flush_ex;
|
File->FlushEx = Img ? ventoy_wrapper_file_flush_ex_img : ventoy_wrapper_file_flush_ex;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -1076,16 +1416,28 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
|||||||
UINT64 Sectors = 0;
|
UINT64 Sectors = 0;
|
||||||
EFI_STATUS Status = EFI_SUCCESS;
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
CHAR8 TmpName[256];
|
CHAR8 TmpName[256];
|
||||||
|
CHAR8 OldName[256];
|
||||||
ventoy_virt_chunk *virt = NULL;
|
ventoy_virt_chunk *virt = NULL;
|
||||||
|
|
||||||
debug("## ventoy_wrapper_file_open <%s> ", Name);
|
debug("## ventoy_wrapper_file_open <%s> ", Name);
|
||||||
|
|
||||||
|
if ((Mode & EFI_FILE_MODE_WRITE) > 0 && StrCmp(Name, L"\\loader\\random-seed") == 0)
|
||||||
|
{
|
||||||
|
if (gDebugPrint)
|
||||||
|
{
|
||||||
|
debug("## ventoy_wrapper_file_open return NOT_FOUND for random-seed %lx", Mode);
|
||||||
|
sleep(3);
|
||||||
|
}
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
Status = g_original_fopen(This, New, Name, Mode, Attributes);
|
Status = g_original_fopen(This, New, Name, Mode, Attributes);
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC &&
|
if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC &&
|
||||||
g_file_replace_list->new_file_virtual_id < g_virt_chunk_num)
|
g_file_replace_list->new_file_virtual_id < g_virt_chunk_num)
|
||||||
{
|
{
|
||||||
@@ -1096,7 +1448,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
|||||||
{
|
{
|
||||||
g_original_fclose(*New);
|
g_original_fclose(*New);
|
||||||
*New = &g_efi_file_replace.WrapperHandle;
|
*New = &g_efi_file_replace.WrapperHandle;
|
||||||
ventoy_wrapper_file_procotol(*New);
|
ventoy_wrapper_file_procotol(*New, FALSE);
|
||||||
|
|
||||||
virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id;
|
virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id;
|
||||||
|
|
||||||
@@ -1122,6 +1474,49 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (g_img_replace_list && g_img_replace_list->magic == GRUB_IMG_REPLACE_MAGIC &&
|
||||||
|
g_img_replace_list->new_file_virtual_id < g_virt_chunk_num)
|
||||||
|
{
|
||||||
|
AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name);
|
||||||
|
for (j = 0; j < g_img_replace_list->old_file_cnt; j++)
|
||||||
|
{
|
||||||
|
AsciiStrCpyS(OldName, sizeof(OldName), g_img_replace_list[i].old_file_name[j]);
|
||||||
|
if ((0 == AsciiStrCmp(OldName, TmpName)) ||
|
||||||
|
(AsciiStrnCmp(OldName, "\\loader\\entries\\", 16) == 0 &&
|
||||||
|
AsciiStrCmp(OldName + 16, TmpName) == 0
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
g_original_fclose(*New);
|
||||||
|
*New = &g_img_file_replace.WrapperHandle;
|
||||||
|
ventoy_wrapper_file_procotol(*New, TRUE);
|
||||||
|
|
||||||
|
virt = g_virt_chunk + g_img_replace_list->new_file_virtual_id;
|
||||||
|
|
||||||
|
Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start);
|
||||||
|
|
||||||
|
g_img_file_replace.BlockIoSectorStart = virt->mem_sector_start;
|
||||||
|
g_img_file_replace.FileSizeBytes = Sectors * 2048;
|
||||||
|
|
||||||
|
if (gDebugPrint)
|
||||||
|
{
|
||||||
|
debug("## ventoy_wrapper_file_open2 <%s> BlockStart:%lu Sectors:%lu Bytes:%lu", Name,
|
||||||
|
g_img_file_replace.BlockIoSectorStart, Sectors, Sectors * 2048);
|
||||||
|
sleep(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StrCmp(Name, L"\\loader\\entries") == 0)
|
||||||
|
{
|
||||||
|
(*New)->Open = ventoy_wrapper_file_open;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,140 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* VtoyDrv.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||||
|
*
|
||||||
|
* This program 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.
|
||||||
|
*
|
||||||
|
* This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Uefi.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/PrintLib.h>
|
||||||
|
#include <Library/UefiLib.h>
|
||||||
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
#include <Library/DevicePathLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
|
#include <Library/UefiApplicationEntryPoint.h>
|
||||||
|
#include <Protocol/LoadedImage.h>
|
||||||
|
#include <Guid/FileInfo.h>
|
||||||
|
#include <Guid/FileSystemInfo.h>
|
||||||
|
#include <Protocol/BlockIo.h>
|
||||||
|
#include <Protocol/RamDisk.h>
|
||||||
|
#include <Protocol/SimpleFileSystem.h>
|
||||||
|
#include <VtoyUtil.h>
|
||||||
|
|
||||||
|
STATIC UINTN g_EfiDriverNameCnt = 0;
|
||||||
|
STATIC CHAR16 *g_EfiDriverNameList[1024] = { NULL };
|
||||||
|
|
||||||
|
STATIC EFI_STATUS AddEfiDriverName(IN CHAR16 *DriverName)
|
||||||
|
{
|
||||||
|
UINTN i = 0;
|
||||||
|
|
||||||
|
if (g_EfiDriverNameCnt >= 1024)
|
||||||
|
{
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < g_EfiDriverNameCnt; i++)
|
||||||
|
{
|
||||||
|
if (g_EfiDriverNameList[i] && StrCmp(g_EfiDriverNameList[i], DriverName) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= g_EfiDriverNameCnt)
|
||||||
|
{
|
||||||
|
g_EfiDriverNameList[g_EfiDriverNameCnt] = DriverName;
|
||||||
|
g_EfiDriverNameCnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS ShowEfiDrivers(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine)
|
||||||
|
{
|
||||||
|
UINTN i = 0;
|
||||||
|
UINTN Count = 0;
|
||||||
|
CHAR16 *DriverName = NULL;
|
||||||
|
EFI_HANDLE *Handles = NULL;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL;
|
||||||
|
EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL;
|
||||||
|
|
||||||
|
(VOID)ImageHandle;
|
||||||
|
(VOID)CmdLine;
|
||||||
|
|
||||||
|
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid,
|
||||||
|
NULL, &Count, &Handles);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
Status = gBS->HandleProtocol(Handles[i], &gEfiComponentName2ProtocolGuid, (VOID **)&Name2Protocol);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DriverName = NULL;
|
||||||
|
Status = VtoyGetComponentName(2, Name2Protocol, &DriverName);
|
||||||
|
if ((!EFI_ERROR(Status)) && (DriverName))
|
||||||
|
{
|
||||||
|
AddEfiDriverName(DriverName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Count = 0;
|
||||||
|
FreePool(Handles);
|
||||||
|
Handles = NULL;
|
||||||
|
|
||||||
|
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid,
|
||||||
|
NULL, &Count, &Handles);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
Status = gBS->HandleProtocol(Handles[i], &gEfiComponentNameProtocolGuid, (VOID **)&NameProtocol);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DriverName = NULL;
|
||||||
|
Status = VtoyGetComponentName(1, Name2Protocol, &DriverName);
|
||||||
|
if ((!EFI_ERROR(Status)) && (DriverName))
|
||||||
|
{
|
||||||
|
AddEfiDriverName(DriverName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FreePool(Handles);
|
||||||
|
|
||||||
|
for (i = 0; i < g_EfiDriverNameCnt; i++)
|
||||||
|
{
|
||||||
|
Printf("%2d %s\n", i, g_EfiDriverNameList[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -44,8 +44,39 @@ STATIC grub_env_printf_pf g_env_printf = NULL;
|
|||||||
STATIC VtoyUtilFeature gFeatureList[] =
|
STATIC VtoyUtilFeature gFeatureList[] =
|
||||||
{
|
{
|
||||||
{ L"fix_windows_mmap", FixWindowsMemhole },
|
{ L"fix_windows_mmap", FixWindowsMemhole },
|
||||||
|
{ L"show_efi_drivers", ShowEfiDrivers },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EFI_STATUS VtoyGetComponentName(IN UINTN Ver, IN VOID *Protocol, OUT CHAR16 **DriverName)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
CHAR16 *DrvName = NULL;
|
||||||
|
EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL;
|
||||||
|
EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL;
|
||||||
|
|
||||||
|
if (1 == Ver)
|
||||||
|
{
|
||||||
|
NameProtocol = (EFI_COMPONENT_NAME_PROTOCOL *)Protocol;
|
||||||
|
Status = NameProtocol->GetDriverName(Protocol, "en", &DrvName);
|
||||||
|
if (EFI_ERROR(Status) || NULL == DrvName)
|
||||||
|
{
|
||||||
|
Status = NameProtocol->GetDriverName(Protocol, "eng", &DrvName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Name2Protocol = (EFI_COMPONENT_NAME2_PROTOCOL *)Protocol;
|
||||||
|
Status = Name2Protocol->GetDriverName(Protocol, "en", &DrvName);
|
||||||
|
if (EFI_ERROR(Status) || NULL == DrvName)
|
||||||
|
{
|
||||||
|
Status = Name2Protocol->GetDriverName(Protocol, "eng", &DrvName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*DriverName = DrvName;
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...)
|
VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...)
|
||||||
{
|
{
|
||||||
VA_LIST Marker;
|
VA_LIST Marker;
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ typedef struct ventoy_grub_param
|
|||||||
grub_env_get_pf grub_env_get;
|
grub_env_get_pf grub_env_get;
|
||||||
grub_env_set_pf grub_env_set;
|
grub_env_set_pf grub_env_set;
|
||||||
ventoy_grub_param_file_replace file_replace;
|
ventoy_grub_param_file_replace file_replace;
|
||||||
|
ventoy_grub_param_file_replace img_replace;
|
||||||
grub_env_printf_pf grub_env_printf;
|
grub_env_printf_pf grub_env_printf;
|
||||||
}ventoy_grub_param;
|
}ventoy_grub_param;
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
@@ -57,7 +58,9 @@ VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...);
|
|||||||
#define debug(expr, ...) if (gVtoyDebugPrint) VtoyUtilDebug("[VTOY] "expr"\n", ##__VA_ARGS__)
|
#define debug(expr, ...) if (gVtoyDebugPrint) VtoyUtilDebug("[VTOY] "expr"\n", ##__VA_ARGS__)
|
||||||
#define Printf VtoyUtilDebug
|
#define Printf VtoyUtilDebug
|
||||||
|
|
||||||
|
EFI_STATUS VtoyGetComponentName(IN UINTN Ver, IN VOID *Protocol, OUT CHAR16 **DriverName);
|
||||||
EFI_STATUS FixWindowsMemhole(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine);
|
EFI_STATUS FixWindowsMemhole(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine);
|
||||||
|
EFI_STATUS ShowEfiDrivers(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
[Sources]
|
[Sources]
|
||||||
VtoyUtil.h
|
VtoyUtil.h
|
||||||
VtoyUtil.c
|
VtoyUtil.c
|
||||||
|
VtoyDrv.c
|
||||||
Memhole.c
|
Memhole.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
|
|||||||
2123
GRUB2/MOD_SRC/grub-2.04/configure.ac
Normal file
2123
GRUB2/MOD_SRC/grub-2.04/configure.ac
Normal file
File diff suppressed because it is too large
Load Diff
909
GRUB2/MOD_SRC/grub-2.04/gentpl.py
Normal file
909
GRUB2/MOD_SRC/grub-2.04/gentpl.py
Normal file
@@ -0,0 +1,909 @@
|
|||||||
|
#! /usr/bin/python
|
||||||
|
# GRUB -- GRand Unified Bootloader
|
||||||
|
# Copyright (C) 2010,2011,2012,2013 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
from optparse import OptionParser
|
||||||
|
import re
|
||||||
|
|
||||||
|
#
|
||||||
|
# This is the python script used to generate Makefile.*.am
|
||||||
|
#
|
||||||
|
|
||||||
|
GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot",
|
||||||
|
"i386_multiboot", "i386_ieee1275", "x86_64_efi",
|
||||||
|
"i386_xen", "x86_64_xen", "i386_xen_pvh",
|
||||||
|
"mips_loongson", "mips64_efi", "sparc64_ieee1275",
|
||||||
|
"powerpc_ieee1275", "mips_arc", "ia64_efi",
|
||||||
|
"mips_qemu_mips", "arm_uboot", "arm_efi", "arm64_efi",
|
||||||
|
"arm_coreboot", "riscv32_efi", "riscv64_efi" ]
|
||||||
|
|
||||||
|
GROUPS = {}
|
||||||
|
|
||||||
|
GROUPS["common"] = GRUB_PLATFORMS[:]
|
||||||
|
|
||||||
|
# Groups based on CPU
|
||||||
|
GROUPS["i386"] = [ "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", "i386_multiboot", "i386_ieee1275" ]
|
||||||
|
GROUPS["x86_64"] = [ "x86_64_efi" ]
|
||||||
|
GROUPS["x86"] = GROUPS["i386"] + GROUPS["x86_64"]
|
||||||
|
GROUPS["mips"] = [ "mips_loongson", "mips_qemu_mips", "mips_arc" ]
|
||||||
|
GROUPS["mips64"] = [ "mips64_efi" ]
|
||||||
|
GROUPS["sparc64"] = [ "sparc64_ieee1275" ]
|
||||||
|
GROUPS["powerpc"] = [ "powerpc_ieee1275" ]
|
||||||
|
GROUPS["arm"] = [ "arm_uboot", "arm_efi", "arm_coreboot" ]
|
||||||
|
GROUPS["arm64"] = [ "arm64_efi" ]
|
||||||
|
GROUPS["riscv32"] = [ "riscv32_efi" ]
|
||||||
|
GROUPS["riscv64"] = [ "riscv64_efi" ]
|
||||||
|
|
||||||
|
# Groups based on firmware
|
||||||
|
GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi", "arm64_efi", "mips64_efi",
|
||||||
|
"riscv32_efi", "riscv64_efi" ]
|
||||||
|
GROUPS["ieee1275"] = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ]
|
||||||
|
GROUPS["uboot"] = [ "arm_uboot" ]
|
||||||
|
GROUPS["xen"] = [ "i386_xen", "x86_64_xen" ]
|
||||||
|
GROUPS["coreboot"] = [ "i386_coreboot", "arm_coreboot" ]
|
||||||
|
|
||||||
|
# emu is a special case so many core functionality isn't needed on this platform
|
||||||
|
GROUPS["noemu"] = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
|
||||||
|
|
||||||
|
# Groups based on hardware features
|
||||||
|
GROUPS["cmos"] = GROUPS["x86"][:] + ["mips_loongson", "mips_qemu_mips",
|
||||||
|
"sparc64_ieee1275", "powerpc_ieee1275"]
|
||||||
|
GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi");
|
||||||
|
GROUPS["pci"] = GROUPS["x86"] + ["mips_loongson"]
|
||||||
|
GROUPS["usb"] = GROUPS["pci"] + ["arm_coreboot"]
|
||||||
|
|
||||||
|
# If gfxterm is main output console integrate it into kernel
|
||||||
|
GROUPS["videoinkernel"] = ["mips_loongson", "i386_coreboot", "arm_coreboot" ]
|
||||||
|
GROUPS["videomodules"] = GRUB_PLATFORMS[:];
|
||||||
|
for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i)
|
||||||
|
|
||||||
|
# Similar for terminfo
|
||||||
|
GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips", "i386_xen_pvh" ] + GROUPS["xen"] + GROUPS["ieee1275"] + GROUPS["uboot"];
|
||||||
|
GROUPS["terminfomodule"] = GRUB_PLATFORMS[:];
|
||||||
|
for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i)
|
||||||
|
|
||||||
|
# Flattened Device Trees (FDT)
|
||||||
|
GROUPS["fdt"] = [ "arm64_efi", "arm_uboot", "arm_efi", "riscv32_efi", "riscv64_efi" ]
|
||||||
|
|
||||||
|
# Needs software helpers for division
|
||||||
|
# Must match GRUB_DIVISION_IN_SOFTWARE in misc.h
|
||||||
|
GROUPS["softdiv"] = GROUPS["arm"] + ["ia64_efi"] + GROUPS["riscv32"]
|
||||||
|
GROUPS["no_softdiv"] = GRUB_PLATFORMS[:]
|
||||||
|
for i in GROUPS["softdiv"]: GROUPS["no_softdiv"].remove(i)
|
||||||
|
|
||||||
|
# Miscellaneous groups scheduled to disappear in future
|
||||||
|
GROUPS["i386_coreboot_multiboot_qemu"] = ["i386_coreboot", "i386_multiboot", "i386_qemu"]
|
||||||
|
GROUPS["nopc"] = GRUB_PLATFORMS[:]; GROUPS["nopc"].remove("i386_pc")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Create platform => groups reverse map, where groups covering that
|
||||||
|
# platform are ordered by their sizes
|
||||||
|
#
|
||||||
|
RMAP = {}
|
||||||
|
for platform in GRUB_PLATFORMS:
|
||||||
|
# initialize with platform itself as a group
|
||||||
|
RMAP[platform] = [ platform ]
|
||||||
|
|
||||||
|
for k in GROUPS.keys():
|
||||||
|
v = GROUPS[k]
|
||||||
|
# skip groups that don't cover this platform
|
||||||
|
if platform not in v: continue
|
||||||
|
|
||||||
|
bigger = []
|
||||||
|
smaller = []
|
||||||
|
# partition currently known groups based on their size
|
||||||
|
for group in RMAP[platform]:
|
||||||
|
if group in GRUB_PLATFORMS: smaller.append(group)
|
||||||
|
elif len(GROUPS[group]) < len(v): smaller.append(group)
|
||||||
|
else: bigger.append(group)
|
||||||
|
# insert in the middle
|
||||||
|
RMAP[platform] = smaller + [ k ] + bigger
|
||||||
|
|
||||||
|
#
|
||||||
|
# Input
|
||||||
|
#
|
||||||
|
|
||||||
|
# We support a subset of the AutoGen definitions file syntax. Specifically,
|
||||||
|
# compound names are disallowed; some preprocessing directives are
|
||||||
|
# disallowed (though #if/#endif are allowed; note that, like AutoGen, #if
|
||||||
|
# skips everything to the next #endif regardless of the value of the
|
||||||
|
# conditional); and shell-generated strings, Scheme-generated strings, and
|
||||||
|
# here strings are disallowed.
|
||||||
|
|
||||||
|
class AutogenToken:
|
||||||
|
(autogen, definitions, eof, var_name, other_name, string, number,
|
||||||
|
semicolon, equals, comma, lbrace, rbrace, lbracket, rbracket) = range(14)
|
||||||
|
|
||||||
|
class AutogenState:
|
||||||
|
(init, need_def, need_tpl, need_semi, need_name, have_name, need_value,
|
||||||
|
need_idx, need_rbracket, indx_name, have_value, done) = range(12)
|
||||||
|
|
||||||
|
class AutogenParseError(Exception):
|
||||||
|
def __init__(self, message, path, line):
|
||||||
|
super(AutogenParseError, self).__init__(message)
|
||||||
|
self.path = path
|
||||||
|
self.line = line
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return (
|
||||||
|
super(AutogenParseError, self).__str__() +
|
||||||
|
" at file %s line %d" % (self.path, self.line))
|
||||||
|
|
||||||
|
class AutogenDefinition(list):
|
||||||
|
def __getitem__(self, key):
|
||||||
|
try:
|
||||||
|
return super(AutogenDefinition, self).__getitem__(key)
|
||||||
|
except TypeError:
|
||||||
|
for name, value in self:
|
||||||
|
if name == key:
|
||||||
|
return value
|
||||||
|
|
||||||
|
def __contains__(self, key):
|
||||||
|
for name, value in self:
|
||||||
|
if name == key:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get(self, key, default):
|
||||||
|
for name, value in self:
|
||||||
|
if name == key:
|
||||||
|
return value
|
||||||
|
else:
|
||||||
|
return default
|
||||||
|
|
||||||
|
def find_all(self, key):
|
||||||
|
for name, value in self:
|
||||||
|
if name == key:
|
||||||
|
yield value
|
||||||
|
|
||||||
|
class AutogenParser:
|
||||||
|
def __init__(self):
|
||||||
|
self.definitions = AutogenDefinition()
|
||||||
|
self.def_stack = [("", self.definitions)]
|
||||||
|
self.curdef = None
|
||||||
|
self.new_name = None
|
||||||
|
self.cur_path = None
|
||||||
|
self.cur_line = 0
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_unquotable_char(c):
|
||||||
|
return (ord(c) in range(ord("!"), ord("~") + 1) and
|
||||||
|
c not in "#,;<=>[\\]`{}?*'\"()")
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_value_name_char(c):
|
||||||
|
return c in ":^-_" or c.isalnum()
|
||||||
|
|
||||||
|
def error(self, message):
|
||||||
|
raise AutogenParseError(message, self.cur_file, self.cur_line)
|
||||||
|
|
||||||
|
def read_tokens(self, f):
|
||||||
|
data = f.read()
|
||||||
|
end = len(data)
|
||||||
|
offset = 0
|
||||||
|
while offset < end:
|
||||||
|
while offset < end and data[offset].isspace():
|
||||||
|
if data[offset] == "\n":
|
||||||
|
self.cur_line += 1
|
||||||
|
offset += 1
|
||||||
|
if offset >= end:
|
||||||
|
break
|
||||||
|
c = data[offset]
|
||||||
|
if c == "#":
|
||||||
|
offset += 1
|
||||||
|
try:
|
||||||
|
end_directive = data.index("\n", offset)
|
||||||
|
directive = data[offset:end_directive]
|
||||||
|
offset = end_directive
|
||||||
|
except ValueError:
|
||||||
|
directive = data[offset:]
|
||||||
|
offset = end
|
||||||
|
name, value = directive.split(None, 1)
|
||||||
|
if name == "if":
|
||||||
|
try:
|
||||||
|
end_if = data.index("\n#endif", offset)
|
||||||
|
new_offset = end_if + len("\n#endif")
|
||||||
|
self.cur_line += data[offset:new_offset].count("\n")
|
||||||
|
offset = new_offset
|
||||||
|
except ValueError:
|
||||||
|
self.error("#if without matching #endif")
|
||||||
|
else:
|
||||||
|
self.error("Unhandled directive '#%s'" % name)
|
||||||
|
elif c == "{":
|
||||||
|
yield AutogenToken.lbrace, c
|
||||||
|
offset += 1
|
||||||
|
elif c == "=":
|
||||||
|
yield AutogenToken.equals, c
|
||||||
|
offset += 1
|
||||||
|
elif c == "}":
|
||||||
|
yield AutogenToken.rbrace, c
|
||||||
|
offset += 1
|
||||||
|
elif c == "[":
|
||||||
|
yield AutogenToken.lbracket, c
|
||||||
|
offset += 1
|
||||||
|
elif c == "]":
|
||||||
|
yield AutogenToken.rbracket, c
|
||||||
|
offset += 1
|
||||||
|
elif c == ";":
|
||||||
|
yield AutogenToken.semicolon, c
|
||||||
|
offset += 1
|
||||||
|
elif c == ",":
|
||||||
|
yield AutogenToken.comma, c
|
||||||
|
offset += 1
|
||||||
|
elif c in ("'", '"'):
|
||||||
|
s = []
|
||||||
|
while True:
|
||||||
|
offset += 1
|
||||||
|
if offset >= end:
|
||||||
|
self.error("EOF in quoted string")
|
||||||
|
if data[offset] == "\n":
|
||||||
|
self.cur_line += 1
|
||||||
|
if data[offset] == "\\":
|
||||||
|
offset += 1
|
||||||
|
if offset >= end:
|
||||||
|
self.error("EOF in quoted string")
|
||||||
|
if data[offset] == "\n":
|
||||||
|
self.cur_line += 1
|
||||||
|
# Proper escaping unimplemented; this can be filled
|
||||||
|
# out if needed.
|
||||||
|
s.append("\\")
|
||||||
|
s.append(data[offset])
|
||||||
|
elif data[offset] == c:
|
||||||
|
offset += 1
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
s.append(data[offset])
|
||||||
|
yield AutogenToken.string, "".join(s)
|
||||||
|
elif c == "/":
|
||||||
|
offset += 1
|
||||||
|
if data[offset] == "*":
|
||||||
|
offset += 1
|
||||||
|
try:
|
||||||
|
end_comment = data.index("*/", offset)
|
||||||
|
new_offset = end_comment + len("*/")
|
||||||
|
self.cur_line += data[offset:new_offset].count("\n")
|
||||||
|
offset = new_offset
|
||||||
|
except ValueError:
|
||||||
|
self.error("/* without matching */")
|
||||||
|
elif data[offset] == "/":
|
||||||
|
try:
|
||||||
|
offset = data.index("\n", offset)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
elif (c.isdigit() or
|
||||||
|
(c == "-" and offset < end - 1 and
|
||||||
|
data[offset + 1].isdigit())):
|
||||||
|
end_number = offset + 1
|
||||||
|
while end_number < end and data[end_number].isdigit():
|
||||||
|
end_number += 1
|
||||||
|
yield AutogenToken.number, data[offset:end_number]
|
||||||
|
offset = end_number
|
||||||
|
elif self.is_unquotable_char(c):
|
||||||
|
end_name = offset
|
||||||
|
while (end_name < end and
|
||||||
|
self.is_value_name_char(data[end_name])):
|
||||||
|
end_name += 1
|
||||||
|
if end_name < end and self.is_unquotable_char(data[end_name]):
|
||||||
|
while (end_name < end and
|
||||||
|
self.is_unquotable_char(data[end_name])):
|
||||||
|
end_name += 1
|
||||||
|
yield AutogenToken.other_name, data[offset:end_name]
|
||||||
|
offset = end_name
|
||||||
|
else:
|
||||||
|
s = data[offset:end_name]
|
||||||
|
if s.lower() == "autogen":
|
||||||
|
yield AutogenToken.autogen, s
|
||||||
|
elif s.lower() == "definitions":
|
||||||
|
yield AutogenToken.definitions, s
|
||||||
|
else:
|
||||||
|
yield AutogenToken.var_name, s
|
||||||
|
offset = end_name
|
||||||
|
else:
|
||||||
|
self.error("Invalid input character '%s'" % c)
|
||||||
|
yield AutogenToken.eof, None
|
||||||
|
|
||||||
|
def do_need_name_end(self, token):
|
||||||
|
if len(self.def_stack) > 1:
|
||||||
|
self.error("Definition blocks were left open")
|
||||||
|
|
||||||
|
def do_need_name_var_name(self, token):
|
||||||
|
self.new_name = token
|
||||||
|
|
||||||
|
def do_end_block(self, token):
|
||||||
|
if len(self.def_stack) <= 1:
|
||||||
|
self.error("Too many close braces")
|
||||||
|
new_name, parent_def = self.def_stack.pop()
|
||||||
|
parent_def.append((new_name, self.curdef))
|
||||||
|
self.curdef = parent_def
|
||||||
|
|
||||||
|
def do_empty_val(self, token):
|
||||||
|
self.curdef.append((self.new_name, ""))
|
||||||
|
|
||||||
|
def do_str_value(self, token):
|
||||||
|
self.curdef.append((self.new_name, token))
|
||||||
|
|
||||||
|
def do_start_block(self, token):
|
||||||
|
self.def_stack.append((self.new_name, self.curdef))
|
||||||
|
self.curdef = AutogenDefinition()
|
||||||
|
|
||||||
|
def do_indexed_name(self, token):
|
||||||
|
self.new_name = token
|
||||||
|
|
||||||
|
def read_definitions_file(self, f):
|
||||||
|
self.curdef = self.definitions
|
||||||
|
self.cur_line = 0
|
||||||
|
state = AutogenState.init
|
||||||
|
|
||||||
|
# The following transition table was reduced from the Autogen
|
||||||
|
# documentation:
|
||||||
|
# info -f autogen -n 'Full Syntax'
|
||||||
|
transitions = {
|
||||||
|
AutogenState.init: {
|
||||||
|
AutogenToken.autogen: (AutogenState.need_def, None),
|
||||||
|
},
|
||||||
|
AutogenState.need_def: {
|
||||||
|
AutogenToken.definitions: (AutogenState.need_tpl, None),
|
||||||
|
},
|
||||||
|
AutogenState.need_tpl: {
|
||||||
|
AutogenToken.var_name: (AutogenState.need_semi, None),
|
||||||
|
AutogenToken.other_name: (AutogenState.need_semi, None),
|
||||||
|
AutogenToken.string: (AutogenState.need_semi, None),
|
||||||
|
},
|
||||||
|
AutogenState.need_semi: {
|
||||||
|
AutogenToken.semicolon: (AutogenState.need_name, None),
|
||||||
|
},
|
||||||
|
AutogenState.need_name: {
|
||||||
|
AutogenToken.autogen: (AutogenState.need_def, None),
|
||||||
|
AutogenToken.eof: (AutogenState.done, self.do_need_name_end),
|
||||||
|
AutogenToken.var_name: (
|
||||||
|
AutogenState.have_name, self.do_need_name_var_name),
|
||||||
|
AutogenToken.rbrace: (
|
||||||
|
AutogenState.have_value, self.do_end_block),
|
||||||
|
},
|
||||||
|
AutogenState.have_name: {
|
||||||
|
AutogenToken.semicolon: (
|
||||||
|
AutogenState.need_name, self.do_empty_val),
|
||||||
|
AutogenToken.equals: (AutogenState.need_value, None),
|
||||||
|
AutogenToken.lbracket: (AutogenState.need_idx, None),
|
||||||
|
},
|
||||||
|
AutogenState.need_value: {
|
||||||
|
AutogenToken.var_name: (
|
||||||
|
AutogenState.have_value, self.do_str_value),
|
||||||
|
AutogenToken.other_name: (
|
||||||
|
AutogenState.have_value, self.do_str_value),
|
||||||
|
AutogenToken.string: (
|
||||||
|
AutogenState.have_value, self.do_str_value),
|
||||||
|
AutogenToken.number: (
|
||||||
|
AutogenState.have_value, self.do_str_value),
|
||||||
|
AutogenToken.lbrace: (
|
||||||
|
AutogenState.need_name, self.do_start_block),
|
||||||
|
},
|
||||||
|
AutogenState.need_idx: {
|
||||||
|
AutogenToken.var_name: (
|
||||||
|
AutogenState.need_rbracket, self.do_indexed_name),
|
||||||
|
AutogenToken.number: (
|
||||||
|
AutogenState.need_rbracket, self.do_indexed_name),
|
||||||
|
},
|
||||||
|
AutogenState.need_rbracket: {
|
||||||
|
AutogenToken.rbracket: (AutogenState.indx_name, None),
|
||||||
|
},
|
||||||
|
AutogenState.indx_name: {
|
||||||
|
AutogenToken.semicolon: (
|
||||||
|
AutogenState.need_name, self.do_empty_val),
|
||||||
|
AutogenToken.equals: (AutogenState.need_value, None),
|
||||||
|
},
|
||||||
|
AutogenState.have_value: {
|
||||||
|
AutogenToken.semicolon: (AutogenState.need_name, None),
|
||||||
|
AutogenToken.comma: (AutogenState.need_value, None),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for code, token in self.read_tokens(f):
|
||||||
|
if code in transitions[state]:
|
||||||
|
state, handler = transitions[state][code]
|
||||||
|
if handler is not None:
|
||||||
|
handler(token)
|
||||||
|
else:
|
||||||
|
self.error(
|
||||||
|
"Parse error in state %s: unexpected token '%s'" % (
|
||||||
|
state, token))
|
||||||
|
if state == AutogenState.done:
|
||||||
|
break
|
||||||
|
|
||||||
|
def read_definitions(self, path):
|
||||||
|
self.cur_file = path
|
||||||
|
with open(path) as f:
|
||||||
|
self.read_definitions_file(f)
|
||||||
|
|
||||||
|
defparser = AutogenParser()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Output
|
||||||
|
#
|
||||||
|
|
||||||
|
outputs = {}
|
||||||
|
|
||||||
|
def output(s, section=''):
|
||||||
|
if s == "":
|
||||||
|
return
|
||||||
|
outputs.setdefault(section, [])
|
||||||
|
outputs[section].append(s)
|
||||||
|
|
||||||
|
def write_output(section=''):
|
||||||
|
for s in outputs.get(section, []):
|
||||||
|
print(s, end='')
|
||||||
|
|
||||||
|
#
|
||||||
|
# Global variables
|
||||||
|
#
|
||||||
|
|
||||||
|
def gvar_add(var, value):
|
||||||
|
output(var + " += " + value + "\n")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Per PROGRAM/SCRIPT variables
|
||||||
|
#
|
||||||
|
|
||||||
|
seen_vars = set()
|
||||||
|
|
||||||
|
def vars_init(defn, *var_list):
|
||||||
|
name = defn['name']
|
||||||
|
|
||||||
|
if name not in seen_target and name not in seen_vars:
|
||||||
|
for var in var_list:
|
||||||
|
output(var + " = \n", section='decl')
|
||||||
|
seen_vars.add(name)
|
||||||
|
|
||||||
|
def var_set(var, value):
|
||||||
|
output(var + " = " + value + "\n")
|
||||||
|
|
||||||
|
def var_add(var, value):
|
||||||
|
output(var + " += " + value + "\n")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Variable names and rules
|
||||||
|
#
|
||||||
|
|
||||||
|
canonical_name_re = re.compile(r'[^0-9A-Za-z@_]')
|
||||||
|
canonical_name_suffix = ""
|
||||||
|
|
||||||
|
def set_canonical_name_suffix(suffix):
|
||||||
|
global canonical_name_suffix
|
||||||
|
canonical_name_suffix = suffix
|
||||||
|
|
||||||
|
def cname(defn):
|
||||||
|
return canonical_name_re.sub('_', defn['name'] + canonical_name_suffix)
|
||||||
|
|
||||||
|
def rule(target, source, cmd):
|
||||||
|
if cmd[0] == "\n":
|
||||||
|
output("\n" + target + ": " + source + cmd.replace("\n", "\n\t") + "\n")
|
||||||
|
else:
|
||||||
|
output("\n" + target + ": " + source + "\n\t" + cmd.replace("\n", "\n\t") + "\n")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Handle keys with platform names as values, for example:
|
||||||
|
#
|
||||||
|
# kernel = {
|
||||||
|
# nostrip = emu;
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
def platform_tagged(defn, platform, tag):
|
||||||
|
for value in defn.find_all(tag):
|
||||||
|
for group in RMAP[platform]:
|
||||||
|
if value == group:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def if_platform_tagged(defn, platform, tag, snippet_if, snippet_else=None):
|
||||||
|
if platform_tagged(defn, platform, tag):
|
||||||
|
return snippet_if
|
||||||
|
elif snippet_else is not None:
|
||||||
|
return snippet_else
|
||||||
|
|
||||||
|
#
|
||||||
|
# Handle tagged values
|
||||||
|
#
|
||||||
|
# module = {
|
||||||
|
# extra_dist = ...
|
||||||
|
# extra_dist = ...
|
||||||
|
# ...
|
||||||
|
# };
|
||||||
|
#
|
||||||
|
def foreach_value(defn, tag, closure):
|
||||||
|
r = []
|
||||||
|
for value in defn.find_all(tag):
|
||||||
|
r.append(closure(value))
|
||||||
|
return ''.join(r)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Handle best matched values for a platform, for example:
|
||||||
|
#
|
||||||
|
# module = {
|
||||||
|
# cflags = '-Wall';
|
||||||
|
# emu_cflags = '-Wall -DGRUB_EMU=1';
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
def foreach_platform_specific_value(defn, platform, suffix, nonetag, closure):
|
||||||
|
r = []
|
||||||
|
for group in RMAP[platform]:
|
||||||
|
values = list(defn.find_all(group + suffix))
|
||||||
|
if values:
|
||||||
|
for value in values:
|
||||||
|
r.append(closure(value))
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
for value in defn.find_all(nonetag):
|
||||||
|
r.append(closure(value))
|
||||||
|
return ''.join(r)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Handle values from sum of all groups for a platform, for example:
|
||||||
|
#
|
||||||
|
# module = {
|
||||||
|
# common = kern/misc.c;
|
||||||
|
# emu = kern/emu/misc.c;
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
def foreach_platform_value(defn, platform, suffix, closure):
|
||||||
|
r = []
|
||||||
|
for group in RMAP[platform]:
|
||||||
|
for value in defn.find_all(group + suffix):
|
||||||
|
r.append(closure(value))
|
||||||
|
return ''.join(r)
|
||||||
|
|
||||||
|
def platform_conditional(platform, closure):
|
||||||
|
output("\nif COND_" + platform + "\n")
|
||||||
|
closure(platform)
|
||||||
|
output("endif\n")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Handle guarding with platform-specific "enable" keys, for example:
|
||||||
|
#
|
||||||
|
# module = {
|
||||||
|
# name = pci;
|
||||||
|
# noemu = bus/pci.c;
|
||||||
|
# emu = bus/emu/pci.c;
|
||||||
|
# emu = commands/lspci.c;
|
||||||
|
#
|
||||||
|
# enable = emu;
|
||||||
|
# enable = i386_pc;
|
||||||
|
# enable = x86_efi;
|
||||||
|
# enable = i386_ieee1275;
|
||||||
|
# enable = i386_coreboot;
|
||||||
|
# };
|
||||||
|
#
|
||||||
|
def foreach_enabled_platform(defn, closure):
|
||||||
|
if 'enable' in defn:
|
||||||
|
for platform in GRUB_PLATFORMS:
|
||||||
|
if platform_tagged(defn, platform, "enable"):
|
||||||
|
platform_conditional(platform, closure)
|
||||||
|
else:
|
||||||
|
for platform in GRUB_PLATFORMS:
|
||||||
|
platform_conditional(platform, closure)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Handle guarding with platform-specific automake conditionals, for example:
|
||||||
|
#
|
||||||
|
# module = {
|
||||||
|
# name = usb;
|
||||||
|
# common = bus/usb/usb.c;
|
||||||
|
# noemu = bus/usb/usbtrans.c;
|
||||||
|
# noemu = bus/usb/usbhub.c;
|
||||||
|
# enable = emu;
|
||||||
|
# enable = i386;
|
||||||
|
# enable = mips_loongson;
|
||||||
|
# emu_condition = COND_GRUB_EMU_SDL;
|
||||||
|
# };
|
||||||
|
#
|
||||||
|
def under_platform_specific_conditionals(defn, platform, closure):
|
||||||
|
output(foreach_platform_specific_value(defn, platform, "_condition", "condition", lambda cond: "if " + cond + "\n"))
|
||||||
|
closure(defn, platform)
|
||||||
|
output(foreach_platform_specific_value(defn, platform, "_condition", "condition", lambda cond: "endif " + cond + "\n"))
|
||||||
|
|
||||||
|
def platform_specific_values(defn, platform, suffix, nonetag):
|
||||||
|
return foreach_platform_specific_value(defn, platform, suffix, nonetag,
|
||||||
|
lambda value: value + " ")
|
||||||
|
|
||||||
|
def platform_values(defn, platform, suffix):
|
||||||
|
return foreach_platform_value(defn, platform, suffix, lambda value: value + " ")
|
||||||
|
|
||||||
|
def extra_dist(defn):
|
||||||
|
return foreach_value(defn, "extra_dist", lambda value: value + " ")
|
||||||
|
|
||||||
|
def platform_sources(defn, p): return platform_values(defn, p, "")
|
||||||
|
def platform_nodist_sources(defn, p): return platform_values(defn, p, "_nodist")
|
||||||
|
|
||||||
|
def platform_startup(defn, p): return platform_specific_values(defn, p, "_startup", "startup")
|
||||||
|
def platform_ldadd(defn, p): return platform_specific_values(defn, p, "_ldadd", "ldadd")
|
||||||
|
def platform_dependencies(defn, p): return platform_specific_values(defn, p, "_dependencies", "dependencies")
|
||||||
|
def platform_cflags(defn, p): return platform_specific_values(defn, p, "_cflags", "cflags")
|
||||||
|
def platform_ldflags(defn, p): return platform_specific_values(defn, p, "_ldflags", "ldflags")
|
||||||
|
def platform_cppflags(defn, p): return platform_specific_values(defn, p, "_cppflags", "cppflags")
|
||||||
|
def platform_ccasflags(defn, p): return platform_specific_values(defn, p, "_ccasflags", "ccasflags")
|
||||||
|
def platform_stripflags(defn, p): return platform_specific_values(defn, p, "_stripflags", "stripflags")
|
||||||
|
def platform_objcopyflags(defn, p): return platform_specific_values(defn, p, "_objcopyflags", "objcopyflags")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Emit snippet only the first time through for the current name.
|
||||||
|
#
|
||||||
|
seen_target = set()
|
||||||
|
|
||||||
|
def first_time(defn, snippet):
|
||||||
|
if defn['name'] not in seen_target:
|
||||||
|
return snippet
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def is_platform_independent(defn):
|
||||||
|
if 'enable' in defn:
|
||||||
|
return False
|
||||||
|
for suffix in [ "", "_nodist" ]:
|
||||||
|
template = platform_values(defn, GRUB_PLATFORMS[0], suffix)
|
||||||
|
for platform in GRUB_PLATFORMS[1:]:
|
||||||
|
if template != platform_values(defn, platform, suffix):
|
||||||
|
return False
|
||||||
|
|
||||||
|
for suffix in [ "startup", "ldadd", "dependencies", "cflags", "ldflags", "cppflags", "ccasflags", "stripflags", "objcopyflags", "condition" ]:
|
||||||
|
template = platform_specific_values(defn, GRUB_PLATFORMS[0], "_" + suffix, suffix)
|
||||||
|
for platform in GRUB_PLATFORMS[1:]:
|
||||||
|
if template != platform_specific_values(defn, platform, "_" + suffix, suffix):
|
||||||
|
return False
|
||||||
|
for tag in [ "nostrip" ]:
|
||||||
|
template = platform_tagged(defn, GRUB_PLATFORMS[0], tag)
|
||||||
|
for platform in GRUB_PLATFORMS[1:]:
|
||||||
|
if template != platform_tagged(defn, platform, tag):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def module(defn, platform):
|
||||||
|
name = defn['name']
|
||||||
|
set_canonical_name_suffix(".module")
|
||||||
|
|
||||||
|
gvar_add("platform_PROGRAMS", name + ".module")
|
||||||
|
gvar_add("MODULE_FILES", name + ".module$(EXEEXT)")
|
||||||
|
|
||||||
|
var_set(cname(defn) + "_SOURCES", platform_sources(defn, platform) + " ## platform sources")
|
||||||
|
var_set("nodist_" + cname(defn) + "_SOURCES", platform_nodist_sources(defn, platform) + " ## platform nodist sources")
|
||||||
|
var_set(cname(defn) + "_LDADD", platform_ldadd(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CFLAGS", "$(AM_CFLAGS) $(CFLAGS_MODULE) " + platform_cflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_LDFLAGS", "$(AM_LDFLAGS) $(LDFLAGS_MODULE) " + platform_ldflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CPPFLAGS", "$(AM_CPPFLAGS) $(CPPFLAGS_MODULE) " + platform_cppflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CCASFLAGS", "$(AM_CCASFLAGS) $(CCASFLAGS_MODULE) " + platform_ccasflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_DEPENDENCIES", "$(TARGET_OBJ2ELF) " + platform_dependencies(defn, platform))
|
||||||
|
|
||||||
|
gvar_add("dist_noinst_DATA", extra_dist(defn))
|
||||||
|
gvar_add("BUILT_SOURCES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
gvar_add("CLEANFILES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
|
||||||
|
gvar_add("MOD_FILES", name + ".mod")
|
||||||
|
gvar_add("MARKER_FILES", name + ".marker")
|
||||||
|
gvar_add("CLEANFILES", name + ".marker")
|
||||||
|
output("""
|
||||||
|
""" + name + """.marker: $(""" + cname(defn) + """_SOURCES) $(nodist_""" + cname(defn) + """_SOURCES)
|
||||||
|
$(TARGET_CPP) -DGRUB_LST_GENERATOR $(CPPFLAGS_MARKER) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(""" + cname(defn) + """_CPPFLAGS) $(CPPFLAGS) $^ > $@.new || (rm -f $@; exit 1)
|
||||||
|
grep 'MARKER' $@.new > $@; rm -f $@.new
|
||||||
|
""")
|
||||||
|
|
||||||
|
def kernel(defn, platform):
|
||||||
|
name = defn['name']
|
||||||
|
set_canonical_name_suffix(".exec")
|
||||||
|
gvar_add("platform_PROGRAMS", name + ".exec")
|
||||||
|
var_set(cname(defn) + "_SOURCES", platform_startup(defn, platform))
|
||||||
|
var_add(cname(defn) + "_SOURCES", platform_sources(defn, platform))
|
||||||
|
var_set("nodist_" + cname(defn) + "_SOURCES", platform_nodist_sources(defn, platform) + " ## platform nodist sources")
|
||||||
|
var_set(cname(defn) + "_LDADD", platform_ldadd(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CFLAGS", "$(AM_CFLAGS) $(CFLAGS_KERNEL) " + platform_cflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_LDFLAGS", "$(AM_LDFLAGS) $(LDFLAGS_KERNEL) " + platform_ldflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CPPFLAGS", "$(AM_CPPFLAGS) $(CPPFLAGS_KERNEL) " + platform_cppflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CCASFLAGS", "$(AM_CCASFLAGS) $(CCASFLAGS_KERNEL) " + platform_ccasflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_STRIPFLAGS", "$(AM_STRIPFLAGS) $(STRIPFLAGS_KERNEL) " + platform_stripflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_DEPENDENCIES", "$(TARGET_OBJ2ELF)")
|
||||||
|
|
||||||
|
gvar_add("dist_noinst_DATA", extra_dist(defn))
|
||||||
|
gvar_add("BUILT_SOURCES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
gvar_add("CLEANFILES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
|
||||||
|
gvar_add("platform_DATA", name + ".img")
|
||||||
|
gvar_add("CLEANFILES", name + ".img")
|
||||||
|
rule(name + ".img", name + ".exec$(EXEEXT)",
|
||||||
|
if_platform_tagged(defn, platform, "nostrip",
|
||||||
|
"""if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||||
|
$(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -wd1106 -nu -nd $< $@; \
|
||||||
|
elif test ! -z '$(TARGET_OBJ2ELF)'; then \
|
||||||
|
$(TARGET_OBJ2ELF) $< $@ || (rm -f $@; exit 1); \
|
||||||
|
else cp $< $@; fi""",
|
||||||
|
"""if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||||
|
$(TARGET_STRIP) -S -x $(""" + cname(defn) + """) -o $@.bin $<; \
|
||||||
|
$(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -ed2016 -wd1106 -nu -nd $@.bin $@; \
|
||||||
|
rm -f $@.bin; \
|
||||||
|
elif test ! -z '$(TARGET_OBJ2ELF)'; then \
|
||||||
|
""" + "$(TARGET_STRIP) $(" + cname(defn) + "_STRIPFLAGS) -o $@.bin $< && \
|
||||||
|
$(TARGET_OBJ2ELF) $@.bin $@ || (rm -f $@; rm -f $@.bin; exit 1); \
|
||||||
|
rm -f $@.bin; \
|
||||||
|
else """ + "$(TARGET_STRIP) $(" + cname(defn) + "_STRIPFLAGS) -o $@ $<; \
|
||||||
|
fi"""))
|
||||||
|
|
||||||
|
def image(defn, platform):
|
||||||
|
name = defn['name']
|
||||||
|
set_canonical_name_suffix(".image")
|
||||||
|
gvar_add("platform_PROGRAMS", name + ".image")
|
||||||
|
var_set(cname(defn) + "_SOURCES", platform_sources(defn, platform))
|
||||||
|
var_set("nodist_" + cname(defn) + "_SOURCES", platform_nodist_sources(defn, platform) + "## platform nodist sources")
|
||||||
|
var_set(cname(defn) + "_LDADD", platform_ldadd(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CFLAGS", "$(AM_CFLAGS) $(CFLAGS_IMAGE) " + platform_cflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_LDFLAGS", "$(AM_LDFLAGS) $(LDFLAGS_IMAGE) " + platform_ldflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CPPFLAGS", "$(AM_CPPFLAGS) $(CPPFLAGS_IMAGE) " + platform_cppflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CCASFLAGS", "$(AM_CCASFLAGS) $(CCASFLAGS_IMAGE) " + platform_ccasflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_OBJCOPYFLAGS", "$(OBJCOPYFLAGS_IMAGE) " + platform_objcopyflags(defn, platform))
|
||||||
|
# var_set(cname(defn) + "_DEPENDENCIES", platform_dependencies(defn, platform) + " " + platform_ldadd(defn, platform))
|
||||||
|
|
||||||
|
gvar_add("dist_noinst_DATA", extra_dist(defn))
|
||||||
|
gvar_add("BUILT_SOURCES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
gvar_add("CLEANFILES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
|
||||||
|
gvar_add("platform_DATA", name + ".img")
|
||||||
|
gvar_add("CLEANFILES", name + ".img")
|
||||||
|
rule(name + ".img", name + ".image$(EXEEXT)", """
|
||||||
|
if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||||
|
$(MACHO2IMG) $< $@; \
|
||||||
|
else \
|
||||||
|
$(TARGET_OBJCOPY) $(""" + cname(defn) + """_OBJCOPYFLAGS) --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .MIPS.abiflags -R .reginfo -R .rel.dyn -R .note.gnu.gold-version -R .ARM.exidx $< $@; \
|
||||||
|
fi
|
||||||
|
""")
|
||||||
|
|
||||||
|
def library(defn, platform):
|
||||||
|
name = defn['name']
|
||||||
|
set_canonical_name_suffix("")
|
||||||
|
|
||||||
|
vars_init(defn,
|
||||||
|
cname(defn) + "_SOURCES",
|
||||||
|
"nodist_" + cname(defn) + "_SOURCES",
|
||||||
|
cname(defn) + "_CFLAGS",
|
||||||
|
cname(defn) + "_CPPFLAGS",
|
||||||
|
cname(defn) + "_CCASFLAGS")
|
||||||
|
# cname(defn) + "_DEPENDENCIES")
|
||||||
|
|
||||||
|
if name not in seen_target:
|
||||||
|
gvar_add("noinst_LIBRARIES", name)
|
||||||
|
var_add(cname(defn) + "_SOURCES", platform_sources(defn, platform))
|
||||||
|
var_add("nodist_" + cname(defn) + "_SOURCES", platform_nodist_sources(defn, platform))
|
||||||
|
var_add(cname(defn) + "_CFLAGS", first_time(defn, "$(AM_CFLAGS) $(CFLAGS_LIBRARY) ") + platform_cflags(defn, platform))
|
||||||
|
var_add(cname(defn) + "_CPPFLAGS", first_time(defn, "$(AM_CPPFLAGS) $(CPPFLAGS_LIBRARY) ") + platform_cppflags(defn, platform))
|
||||||
|
var_add(cname(defn) + "_CCASFLAGS", first_time(defn, "$(AM_CCASFLAGS) $(CCASFLAGS_LIBRARY) ") + platform_ccasflags(defn, platform))
|
||||||
|
# var_add(cname(defn) + "_DEPENDENCIES", platform_dependencies(defn, platform) + " " + platform_ldadd(defn, platform))
|
||||||
|
|
||||||
|
gvar_add("dist_noinst_DATA", extra_dist(defn))
|
||||||
|
if name not in seen_target:
|
||||||
|
gvar_add("BUILT_SOURCES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
gvar_add("CLEANFILES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
|
||||||
|
def installdir(defn, default="bin"):
|
||||||
|
return defn.get('installdir', default)
|
||||||
|
|
||||||
|
def manpage(defn, adddeps):
|
||||||
|
name = defn['name']
|
||||||
|
mansection = defn['mansection']
|
||||||
|
|
||||||
|
output("if COND_MAN_PAGES\n")
|
||||||
|
gvar_add("man_MANS", name + "." + mansection)
|
||||||
|
rule(name + "." + mansection, name + " " + adddeps, """
|
||||||
|
chmod a+x """ + name + """
|
||||||
|
PATH=$(builddir):$$PATH pkgdatadir=$(builddir) $(HELP2MAN) --section=""" + mansection + """ -i $(top_srcdir)/docs/man/""" + name + """.h2m -o $@ """ + name + """
|
||||||
|
""")
|
||||||
|
gvar_add("CLEANFILES", name + "." + mansection)
|
||||||
|
output("endif\n")
|
||||||
|
|
||||||
|
def program(defn, platform, test=False):
|
||||||
|
name = defn['name']
|
||||||
|
set_canonical_name_suffix("")
|
||||||
|
|
||||||
|
if 'testcase' in defn:
|
||||||
|
gvar_add("check_PROGRAMS", name)
|
||||||
|
gvar_add("TESTS", name)
|
||||||
|
else:
|
||||||
|
var_add(installdir(defn) + "_PROGRAMS", name)
|
||||||
|
if 'mansection' in defn:
|
||||||
|
manpage(defn, "")
|
||||||
|
|
||||||
|
var_set(cname(defn) + "_SOURCES", platform_sources(defn, platform))
|
||||||
|
var_set("nodist_" + cname(defn) + "_SOURCES", platform_nodist_sources(defn, platform))
|
||||||
|
var_set(cname(defn) + "_LDADD", platform_ldadd(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CFLAGS", "$(AM_CFLAGS) $(CFLAGS_PROGRAM) " + platform_cflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_LDFLAGS", "$(AM_LDFLAGS) $(LDFLAGS_PROGRAM) " + platform_ldflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CPPFLAGS", "$(AM_CPPFLAGS) $(CPPFLAGS_PROGRAM) " + platform_cppflags(defn, platform))
|
||||||
|
var_set(cname(defn) + "_CCASFLAGS", "$(AM_CCASFLAGS) $(CCASFLAGS_PROGRAM) " + platform_ccasflags(defn, platform))
|
||||||
|
# var_set(cname(defn) + "_DEPENDENCIES", platform_dependencies(defn, platform) + " " + platform_ldadd(defn, platform))
|
||||||
|
|
||||||
|
gvar_add("dist_noinst_DATA", extra_dist(defn))
|
||||||
|
gvar_add("BUILT_SOURCES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
gvar_add("CLEANFILES", "$(nodist_" + cname(defn) + "_SOURCES)")
|
||||||
|
|
||||||
|
def data(defn, platform):
|
||||||
|
var_add("dist_" + installdir(defn) + "_DATA", platform_sources(defn, platform))
|
||||||
|
gvar_add("dist_noinst_DATA", extra_dist(defn))
|
||||||
|
|
||||||
|
def transform_data(defn, platform):
|
||||||
|
name = defn['name']
|
||||||
|
|
||||||
|
var_add(installdir(defn) + "_DATA", name)
|
||||||
|
|
||||||
|
rule(name, "$(top_builddir)/config.status " + platform_sources(defn, platform) + platform_dependencies(defn, platform), """
|
||||||
|
(for x in """ + platform_sources(defn, platform) + """; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:-
|
||||||
|
chmod a+x """ + name + """
|
||||||
|
""")
|
||||||
|
|
||||||
|
gvar_add("CLEANFILES", name)
|
||||||
|
gvar_add("EXTRA_DIST", extra_dist(defn))
|
||||||
|
gvar_add("dist_noinst_DATA", platform_sources(defn, platform))
|
||||||
|
|
||||||
|
def script(defn, platform):
|
||||||
|
name = defn['name']
|
||||||
|
|
||||||
|
if 'testcase' in defn:
|
||||||
|
gvar_add("check_SCRIPTS", name)
|
||||||
|
gvar_add ("TESTS", name)
|
||||||
|
else:
|
||||||
|
var_add(installdir(defn) + "_SCRIPTS", name)
|
||||||
|
if 'mansection' in defn:
|
||||||
|
manpage(defn, "grub-mkconfig_lib")
|
||||||
|
|
||||||
|
rule(name, "$(top_builddir)/config.status " + platform_sources(defn, platform) + platform_dependencies(defn, platform), """
|
||||||
|
(for x in """ + platform_sources(defn, platform) + """; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:-
|
||||||
|
chmod a+x """ + name + """
|
||||||
|
""")
|
||||||
|
|
||||||
|
gvar_add("CLEANFILES", name)
|
||||||
|
gvar_add("EXTRA_DIST", extra_dist(defn))
|
||||||
|
gvar_add("dist_noinst_DATA", platform_sources(defn, platform))
|
||||||
|
|
||||||
|
def rules(target, closure):
|
||||||
|
seen_target.clear()
|
||||||
|
seen_vars.clear()
|
||||||
|
|
||||||
|
for defn in defparser.definitions.find_all(target):
|
||||||
|
if is_platform_independent(defn):
|
||||||
|
under_platform_specific_conditionals(defn, GRUB_PLATFORMS[0], closure)
|
||||||
|
else:
|
||||||
|
foreach_enabled_platform(
|
||||||
|
defn,
|
||||||
|
lambda p: under_platform_specific_conditionals(defn, p, closure))
|
||||||
|
# Remember that we've seen this target.
|
||||||
|
seen_target.add(defn['name'])
|
||||||
|
|
||||||
|
parser = OptionParser(usage="%prog DEFINITION-FILES")
|
||||||
|
_, args = parser.parse_args()
|
||||||
|
|
||||||
|
for arg in args:
|
||||||
|
defparser.read_definitions(arg)
|
||||||
|
|
||||||
|
rules("module", module)
|
||||||
|
rules("kernel", kernel)
|
||||||
|
rules("image", image)
|
||||||
|
rules("library", library)
|
||||||
|
rules("program", program)
|
||||||
|
rules("script", script)
|
||||||
|
rules("data", data)
|
||||||
|
rules("transform_data", transform_data)
|
||||||
|
|
||||||
|
write_output(section='decl')
|
||||||
|
write_output()
|
||||||
507
GRUB2/MOD_SRC/grub-2.04/grub-core/Makefile.am
Normal file
507
GRUB2/MOD_SRC/grub-2.04/grub-core/Makefile.am
Normal file
@@ -0,0 +1,507 @@
|
|||||||
|
AUTOMAKE_OPTIONS = subdir-objects -Wno-portability
|
||||||
|
|
||||||
|
DEPDIR=.deps-core
|
||||||
|
|
||||||
|
include $(top_srcdir)/conf/Makefile.common
|
||||||
|
|
||||||
|
CC=$(TARGET_CC)
|
||||||
|
CPP=$(TARGET_CC)
|
||||||
|
CCAS=$(TARGET_CC)
|
||||||
|
RANLIB=$(TARGET_RANLIB)
|
||||||
|
STRIP=$(TARGET_STRIP)
|
||||||
|
|
||||||
|
MACHO2IMG=$(top_builddir)/grub-macho2img
|
||||||
|
|
||||||
|
AM_CFLAGS = $(TARGET_CFLAGS)
|
||||||
|
AM_LDFLAGS = $(TARGET_LDFLAGS)
|
||||||
|
AM_CPPFLAGS = $(TARGET_CPPFLAGS) $(CPPFLAGS_DEFAULT)
|
||||||
|
AM_CCASFLAGS = $(TARGET_CCASFLAGS) $(CCASFLAGS_DEFAULT)
|
||||||
|
|
||||||
|
CFLAGS_PROGRAM += $(CFLAGS_PLATFORM)
|
||||||
|
LDFLAGS_PROGRAM += $(LDFLAGS_PLATFORM)
|
||||||
|
CPPFLAGS_PROGRAM += $(CPPFLAGS_PLATFORM)
|
||||||
|
CCASFLAGS_PROGRAM += $(CCASFLAGS_PLATFORM)
|
||||||
|
|
||||||
|
CFLAGS_LIBRARY += $(CFLAGS_PLATFORM) -fno-builtin
|
||||||
|
CPPFLAGS_LIBRARY += $(CPPFLAGS_PLATFORM)
|
||||||
|
CCASFLAGS_LIBRARY += $(CCASFLAGS_PLATFORM)
|
||||||
|
|
||||||
|
build-grub-pep2elf$(BUILD_EXEEXT): $(top_srcdir)/util/grub-pe2elf.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c
|
||||||
|
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_BUILD=1 -DGRUB_TARGET_WORDSIZE=64 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-pep2elf\" $^
|
||||||
|
CLEANFILES += build-grub-pep2elf$(BUILD_EXEEXT)
|
||||||
|
|
||||||
|
build-grub-pe2elf$(BUILD_EXEEXT): $(top_srcdir)/util/grub-pe2elf.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c
|
||||||
|
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_BUILD=1 -DGRUB_TARGET_WORDSIZE=32 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-pe2elf\" $^
|
||||||
|
CLEANFILES += build-grub-pe2elf$(BUILD_EXEEXT)
|
||||||
|
|
||||||
|
# gentrigtables
|
||||||
|
gentrigtables$(BUILD_EXEEXT): gentrigtables.c
|
||||||
|
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $< $(BUILD_LIBM)
|
||||||
|
CLEANFILES += gentrigtables$(BUILD_EXEEXT)
|
||||||
|
|
||||||
|
build-grub-module-verifier$(BUILD_EXEEXT): $(top_srcdir)/util/grub-module-verifier.c $(top_srcdir)/util/grub-module-verifier32.c $(top_srcdir)/util/grub-module-verifier64.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c
|
||||||
|
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-module-verifier\" $^
|
||||||
|
CLEANFILES += build-grub-module-verifier$(BUILD_EXEEXT)
|
||||||
|
|
||||||
|
# trigtables.c
|
||||||
|
trigtables.c: gentrigtables$(BUILD_EXEEXT) gentrigtables.c $(top_srcdir)/configure.ac
|
||||||
|
./gentrigtables$(BUILD_EXEEXT) > $@
|
||||||
|
CLEANFILES += trigtables.c
|
||||||
|
|
||||||
|
# XXX Use Automake's LEX & YACC support
|
||||||
|
grub_script.tab.h: script/parser.y
|
||||||
|
$(YACC) -d -p grub_script_yy -b grub_script $<
|
||||||
|
grub_script.tab.c: grub_script.tab.h
|
||||||
|
CLEANFILES += grub_script.tab.c grub_script.tab.h
|
||||||
|
|
||||||
|
# For the lexer.
|
||||||
|
grub_script.yy.h: script/yylex.l
|
||||||
|
$(LEX) -o grub_script.yy.c --header-file=grub_script.yy.h $<
|
||||||
|
grub_script.yy.c: grub_script.yy.h
|
||||||
|
|
||||||
|
rs_decoder.h: $(srcdir)/lib/reed_solomon.c
|
||||||
|
$(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -Os -I$(top_builddir) -S -DSTANDALONE -o $@ $< -g0 -mregparm=3 -ffreestanding
|
||||||
|
|
||||||
|
CLEANFILES += grub_script.yy.c grub_script.yy.h
|
||||||
|
|
||||||
|
include $(srcdir)/Makefile.core.am
|
||||||
|
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/cache.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/command.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/device.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/dl.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/env.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/env_private.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/err.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/file.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fs.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i18n.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/list.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/misc.h
|
||||||
|
if COND_emu
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/compiler-rt-emu.h
|
||||||
|
else
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/compiler-rt.h
|
||||||
|
endif
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/parser.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/partition.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/term.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm_private.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/net.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/memory.h
|
||||||
|
|
||||||
|
if COND_i386_pc
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/pxe.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/int.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_i386_xen_pvh
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/int.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_i386_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/pci.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pmtimer.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_i386_coreboot
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/coreboot/lbio.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/font.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bufio.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_i386_multiboot
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_i386_qemu
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/pci.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_i386_ieee1275
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_i386_xen
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_x86_64_xen
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/x86_64/xen/hypercall.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_x86_64_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/pci.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pmtimer.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_ia64_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_mips
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/cpu/kernel.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_mips_arc
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arc/arc.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_mips_qemu_mips
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/keyboard_layouts.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/serial.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_mips_loongson
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/keyboard_layouts.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/time.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/font.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bufio.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/pci.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/cs5536.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/pci.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/serial.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_mips_qemu_mips
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/memory.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_mips64_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/loongson.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_powerpc_ieee1275
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_sparc64_ieee1275
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/sparc64/ieee1275/ieee1275.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_arm_uboot
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/uboot.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_arm_coreboot
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/keyboard_layouts.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/font.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bufio.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fdt.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/dma.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/coreboot/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fdtbus.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_arm_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_arm64_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_riscv32_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_riscv64_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_emu
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/datetime.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/misc.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/net.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/hostdisk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/hostfile.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
if COND_GRUB_EMU_SDL
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/sdl.h
|
||||||
|
endif
|
||||||
|
if COND_GRUB_EMU_PCI
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/libpciaccess.h
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
symlist.h: $(top_builddir)/config.h $(KERNEL_HEADER_FILES)
|
||||||
|
@list='$^'; \
|
||||||
|
for p in $$list; do \
|
||||||
|
echo "#include <$$p>" >> $@ || (rm -f $@; exit 1); \
|
||||||
|
done
|
||||||
|
CLEANFILES += symlist.h
|
||||||
|
BUILT_SOURCES += symlist.h
|
||||||
|
|
||||||
|
symlist.c: symlist.h gensymlist.sh
|
||||||
|
$(TARGET_CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS_KERNEL) $(CPPFLAGS) -DGRUB_SYMBOL_GENERATOR=1 symlist.h > symlist.p || (rm -f symlist.p; exit 1)
|
||||||
|
cat symlist.p | $(SHELL) $(srcdir)/gensymlist.sh $(top_builddir)/config.h $(KERNEL_HEADER_FILES) >$@ || (rm -f $@; exit 1)
|
||||||
|
rm -f symlist.p
|
||||||
|
CLEANFILES += symlist.c
|
||||||
|
BUILT_SOURCES += symlist.c
|
||||||
|
|
||||||
|
if COND_HAVE_ASM_USCORE
|
||||||
|
ASM_PREFIX=_
|
||||||
|
else
|
||||||
|
ASM_PREFIX=
|
||||||
|
endif
|
||||||
|
|
||||||
|
noinst_DATA += kernel_syms.lst
|
||||||
|
|
||||||
|
kernel_syms.lst: $(KERNEL_HEADER_FILES) $(top_builddir)/config.h
|
||||||
|
$(TARGET_CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS_KERNEL) $(CPPFLAGS) $(CFLAGS) -DGRUB_SYMBOL_GENERATOR=1 $^ >kernel_syms.input
|
||||||
|
cat kernel_syms.input | grep -v '^#' | sed -n \
|
||||||
|
-e '/EXPORT_FUNC *([a-zA-Z0-9_]*)/{s/.*EXPORT_FUNC *(\([a-zA-Z0-9_]*\)).*/defined kernel '"$(ASM_PREFIX)"'\1/;p;}' \
|
||||||
|
-e '/EXPORT_VAR *([a-zA-Z0-9_]*)/{s/.*EXPORT_VAR *(\([a-zA-Z0-9_]*\)).*/defined kernel '"$(ASM_PREFIX)"'\1/;p;}' \
|
||||||
|
| sort -u >$@
|
||||||
|
rm -f kernel_syms.input
|
||||||
|
CLEANFILES += kernel_syms.lst
|
||||||
|
|
||||||
|
if COND_emu
|
||||||
|
kern/emu/grub_emu-main.$(OBJEXT):grub_emu_init.h
|
||||||
|
grub_emu-grub_emu_init.$(OBJEXT):grub_emu_init.h
|
||||||
|
kern/emu/grub_emu_dyn-main.$(OBJEXT):grub_emu_init.h
|
||||||
|
grub_emu_dyn-grub_emu_init.$(OBJEXT):grub_emu_init.h
|
||||||
|
|
||||||
|
grub_emu_init.h: genemuinitheader.sh $(MODULE_FILES)
|
||||||
|
rm -f $@; echo $(MODULE_FILES) | sh $(srcdir)/genemuinitheader.sh $(TARGET_NM) > $@
|
||||||
|
CLEANFILES += grub_emu_init.h
|
||||||
|
|
||||||
|
grub_emu_init.c: grub_emu_init.h genemuinit.sh $(MODULE_FILES)
|
||||||
|
rm -f $@; echo $(MODULE_FILES) | sh $(srcdir)/genemuinit.sh $(TARGET_NM) > $@
|
||||||
|
CLEANFILES += grub_emu_init.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
# List files
|
||||||
|
|
||||||
|
fs.lst: $(MARKER_FILES)
|
||||||
|
(for pp in $^; do \
|
||||||
|
b=`basename $$pp .marker`; \
|
||||||
|
if grep 'FS_LIST_MARKER' $$pp >/dev/null 2>&1; then \
|
||||||
|
echo $$b; \
|
||||||
|
fi; \
|
||||||
|
done) | sort -u > $@
|
||||||
|
platform_DATA += fs.lst
|
||||||
|
CLEANFILES += fs.lst
|
||||||
|
|
||||||
|
command.lst: $(MARKER_FILES)
|
||||||
|
(for pp in $^; do \
|
||||||
|
b=`basename $$pp .marker`; \
|
||||||
|
sed -n \
|
||||||
|
-e "/EXTCOMMAND_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/*\1: $$b/;p;}" \
|
||||||
|
-e "/P1COMMAND_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/*\1: $$b/;p;}" \
|
||||||
|
-e "/COMMAND_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/\1: $$b/;p;}" $$pp; \
|
||||||
|
done) | sort -u > $@
|
||||||
|
platform_DATA += command.lst
|
||||||
|
CLEANFILES += command.lst
|
||||||
|
|
||||||
|
partmap.lst: $(MARKER_FILES)
|
||||||
|
(for pp in $^; do \
|
||||||
|
b=`basename $$pp .marker`; \
|
||||||
|
if grep 'PARTMAP_LIST_MARKER' $$pp >/dev/null 2>&1; then \
|
||||||
|
echo $$b; \
|
||||||
|
fi; \
|
||||||
|
done) | sort -u > $@
|
||||||
|
platform_DATA += partmap.lst
|
||||||
|
CLEANFILES += partmap.lst
|
||||||
|
|
||||||
|
terminal.lst: $(MARKER_FILES)
|
||||||
|
(for pp in $^; do \
|
||||||
|
b=`basename $$pp .marker`; \
|
||||||
|
sed -n \
|
||||||
|
-e "/INPUT_TERMINAL_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/i\1: $$b/;p;}" \
|
||||||
|
-e "/OUTPUT_TERMINAL_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/o\1: $$b/;p;}" $$pp; \
|
||||||
|
done) | sort -u > $@
|
||||||
|
platform_DATA += terminal.lst
|
||||||
|
CLEANFILES += terminal.lst
|
||||||
|
|
||||||
|
fdt.lst: $(MARKER_FILES)
|
||||||
|
(for pp in $^; do \
|
||||||
|
b=`basename $$pp .marker`; \
|
||||||
|
sed -n \
|
||||||
|
-e "/FDT_DRIVER_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/i\1: $$b/;p;}" \
|
||||||
|
-e "/FDT_DRIVER_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/o\1: $$b/;p;}" $$pp; \
|
||||||
|
done) | sort -u > $@
|
||||||
|
platform_DATA += fdt.lst
|
||||||
|
CLEANFILES += fdt.lst
|
||||||
|
|
||||||
|
parttool.lst: $(MARKER_FILES)
|
||||||
|
(for pp in $^; do \
|
||||||
|
b=`basename $$pp .marker`; \
|
||||||
|
sed -n \
|
||||||
|
-e "/PARTTOOL_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/\1: $$b/;p;}" $$pp; \
|
||||||
|
done) | sort -u > $@
|
||||||
|
platform_DATA += parttool.lst
|
||||||
|
CLEANFILES += parttool.lst
|
||||||
|
|
||||||
|
video.lst: $(MARKER_FILES)
|
||||||
|
(for pp in $^; do \
|
||||||
|
b=`basename $$pp .marker`; \
|
||||||
|
if grep 'VIDEO_LIST_MARKER' $$pp >/dev/null 2>&1; then \
|
||||||
|
echo $$b; \
|
||||||
|
fi; \
|
||||||
|
done) | sort -u > $@
|
||||||
|
platform_DATA += video.lst
|
||||||
|
CLEANFILES += video.lst
|
||||||
|
|
||||||
|
# but, crypto.lst is simply copied
|
||||||
|
crypto.lst: $(srcdir)/lib/libgcrypt-grub/cipher/crypto.lst
|
||||||
|
cp $^ $@
|
||||||
|
platform_DATA += crypto.lst
|
||||||
|
CLEANFILES += crypto.lst
|
||||||
|
|
||||||
|
syminfo.lst: gensyminfo.sh kernel_syms.lst $(MODULE_FILES)
|
||||||
|
cat kernel_syms.lst > $@.new
|
||||||
|
for m in $(MODULE_FILES); do \
|
||||||
|
sh $< $$m >> $@.new || exit 1; \
|
||||||
|
done
|
||||||
|
mv $@.new $@
|
||||||
|
|
||||||
|
# generate global module dependencies list
|
||||||
|
moddep.lst: syminfo.lst genmoddep.awk video.lst
|
||||||
|
cat $< | sort | $(AWK) -f $(srcdir)/genmoddep.awk > $@ || (rm -f $@; exit 1)
|
||||||
|
platform_DATA += moddep.lst
|
||||||
|
CLEANFILES += config.log syminfo.lst moddep.lst
|
||||||
|
|
||||||
|
$(MOD_FILES): %.mod : genmod.sh moddep.lst %.module$(EXEEXT) build-grub-module-verifier$(BUILD_EXEEXT)
|
||||||
|
TARGET_OBJ2ELF=@TARGET_OBJ2ELF@ sh $^ $@
|
||||||
|
platform_DATA += $(MOD_FILES)
|
||||||
|
platform_DATA += modinfo.sh
|
||||||
|
CLEANFILES += $(MOD_FILES)
|
||||||
|
|
||||||
|
if COND_ENABLE_EFIEMU
|
||||||
|
efiemu32.o: efiemu/runtime/efiemu.c $(TARGET_OBJ2ELF)
|
||||||
|
-rm -f $@
|
||||||
|
-rm -f $@.bin
|
||||||
|
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m32 -Wall -Werror -nostdlib -static -O2 -c -o $@.bin $<
|
||||||
|
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||||
|
$(TARGET_OBJCONV) -felf32 -nu -nd $@.bin $@ || exit 1; \
|
||||||
|
rm -f $@.bin ; \
|
||||||
|
elif test ! -z "$(TARGET_OBJ2ELF)"; then \
|
||||||
|
$(TARGET_OBJ2ELF) $@.bin || (rm -f $@.bin; exit 1); \
|
||||||
|
mv $@.bin $@ ; \
|
||||||
|
else \
|
||||||
|
mv $@.bin $@ ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Link format -arch,x86_64 means Apple linker
|
||||||
|
efiemu64_c.o: efiemu/runtime/efiemu.c
|
||||||
|
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -nostdlib -Wall -Werror -O2 -mcmodel=large -mno-red-zone -c -o $@ $<
|
||||||
|
|
||||||
|
efiemu64_s.o: efiemu/runtime/efiemu.S
|
||||||
|
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -Wall -Werror -nostdlib -O2 -mcmodel=large -mno-red-zone -c -o $@ $<
|
||||||
|
|
||||||
|
efiemu64.o: efiemu64_c.o efiemu64_s.o $(TARGET_OBJ2ELEF)
|
||||||
|
-rm -f $@
|
||||||
|
-rm -f $@.bin
|
||||||
|
$(TARGET_CC) -m64 $(EFIEMU64_LINK_FORMAT) -nostdlib -static -Wl,-r -o $@.bin $^
|
||||||
|
if test "x$(EFIEMU64_LINK_FORMAT)" = x-arch,x86_64; then \
|
||||||
|
$(TARGET_OBJCONV) -felf64 -nu -nd $@.bin $@ || exit 1; \
|
||||||
|
rm -f $@.bin; \
|
||||||
|
else \
|
||||||
|
mv $@.bin $@ ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
platform_DATA += efiemu32.o efiemu64.o
|
||||||
|
CLEANFILES += efiemu32.o efiemu64.o efiemu64_c.o efiemu64_s.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows
|
||||||
|
windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
|
||||||
|
test -d $(windowsdir)/$(target_cpu)-$(platform) || mkdir $(windowsdir)/$(target_cpu)-$(platform)
|
||||||
|
for x in $(platform_DATA); do \
|
||||||
|
cp -fp $$x $(windowsdir)/$(target_cpu)-$(platform)/$$x; \
|
||||||
|
done
|
||||||
@@ -100,6 +100,10 @@ kernel = {
|
|||||||
emu_cppflags = '$(CPPFLAGS_GNULIB)';
|
emu_cppflags = '$(CPPFLAGS_GNULIB)';
|
||||||
arm_uboot_ldflags = '-Wl,-r,-d';
|
arm_uboot_ldflags = '-Wl,-r,-d';
|
||||||
arm_uboot_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
arm_uboot_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||||
|
|
||||||
|
mips64_efi_ldflags = '-Wl,-r,-d';
|
||||||
|
mips64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame -R .MIPS.abiflags';
|
||||||
|
|
||||||
arm_coreboot_ldflags = '-Wl,-r,-d';
|
arm_coreboot_ldflags = '-Wl,-r,-d';
|
||||||
arm_coreboot_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
arm_coreboot_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||||
|
|
||||||
@@ -114,6 +118,7 @@ kernel = {
|
|||||||
i386_coreboot_startup = kern/i386/coreboot/startup.S;
|
i386_coreboot_startup = kern/i386/coreboot/startup.S;
|
||||||
i386_multiboot_startup = kern/i386/coreboot/startup.S;
|
i386_multiboot_startup = kern/i386/coreboot/startup.S;
|
||||||
mips_startup = kern/mips/startup.S;
|
mips_startup = kern/mips/startup.S;
|
||||||
|
mips64_efi_startup = kern/mips64/efi/startup.S;
|
||||||
sparc64_ieee1275_startup = kern/sparc64/ieee1275/crt0.S;
|
sparc64_ieee1275_startup = kern/sparc64/ieee1275/crt0.S;
|
||||||
powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S;
|
powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S;
|
||||||
arm_uboot_startup = kern/arm/startup.S;
|
arm_uboot_startup = kern/arm/startup.S;
|
||||||
@@ -310,6 +315,15 @@ kernel = {
|
|||||||
extra_dist = video/sis315_init.c;
|
extra_dist = video/sis315_init.c;
|
||||||
mips_loongson = commands/keylayouts.c;
|
mips_loongson = commands/keylayouts.c;
|
||||||
|
|
||||||
|
mips64 = kern/mips64/init.c;
|
||||||
|
mips64 = kern/mips64/dl.c;
|
||||||
|
mips64 = kern/mips64/cache.S;
|
||||||
|
mips64 = kern/generic/rtc_get_time_ms.c;
|
||||||
|
mips64_efi = kern/mips64/efi/init.c;
|
||||||
|
mips64_efi = kern/mips64/efi/loongson.c;
|
||||||
|
mips64_efi = lib/mips64/efi/loongson.c;
|
||||||
|
mips64_efi = lib/mips64/efi/loongson_asm.S;
|
||||||
|
|
||||||
powerpc_ieee1275 = kern/powerpc/cache.S;
|
powerpc_ieee1275 = kern/powerpc/cache.S;
|
||||||
powerpc_ieee1275 = kern/powerpc/dl.c;
|
powerpc_ieee1275 = kern/powerpc/dl.c;
|
||||||
powerpc_ieee1275 = kern/powerpc/compiler-rt.S;
|
powerpc_ieee1275 = kern/powerpc/compiler-rt.S;
|
||||||
@@ -828,6 +842,7 @@ module = {
|
|||||||
enable = sparc64_ieee1275;
|
enable = sparc64_ieee1275;
|
||||||
enable = powerpc_ieee1275;
|
enable = powerpc_ieee1275;
|
||||||
enable = mips_arc;
|
enable = mips_arc;
|
||||||
|
enable = mips64_efi;
|
||||||
enable = ia64_efi;
|
enable = ia64_efi;
|
||||||
enable = arm_efi;
|
enable = arm_efi;
|
||||||
enable = arm64_efi;
|
enable = arm64_efi;
|
||||||
@@ -1588,6 +1603,7 @@ module = {
|
|||||||
module = {
|
module = {
|
||||||
name = ventoy;
|
name = ventoy;
|
||||||
common = ventoy/ventoy.c;
|
common = ventoy/ventoy.c;
|
||||||
|
common = ventoy/ventoy_cmd.c;
|
||||||
common = ventoy/ventoy_linux.c;
|
common = ventoy/ventoy_linux.c;
|
||||||
common = ventoy/ventoy_unix.c;
|
common = ventoy/ventoy_unix.c;
|
||||||
common = ventoy/ventoy_windows.c;
|
common = ventoy/ventoy_windows.c;
|
||||||
@@ -1667,6 +1683,8 @@ module = {
|
|||||||
efi = lib/efi/relocator.c;
|
efi = lib/efi/relocator.c;
|
||||||
mips = lib/mips/relocator_asm.S;
|
mips = lib/mips/relocator_asm.S;
|
||||||
mips = lib/mips/relocator.c;
|
mips = lib/mips/relocator.c;
|
||||||
|
mips64 = lib/mips64/relocator_asm.S;
|
||||||
|
mips64 = lib/mips64/relocator.c;
|
||||||
powerpc = lib/powerpc/relocator_asm.S;
|
powerpc = lib/powerpc/relocator_asm.S;
|
||||||
powerpc = lib/powerpc/relocator.c;
|
powerpc = lib/powerpc/relocator.c;
|
||||||
xen = lib/xen/relocator.c;
|
xen = lib/xen/relocator.c;
|
||||||
@@ -1679,6 +1697,7 @@ module = {
|
|||||||
extra_dist = kern/powerpc/cache_flush.S;
|
extra_dist = kern/powerpc/cache_flush.S;
|
||||||
|
|
||||||
enable = mips;
|
enable = mips;
|
||||||
|
enable = mips64;
|
||||||
enable = powerpc;
|
enable = powerpc;
|
||||||
enable = x86;
|
enable = x86;
|
||||||
enable = i386_xen_pvh;
|
enable = i386_xen_pvh;
|
||||||
@@ -1809,6 +1828,7 @@ module = {
|
|||||||
i386_pc = lib/i386/pc/vesa_modes_table.c;
|
i386_pc = lib/i386/pc/vesa_modes_table.c;
|
||||||
i386_xen_pvh = lib/i386/pc/vesa_modes_table.c;
|
i386_xen_pvh = lib/i386/pc/vesa_modes_table.c;
|
||||||
mips = loader/mips/linux.c;
|
mips = loader/mips/linux.c;
|
||||||
|
mips64 = loader/mips64/linux.c;
|
||||||
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
|
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
|
||||||
sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c;
|
sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c;
|
||||||
ia64_efi = loader/ia64/efi/linux.c;
|
ia64_efi = loader/ia64/efi/linux.c;
|
||||||
@@ -1915,6 +1935,7 @@ module = {
|
|||||||
enable = riscv32_efi;
|
enable = riscv32_efi;
|
||||||
enable = riscv64_efi;
|
enable = riscv64_efi;
|
||||||
enable = mips;
|
enable = mips;
|
||||||
|
enable = mips64_efi;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
|
|||||||
349
GRUB2/MOD_SRC/grub-2.04/grub-core/commands/hashsum.c
Normal file
349
GRUB2/MOD_SRC/grub-2.04/grub-core/commands/hashsum.c
Normal file
@@ -0,0 +1,349 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/extcmd.h>
|
||||||
|
#include <grub/file.h>
|
||||||
|
#include <grub/disk.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/crypto.h>
|
||||||
|
#include <grub/normal.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
static const struct grub_arg_option options[] = {
|
||||||
|
{"hash", 'h', 0, N_("Specify hash to use."), N_("HASH"), ARG_TYPE_STRING},
|
||||||
|
{"check", 'c', 0, N_("Check hashes of files with hash list FILE."),
|
||||||
|
N_("FILE"), ARG_TYPE_STRING},
|
||||||
|
{"prefix", 'p', 0, N_("Base directory for hash list."), N_("DIR"),
|
||||||
|
ARG_TYPE_STRING},
|
||||||
|
{"keep-going", 'k', 0, N_("Don't stop after first error."), 0, 0},
|
||||||
|
{"uncompress", 'u', 0, N_("Uncompress file before checksumming."), 0, 0},
|
||||||
|
{0, 0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct { const char *name; const char *hashname; } aliases[] =
|
||||||
|
{
|
||||||
|
{"sha256sum", "sha256"},
|
||||||
|
{"sha512sum", "sha512"},
|
||||||
|
{"sha1sum", "sha1"},
|
||||||
|
{"md5sum", "md5"},
|
||||||
|
{"crc", "crc32"},
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
hextoval (char c)
|
||||||
|
{
|
||||||
|
if (c >= '0' && c <= '9')
|
||||||
|
return c - '0';
|
||||||
|
if (c >= 'a' && c <= 'f')
|
||||||
|
return c - 'a' + 10;
|
||||||
|
if (c >= 'A' && c <= 'F')
|
||||||
|
return c - 'A' + 10;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result)
|
||||||
|
{
|
||||||
|
int progress = 0;
|
||||||
|
grub_uint64_t ro = 0;
|
||||||
|
grub_uint64_t div = 0;
|
||||||
|
grub_uint64_t total = 0;
|
||||||
|
void *context;
|
||||||
|
grub_uint8_t *readbuf;
|
||||||
|
#define BUF_SIZE 1024 * 1024
|
||||||
|
readbuf = grub_malloc (BUF_SIZE);
|
||||||
|
if (!readbuf)
|
||||||
|
return grub_errno;
|
||||||
|
context = grub_zalloc (hash->contextsize);
|
||||||
|
if (!readbuf || !context)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (file->size > 16 * 1024 * 1024)
|
||||||
|
progress = 1;
|
||||||
|
|
||||||
|
hash->init (context);
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
grub_ssize_t r;
|
||||||
|
r = grub_file_read (file, readbuf, BUF_SIZE);
|
||||||
|
if (r < 0)
|
||||||
|
goto fail;
|
||||||
|
if (r == 0)
|
||||||
|
break;
|
||||||
|
hash->write (context, readbuf, r);
|
||||||
|
if (progress)
|
||||||
|
{
|
||||||
|
total += r;
|
||||||
|
div = grub_divmod64(total * 100, (grub_uint64_t)file->size, &ro);
|
||||||
|
grub_printf("\rCalculating %s %d%% ", hash->name, (int)div);
|
||||||
|
grub_refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hash->final (context);
|
||||||
|
grub_memcpy (result, hash->read (context), hash->mdlen);
|
||||||
|
|
||||||
|
grub_free (readbuf);
|
||||||
|
grub_free (context);
|
||||||
|
if (progress)
|
||||||
|
{
|
||||||
|
grub_printf("\rCalculating %s 100%% \n\r\n", hash->name);
|
||||||
|
grub_refresh();
|
||||||
|
}
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
grub_free (readbuf);
|
||||||
|
grub_free (context);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
check_list (const gcry_md_spec_t *hash, const char *hashfilename,
|
||||||
|
const char *prefix, int keep, int uncompress)
|
||||||
|
{
|
||||||
|
grub_file_t hashlist, file;
|
||||||
|
char *buf = NULL;
|
||||||
|
grub_uint8_t expected[GRUB_CRYPTO_MAX_MDLEN];
|
||||||
|
grub_uint8_t actual[GRUB_CRYPTO_MAX_MDLEN];
|
||||||
|
grub_err_t err;
|
||||||
|
unsigned i;
|
||||||
|
unsigned unread = 0, mismatch = 0;
|
||||||
|
|
||||||
|
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||||
|
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||||
|
|
||||||
|
hashlist = grub_file_open (hashfilename, GRUB_FILE_TYPE_HASHLIST);
|
||||||
|
if (!hashlist)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
while (grub_free (buf), (buf = grub_file_getline (hashlist)))
|
||||||
|
{
|
||||||
|
const char *p = buf;
|
||||||
|
while (grub_isspace (p[0]))
|
||||||
|
p++;
|
||||||
|
for (i = 0; i < hash->mdlen; i++)
|
||||||
|
{
|
||||||
|
int high, low;
|
||||||
|
high = hextoval (*p++);
|
||||||
|
low = hextoval (*p++);
|
||||||
|
if (high < 0 || low < 0)
|
||||||
|
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "invalid hash list");
|
||||||
|
expected[i] = (high << 4) | low;
|
||||||
|
}
|
||||||
|
if ((p[0] != ' ' && p[0] != '\t') || (p[1] != ' ' && p[1] != '\t'))
|
||||||
|
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "invalid hash list");
|
||||||
|
p += 2;
|
||||||
|
if (prefix)
|
||||||
|
{
|
||||||
|
char *filename;
|
||||||
|
|
||||||
|
filename = grub_xasprintf ("%s/%s", prefix, p);
|
||||||
|
if (!filename)
|
||||||
|
return grub_errno;
|
||||||
|
file = grub_file_open (filename, GRUB_FILE_TYPE_TO_HASH
|
||||||
|
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||||
|
: GRUB_FILE_TYPE_NONE));
|
||||||
|
grub_free (filename);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
file = grub_file_open (p, GRUB_FILE_TYPE_TO_HASH
|
||||||
|
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||||
|
: GRUB_FILE_TYPE_NONE));
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
grub_file_close (hashlist);
|
||||||
|
grub_free (buf);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
err = hash_file (file, hash, actual);
|
||||||
|
grub_file_close (file);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
grub_printf_ (N_("%s: READ ERROR\n"), p);
|
||||||
|
if (!keep)
|
||||||
|
{
|
||||||
|
grub_file_close (hashlist);
|
||||||
|
grub_free (buf);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
grub_print_error ();
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
unread++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (grub_crypto_memcmp (expected, actual, hash->mdlen) != 0)
|
||||||
|
{
|
||||||
|
grub_printf_ (N_("%s: HASH MISMATCH\n"), p);
|
||||||
|
if (!keep)
|
||||||
|
{
|
||||||
|
grub_file_close (hashlist);
|
||||||
|
grub_free (buf);
|
||||||
|
return grub_error (GRUB_ERR_TEST_FAILURE,
|
||||||
|
"hash of '%s' mismatches", p);
|
||||||
|
}
|
||||||
|
mismatch++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
grub_printf_ (N_("%s: OK\n"), p);
|
||||||
|
}
|
||||||
|
if (mismatch || unread)
|
||||||
|
return grub_error (GRUB_ERR_TEST_FAILURE,
|
||||||
|
"%d files couldn't be read and hash "
|
||||||
|
"of %d files mismatches", unread, mismatch);
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||||
|
int argc, char **args)
|
||||||
|
{
|
||||||
|
struct grub_arg_list *state = ctxt->state;
|
||||||
|
const char *hashname = NULL;
|
||||||
|
const char *prefix = NULL;
|
||||||
|
const gcry_md_spec_t *hash;
|
||||||
|
unsigned i;
|
||||||
|
int keep = state[3].set;
|
||||||
|
int uncompress = state[4].set;
|
||||||
|
unsigned unread = 0;
|
||||||
|
int len = 0;
|
||||||
|
char hashsum[256];
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE (aliases); i++)
|
||||||
|
if (grub_strcmp (ctxt->extcmd->cmd->name, aliases[i].name) == 0)
|
||||||
|
hashname = aliases[i].hashname;
|
||||||
|
if (state[0].set)
|
||||||
|
hashname = state[0].arg;
|
||||||
|
|
||||||
|
if (!hashname)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no hash specified");
|
||||||
|
|
||||||
|
hash = grub_crypto_lookup_md_by_name (hashname);
|
||||||
|
if (!hash)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown hash");
|
||||||
|
|
||||||
|
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||||
|
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||||
|
|
||||||
|
if (state[2].set)
|
||||||
|
prefix = state[2].arg;
|
||||||
|
|
||||||
|
if (state[1].set)
|
||||||
|
{
|
||||||
|
if (argc != 0)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
"--check is incompatible with file list");
|
||||||
|
return check_list (hash, state[1].arg, prefix, keep, uncompress);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < (unsigned) argc; i++)
|
||||||
|
{
|
||||||
|
GRUB_PROPERLY_ALIGNED_ARRAY (result, GRUB_CRYPTO_MAX_MDLEN);
|
||||||
|
grub_file_t file;
|
||||||
|
grub_err_t err;
|
||||||
|
unsigned j;
|
||||||
|
file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH
|
||||||
|
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||||
|
: GRUB_FILE_TYPE_NONE));
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
if (!keep)
|
||||||
|
return grub_errno;
|
||||||
|
grub_print_error ();
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
unread++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
err = hash_file (file, hash, result);
|
||||||
|
grub_file_close (file);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
if (!keep)
|
||||||
|
return err;
|
||||||
|
grub_print_error ();
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
unread++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (j = 0; j < hash->mdlen; j++)
|
||||||
|
{
|
||||||
|
grub_printf ("%02x", ((grub_uint8_t *) result)[j]);
|
||||||
|
len += grub_snprintf(hashsum + len, sizeof(hashsum) - len, "%02x", ((grub_uint8_t *) result)[j]);
|
||||||
|
}
|
||||||
|
grub_printf (" %s\n", args[i]);
|
||||||
|
grub_env_set("VT_LAST_CHECK_SUM", hashsum);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unread)
|
||||||
|
return grub_error (GRUB_ERR_TEST_FAILURE, "%d files couldn't be read",
|
||||||
|
unread);
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_extcmd_t cmd, cmd_md5, cmd_sha1, cmd_sha256, cmd_sha512, cmd_crc;
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(hashsum)
|
||||||
|
{
|
||||||
|
cmd = grub_register_extcmd ("hashsum", grub_cmd_hashsum, 0,
|
||||||
|
N_("-h HASH [-c FILE [-p PREFIX]] "
|
||||||
|
"[FILE1 [FILE2 ...]]"),
|
||||||
|
/* TRANSLATORS: "hash checksum" is just to
|
||||||
|
be a bit more precise, you can treat it as
|
||||||
|
just "hash". */
|
||||||
|
N_("Compute or check hash checksum."),
|
||||||
|
options);
|
||||||
|
cmd_md5 = grub_register_extcmd ("md5sum", grub_cmd_hashsum, 0,
|
||||||
|
N_("[-c FILE [-p PREFIX]] "
|
||||||
|
"[FILE1 [FILE2 ...]]"),
|
||||||
|
N_("Compute or check hash checksum."),
|
||||||
|
options);
|
||||||
|
cmd_sha1 = grub_register_extcmd ("sha1sum", grub_cmd_hashsum, 0,
|
||||||
|
N_("[-c FILE [-p PREFIX]] "
|
||||||
|
"[FILE1 [FILE2 ...]]"),
|
||||||
|
N_("Compute or check hash checksum."),
|
||||||
|
options);
|
||||||
|
cmd_sha256 = grub_register_extcmd ("sha256sum", grub_cmd_hashsum, 0,
|
||||||
|
N_("[-c FILE [-p PREFIX]] "
|
||||||
|
"[FILE1 [FILE2 ...]]"),
|
||||||
|
N_("Compute or check hash checksum."),
|
||||||
|
options);
|
||||||
|
cmd_sha512 = grub_register_extcmd ("sha512sum", grub_cmd_hashsum, 0,
|
||||||
|
N_("[-c FILE [-p PREFIX]] "
|
||||||
|
"[FILE1 [FILE2 ...]]"),
|
||||||
|
N_("Compute or check hash checksum."),
|
||||||
|
options);
|
||||||
|
|
||||||
|
cmd_crc = grub_register_extcmd ("crc", grub_cmd_hashsum, 0,
|
||||||
|
N_("[-c FILE [-p PREFIX]] "
|
||||||
|
"[FILE1 [FILE2 ...]]"),
|
||||||
|
N_("Compute or check hash checksum."),
|
||||||
|
options);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(hashsum)
|
||||||
|
{
|
||||||
|
grub_unregister_extcmd (cmd);
|
||||||
|
grub_unregister_extcmd (cmd_md5);
|
||||||
|
grub_unregister_extcmd (cmd_sha1);
|
||||||
|
grub_unregister_extcmd (cmd_sha256);
|
||||||
|
grub_unregister_extcmd (cmd_sha512);
|
||||||
|
grub_unregister_extcmd (cmd_crc);
|
||||||
|
}
|
||||||
257
GRUB2/MOD_SRC/grub-2.04/grub-core/disk/loopback.c
Normal file
257
GRUB2/MOD_SRC/grub-2.04/grub-core/disk/loopback.c
Normal file
@@ -0,0 +1,257 @@
|
|||||||
|
/* loopback.c - command to add loopback devices. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2005,2006,2007 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/file.h>
|
||||||
|
#include <grub/disk.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/extcmd.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
struct grub_loopback
|
||||||
|
{
|
||||||
|
char *devname;
|
||||||
|
grub_file_t file;
|
||||||
|
struct grub_loopback *next;
|
||||||
|
unsigned long id;
|
||||||
|
grub_off_t skip;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct grub_loopback *loopback_list;
|
||||||
|
static unsigned long last_id = 0;
|
||||||
|
|
||||||
|
static const struct grub_arg_option options[] =
|
||||||
|
{
|
||||||
|
/* TRANSLATORS: The disk is simply removed from the list of available ones,
|
||||||
|
not wiped, avoid to scare user. */
|
||||||
|
{"delete", 'd', 0, N_("Delete the specified loopback drive."), 0, 0},
|
||||||
|
{"skip", 's', 0, "skip sectors of the file.", "SECTORS", ARG_TYPE_INT },
|
||||||
|
{0, 0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Delete the loopback device NAME. */
|
||||||
|
static grub_err_t
|
||||||
|
delete_loopback (const char *name)
|
||||||
|
{
|
||||||
|
struct grub_loopback *dev;
|
||||||
|
struct grub_loopback **prev;
|
||||||
|
|
||||||
|
/* Search for the device. */
|
||||||
|
for (dev = loopback_list, prev = &loopback_list;
|
||||||
|
dev;
|
||||||
|
prev = &dev->next, dev = dev->next)
|
||||||
|
if (grub_strcmp (dev->devname, name) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (! dev)
|
||||||
|
return grub_error (GRUB_ERR_BAD_DEVICE, "device not found");
|
||||||
|
|
||||||
|
/* Remove the device from the list. */
|
||||||
|
*prev = dev->next;
|
||||||
|
|
||||||
|
grub_free (dev->devname);
|
||||||
|
grub_file_close (dev->file);
|
||||||
|
grub_free (dev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The command to add and remove loopback devices. */
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
struct grub_arg_list *state = ctxt->state;
|
||||||
|
grub_file_t file;
|
||||||
|
struct grub_loopback *newdev;
|
||||||
|
grub_err_t ret;
|
||||||
|
grub_off_t skip = 0;
|
||||||
|
|
||||||
|
if (argc < 1)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required");
|
||||||
|
|
||||||
|
/* Check if `-d' was used. */
|
||||||
|
if (state[0].set)
|
||||||
|
return delete_loopback (args[0]);
|
||||||
|
|
||||||
|
if (state[1].set)
|
||||||
|
skip = (grub_off_t)grub_strtoull(state[1].arg, NULL, 10);
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
|
||||||
|
file = grub_file_open (args[1], GRUB_FILE_TYPE_LOOPBACK
|
||||||
|
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||||
|
if (! file)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
/* First try to replace the old device. */
|
||||||
|
for (newdev = loopback_list; newdev; newdev = newdev->next)
|
||||||
|
if (grub_strcmp (newdev->devname, args[0]) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (newdev)
|
||||||
|
{
|
||||||
|
grub_file_close (newdev->file);
|
||||||
|
newdev->file = file;
|
||||||
|
newdev->skip = skip;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unable to replace it, make a new entry. */
|
||||||
|
newdev = grub_malloc (sizeof (struct grub_loopback));
|
||||||
|
if (! newdev)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
newdev->devname = grub_strdup (args[0]);
|
||||||
|
if (! newdev->devname)
|
||||||
|
{
|
||||||
|
grub_free (newdev);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
newdev->file = file;
|
||||||
|
newdev->skip = skip;
|
||||||
|
newdev->id = last_id++;
|
||||||
|
|
||||||
|
/* Add the new entry to the list. */
|
||||||
|
newdev->next = loopback_list;
|
||||||
|
loopback_list = newdev;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
ret = grub_errno;
|
||||||
|
grub_file_close (file);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
grub_loopback_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
|
||||||
|
grub_disk_pull_t pull)
|
||||||
|
{
|
||||||
|
struct grub_loopback *d;
|
||||||
|
if (pull != GRUB_DISK_PULL_NONE)
|
||||||
|
return 0;
|
||||||
|
for (d = loopback_list; d; d = d->next)
|
||||||
|
{
|
||||||
|
if (hook (d->devname, hook_data))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_loopback_open (const char *name, grub_disk_t disk)
|
||||||
|
{
|
||||||
|
struct grub_loopback *dev;
|
||||||
|
|
||||||
|
for (dev = loopback_list; dev; dev = dev->next)
|
||||||
|
if (grub_strcmp (dev->devname, name) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (! dev)
|
||||||
|
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device");
|
||||||
|
|
||||||
|
/* Use the filesize for the disk size, round up to a complete sector. */
|
||||||
|
if (dev->file->size != GRUB_FILE_SIZE_UNKNOWN)
|
||||||
|
disk->total_sectors = ((dev->file->size + GRUB_DISK_SECTOR_SIZE - 1)
|
||||||
|
/ GRUB_DISK_SECTOR_SIZE);
|
||||||
|
else
|
||||||
|
disk->total_sectors = GRUB_DISK_SIZE_UNKNOWN;
|
||||||
|
/* Avoid reading more than 512M. */
|
||||||
|
disk->max_agglomerate = 1 << (29 - GRUB_DISK_SECTOR_BITS
|
||||||
|
- GRUB_DISK_CACHE_BITS);
|
||||||
|
|
||||||
|
disk->id = dev->id;
|
||||||
|
|
||||||
|
disk->data = dev;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_loopback_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||||
|
grub_size_t size, char *buf)
|
||||||
|
{
|
||||||
|
grub_file_t file = ((struct grub_loopback *) disk->data)->file;
|
||||||
|
grub_off_t skip = ((struct grub_loopback *) disk->data)->skip;
|
||||||
|
grub_off_t pos;
|
||||||
|
|
||||||
|
grub_file_seek (file, (sector + skip) << GRUB_DISK_SECTOR_BITS);
|
||||||
|
|
||||||
|
grub_file_read (file, buf, size << GRUB_DISK_SECTOR_BITS);
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
/* In case there is more data read than there is available, in case
|
||||||
|
of files that are not a multiple of GRUB_DISK_SECTOR_SIZE, fill
|
||||||
|
the rest with zeros. */
|
||||||
|
pos = (sector + skip + size) << GRUB_DISK_SECTOR_BITS;
|
||||||
|
if (pos > file->size)
|
||||||
|
{
|
||||||
|
grub_size_t amount = pos - file->size;
|
||||||
|
grub_memset (buf + (size << GRUB_DISK_SECTOR_BITS) - amount, 0, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_loopback_write (grub_disk_t disk __attribute ((unused)),
|
||||||
|
grub_disk_addr_t sector __attribute ((unused)),
|
||||||
|
grub_size_t size __attribute ((unused)),
|
||||||
|
const char *buf __attribute ((unused)))
|
||||||
|
{
|
||||||
|
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||||
|
"loopback write is not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct grub_disk_dev grub_loopback_dev =
|
||||||
|
{
|
||||||
|
.name = "loopback",
|
||||||
|
.id = GRUB_DISK_DEVICE_LOOPBACK_ID,
|
||||||
|
.disk_iterate = grub_loopback_iterate,
|
||||||
|
.disk_open = grub_loopback_open,
|
||||||
|
.disk_read = grub_loopback_read,
|
||||||
|
.disk_write = grub_loopback_write,
|
||||||
|
.next = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static grub_extcmd_t cmd;
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(loopback)
|
||||||
|
{
|
||||||
|
cmd = grub_register_extcmd ("loopback", grub_cmd_loopback, 0,
|
||||||
|
N_("[-d] DEVICENAME FILE."),
|
||||||
|
/* TRANSLATORS: The file itself is not destroyed
|
||||||
|
or transformed into drive. */
|
||||||
|
N_("Make a virtual drive from a file."), options);
|
||||||
|
grub_disk_dev_register (&grub_loopback_dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(loopback)
|
||||||
|
{
|
||||||
|
grub_unregister_extcmd (cmd);
|
||||||
|
grub_disk_dev_unregister (&grub_loopback_dev);
|
||||||
|
}
|
||||||
1603
GRUB2/MOD_SRC/grub-2.04/grub-core/font/font.c
Normal file
1603
GRUB2/MOD_SRC/grub-2.04/grub-core/font/font.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -33,6 +33,7 @@
|
|||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
static int g_ventoy_no_joliet = 0;
|
static int g_ventoy_no_joliet = 0;
|
||||||
|
static int g_ventoy_cur_joliet = 0;
|
||||||
static grub_uint64_t g_ventoy_last_read_pos = 0;
|
static grub_uint64_t g_ventoy_last_read_pos = 0;
|
||||||
static grub_uint64_t g_ventoy_last_read_offset = 0;
|
static grub_uint64_t g_ventoy_last_read_offset = 0;
|
||||||
static grub_uint64_t g_ventoy_last_read_dirent_pos = 0;
|
static grub_uint64_t g_ventoy_last_read_dirent_pos = 0;
|
||||||
@@ -451,6 +452,7 @@ grub_iso9660_mount (grub_disk_t disk)
|
|||||||
|
|
||||||
data->disk = disk;
|
data->disk = disk;
|
||||||
|
|
||||||
|
g_ventoy_cur_joliet = 0;
|
||||||
block = 16;
|
block = 16;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -484,6 +486,7 @@ grub_iso9660_mount (grub_disk_t disk)
|
|||||||
if (0 == g_ventoy_no_joliet) {
|
if (0 == g_ventoy_no_joliet) {
|
||||||
copy_voldesc = 1;
|
copy_voldesc = 1;
|
||||||
data->joliet = 1;
|
data->joliet = 1;
|
||||||
|
g_ventoy_cur_joliet = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1118,6 +1121,11 @@ void grub_iso9660_set_nojoliet(int nojoliet)
|
|||||||
g_ventoy_no_joliet = nojoliet;
|
g_ventoy_no_joliet = nojoliet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int grub_iso9660_is_joliet(void)
|
||||||
|
{
|
||||||
|
return g_ventoy_cur_joliet;
|
||||||
|
}
|
||||||
|
|
||||||
grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file)
|
grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file)
|
||||||
{
|
{
|
||||||
(void)file;
|
(void)file;
|
||||||
|
|||||||
@@ -28,6 +28,8 @@
|
|||||||
|
|
||||||
extern int g_ventoy_memdisk_mode;
|
extern int g_ventoy_memdisk_mode;
|
||||||
extern int g_ventoy_iso_raw;
|
extern int g_ventoy_iso_raw;
|
||||||
|
extern int g_ventoy_grub2_mode;
|
||||||
|
extern int g_ventoy_wimboot_mode;
|
||||||
extern int g_ventoy_iso_uefi_drv;
|
extern int g_ventoy_iso_uefi_drv;
|
||||||
|
|
||||||
static const char *align_options[] =
|
static const char *align_options[] =
|
||||||
@@ -57,11 +59,15 @@ struct grub_gui_label
|
|||||||
grub_font_t font;
|
grub_font_t font;
|
||||||
grub_video_rgba_color_t color;
|
grub_video_rgba_color_t color;
|
||||||
int value;
|
int value;
|
||||||
|
int vtoytip;
|
||||||
enum align_mode align;
|
enum align_mode align;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct grub_gui_label *grub_gui_label_t;
|
typedef struct grub_gui_label *grub_gui_label_t;
|
||||||
|
|
||||||
|
extern const char * g_ventoy_tip_msg1;
|
||||||
|
extern const char * g_ventoy_tip_msg2;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
label_destroy (void *vself)
|
label_destroy (void *vself)
|
||||||
{
|
{
|
||||||
@@ -88,6 +94,7 @@ label_is_instance (void *vself __attribute__((unused)), const char *type)
|
|||||||
static void
|
static void
|
||||||
label_paint (void *vself, const grub_video_rect_t *region)
|
label_paint (void *vself, const grub_video_rect_t *region)
|
||||||
{
|
{
|
||||||
|
const char *text;
|
||||||
grub_gui_label_t self = vself;
|
grub_gui_label_t self = vself;
|
||||||
|
|
||||||
if (! self->visible)
|
if (! self->visible)
|
||||||
@@ -96,16 +103,24 @@ label_paint (void *vself, const grub_video_rect_t *region)
|
|||||||
if (!grub_video_have_common_points (region, &self->bounds))
|
if (!grub_video_have_common_points (region, &self->bounds))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (self->vtoytip == 1) {
|
||||||
|
text = g_ventoy_tip_msg1 ? g_ventoy_tip_msg1 : "";
|
||||||
|
} else if (self->vtoytip == 2) {
|
||||||
|
text = g_ventoy_tip_msg2 ? g_ventoy_tip_msg2 : "";
|
||||||
|
} else {
|
||||||
|
text = self->text;
|
||||||
|
}
|
||||||
|
|
||||||
/* Calculate the starting x coordinate. */
|
/* Calculate the starting x coordinate. */
|
||||||
int left_x;
|
int left_x;
|
||||||
if (self->align == align_left)
|
if (self->align == align_left)
|
||||||
left_x = 0;
|
left_x = 0;
|
||||||
else if (self->align == align_center)
|
else if (self->align == align_center)
|
||||||
left_x = (self->bounds.width
|
left_x = (self->bounds.width
|
||||||
- grub_font_get_string_width (self->font, self->text)) / 2;
|
- grub_font_get_string_width (self->font, text)) / 2;
|
||||||
else if (self->align == align_right)
|
else if (self->align == align_right)
|
||||||
left_x = (self->bounds.width
|
left_x = (self->bounds.width
|
||||||
- grub_font_get_string_width (self->font, self->text));
|
- grub_font_get_string_width (self->font, text));
|
||||||
else
|
else
|
||||||
return; /* Invalid alignment. */
|
return; /* Invalid alignment. */
|
||||||
|
|
||||||
@@ -114,7 +129,7 @@ label_paint (void *vself, const grub_video_rect_t *region)
|
|||||||
|
|
||||||
grub_video_rect_t vpsave;
|
grub_video_rect_t vpsave;
|
||||||
grub_gui_set_viewport (&self->bounds, &vpsave);
|
grub_gui_set_viewport (&self->bounds, &vpsave);
|
||||||
grub_font_draw_string (self->text,
|
grub_font_draw_string (text,
|
||||||
self->font,
|
self->font,
|
||||||
grub_video_map_rgba_color (self->color),
|
grub_video_map_rgba_color (self->color),
|
||||||
left_x,
|
left_x,
|
||||||
@@ -154,8 +169,8 @@ static void
|
|||||||
label_get_minimal_size (void *vself, unsigned *width, unsigned *height)
|
label_get_minimal_size (void *vself, unsigned *width, unsigned *height)
|
||||||
{
|
{
|
||||||
grub_gui_label_t self = vself;
|
grub_gui_label_t self = vself;
|
||||||
*width = grub_font_get_string_width (self->font, self->text);
|
*width = grub_font_get_string_width (self->font, self->text);
|
||||||
*height = (grub_font_get_ascent (self->font)
|
*height = (grub_font_get_ascent (self->font)
|
||||||
+ grub_font_get_descent (self->font));
|
+ grub_font_get_descent (self->font));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,6 +220,12 @@ label_set_property (void *vself, const char *name, const char *value)
|
|||||||
else if (grub_strcmp (value, "@VTOY_ISO_RAW@") == 0) {
|
else if (grub_strcmp (value, "@VTOY_ISO_RAW@") == 0) {
|
||||||
value = g_ventoy_iso_raw ? grub_env_get("VTOY_ISO_RAW_STR") : " ";
|
value = g_ventoy_iso_raw ? grub_env_get("VTOY_ISO_RAW_STR") : " ";
|
||||||
}
|
}
|
||||||
|
else if (grub_strcmp (value, "@VTOY_GRUB2_MODE@") == 0) {
|
||||||
|
value = g_ventoy_grub2_mode ? grub_env_get("VTOY_GRUB2_MODE_STR") : " ";
|
||||||
|
}
|
||||||
|
else if (grub_strcmp (value, "@VTOY_WIMBOOT_MODE@") == 0) {
|
||||||
|
value = g_ventoy_wimboot_mode ? grub_env_get("VTOY_WIMBOOT_MODE_STR") : " ";
|
||||||
|
}
|
||||||
else if (grub_strcmp (value, "@VTOY_ISO_UEFI_DRV@") == 0) {
|
else if (grub_strcmp (value, "@VTOY_ISO_UEFI_DRV@") == 0) {
|
||||||
value = g_ventoy_iso_uefi_drv ? grub_env_get("VTOY_ISO_UEFI_DRV_STR") : " ";
|
value = g_ventoy_iso_uefi_drv ? grub_env_get("VTOY_ISO_UEFI_DRV_STR") : " ";
|
||||||
}
|
}
|
||||||
@@ -247,8 +268,14 @@ label_set_property (void *vself, const char *name, const char *value)
|
|||||||
{
|
{
|
||||||
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
|
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
|
||||||
grub_free (self->id);
|
grub_free (self->id);
|
||||||
if (value)
|
if (value) {
|
||||||
self->id = grub_strdup (value);
|
self->id = grub_strdup (value);
|
||||||
|
if (grub_strcmp(value, "VTOY_MENU_TIP_1") == 0) {
|
||||||
|
self->vtoytip = 1;
|
||||||
|
} else if (grub_strcmp(value, "VTOY_MENU_TIP_2") == 0) {
|
||||||
|
self->vtoytip = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
self->id = 0;
|
self->id = 0;
|
||||||
if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)
|
if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)
|
||||||
|
|||||||
@@ -733,6 +733,8 @@ done:
|
|||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern int g_menu_update_mode;
|
||||||
|
|
||||||
/* Set properties on the view based on settings from the specified
|
/* Set properties on the view based on settings from the specified
|
||||||
theme file. */
|
theme file. */
|
||||||
grub_err_t
|
grub_err_t
|
||||||
@@ -752,7 +754,7 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
p.len = grub_file_size (file);
|
p.len = grub_file_size (file);
|
||||||
p.buf = grub_malloc (p.len + 4096);
|
p.buf = grub_malloc (p.len + 8192);
|
||||||
p.pos = 0;
|
p.pos = 0;
|
||||||
p.line_num = 1;
|
p.line_num = 1;
|
||||||
p.col_num = 1;
|
p.col_num = 1;
|
||||||
@@ -781,6 +783,33 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const char *tip = grub_env_get("VTOY_MENU_TIP_ENABLE");
|
||||||
|
if (tip && tip[0] == '1')
|
||||||
|
{
|
||||||
|
char tmpmsg[512];
|
||||||
|
|
||||||
|
grub_memset(tmpmsg, 'w', 500);
|
||||||
|
tmpmsg[500] = 0;
|
||||||
|
|
||||||
|
g_menu_update_mode = 1;
|
||||||
|
p.len += grub_snprintf(p.buf + p.len, 4096,
|
||||||
|
"\n+ vbox{\n left = %s\n top = %s\n"
|
||||||
|
"+ label { id=\"VTOY_MENU_TIP_1\" text = \"%s\" color = \"%s\" align = \"%s\"}\n"
|
||||||
|
"+ label { id=\"VTOY_MENU_TIP_2\" text = \"%s\" color = \"%s\" align = \"%s\"}\n"
|
||||||
|
"}\n",
|
||||||
|
grub_env_get("VTOY_TIP_LEFT"),
|
||||||
|
grub_env_get("VTOY_TIP_TOP"),
|
||||||
|
tmpmsg,
|
||||||
|
grub_env_get("VTOY_TIP_COLOR"),
|
||||||
|
grub_env_get("VTOY_TIP_ALIGN"),
|
||||||
|
tmpmsg,
|
||||||
|
grub_env_get("VTOY_TIP_COLOR"),
|
||||||
|
grub_env_get("VTOY_TIP_ALIGN")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (view->canvas)
|
if (view->canvas)
|
||||||
view->canvas->component.ops->destroy (view->canvas);
|
view->canvas->component.ops->destroy (view->canvas);
|
||||||
|
|
||||||
|
|||||||
@@ -386,21 +386,37 @@ redraw_menu_visit (grub_gui_component_t component,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern int g_menu_update_mode;
|
||||||
|
|
||||||
|
static void grub_gfxmenu_update_all(grub_gfxmenu_view_t view)
|
||||||
|
{
|
||||||
|
grub_video_set_area_status(GRUB_VIDEO_AREA_DISABLED);
|
||||||
|
grub_gfxmenu_view_redraw(view, &view->screen);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_gfxmenu_redraw_menu (grub_gfxmenu_view_t view)
|
grub_gfxmenu_redraw_menu (grub_gfxmenu_view_t view)
|
||||||
{
|
{
|
||||||
update_menu_components (view);
|
update_menu_components (view);
|
||||||
|
|
||||||
grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas,
|
if (g_menu_update_mode)
|
||||||
redraw_menu_visit, view);
|
grub_gfxmenu_update_all(view);
|
||||||
|
else
|
||||||
|
grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas,
|
||||||
|
redraw_menu_visit, view);
|
||||||
|
|
||||||
grub_video_swap_buffers ();
|
grub_video_swap_buffers ();
|
||||||
if (view->double_repaint)
|
if (view->double_repaint)
|
||||||
{
|
{
|
||||||
grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas,
|
if (g_menu_update_mode)
|
||||||
redraw_menu_visit, view);
|
grub_gfxmenu_update_all(view);
|
||||||
|
else
|
||||||
|
grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas,
|
||||||
|
redraw_menu_visit, view);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_gfxmenu_set_chosen_entry (int entry, void *data)
|
grub_gfxmenu_set_chosen_entry (int entry, void *data)
|
||||||
{
|
{
|
||||||
@@ -408,6 +424,8 @@ grub_gfxmenu_set_chosen_entry (int entry, void *data)
|
|||||||
|
|
||||||
view->selected = entry;
|
view->selected = entry;
|
||||||
grub_gfxmenu_redraw_menu (view);
|
grub_gfxmenu_redraw_menu (view);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -964,3 +964,20 @@ void * grub_efi_allocate_iso_buf(grub_uint64_t size)
|
|||||||
|
|
||||||
return (void *)(unsigned long)address;
|
return (void *)(unsigned long)address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void * grub_efi_allocate_chain_buf(grub_uint64_t size)
|
||||||
|
{
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
grub_efi_status_t status;
|
||||||
|
grub_efi_physical_address_t address = 0;
|
||||||
|
grub_efi_uintn_t pages = GRUB_EFI_BYTES_TO_PAGES(size);
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
status = efi_call_4 (b->allocate_pages, GRUB_EFI_ALLOCATE_ANY_PAGES, GRUB_EFI_LOADER_DATA, pages, &address);
|
||||||
|
if (status != GRUB_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (void *)(unsigned long)address;
|
||||||
|
}
|
||||||
|
|||||||
672
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/efi/mm.c
Normal file
672
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/efi/mm.c
Normal file
@@ -0,0 +1,672 @@
|
|||||||
|
/* mm.c - generic EFI memory management */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2006,2007,2008,2009 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/efi/api.h>
|
||||||
|
#include <grub/efi/efi.h>
|
||||||
|
#include <grub/cpu/efi/memory.h>
|
||||||
|
|
||||||
|
#if defined (__i386__) || defined (__x86_64__)
|
||||||
|
#include <grub/pci.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NEXT_MEMORY_DESCRIPTOR(desc, size) \
|
||||||
|
((grub_efi_memory_descriptor_t *) ((char *) (desc) + (size)))
|
||||||
|
|
||||||
|
#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12)
|
||||||
|
#define BYTES_TO_PAGES_DOWN(bytes) ((bytes) >> 12)
|
||||||
|
#define PAGES_TO_BYTES(pages) ((pages) << 12)
|
||||||
|
|
||||||
|
/* The size of a memory map obtained from the firmware. This must be
|
||||||
|
a multiplier of 4KB. */
|
||||||
|
#define MEMORY_MAP_SIZE 0x3000
|
||||||
|
|
||||||
|
/* The minimum and maximum heap size for GRUB itself. */
|
||||||
|
#define MIN_HEAP_SIZE 0x100000
|
||||||
|
#define MAX_HEAP_SIZE (1600 * 0x100000)
|
||||||
|
|
||||||
|
static void *finish_mmap_buf = 0;
|
||||||
|
static grub_efi_uintn_t finish_mmap_size = 0;
|
||||||
|
static grub_efi_uintn_t finish_key = 0;
|
||||||
|
static grub_efi_uintn_t finish_desc_size;
|
||||||
|
static grub_efi_uint32_t finish_desc_version;
|
||||||
|
int grub_efi_is_finished = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need to roll back EFI allocations on exit. Remember allocations that
|
||||||
|
* we'll free on exit.
|
||||||
|
*/
|
||||||
|
struct efi_allocation;
|
||||||
|
struct efi_allocation {
|
||||||
|
grub_efi_physical_address_t address;
|
||||||
|
grub_efi_uint64_t pages;
|
||||||
|
struct efi_allocation *next;
|
||||||
|
};
|
||||||
|
static struct efi_allocation *efi_allocated_memory;
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_store_alloc (grub_efi_physical_address_t address,
|
||||||
|
grub_efi_uintn_t pages)
|
||||||
|
{
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
struct efi_allocation *alloc;
|
||||||
|
grub_efi_status_t status;
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
status = efi_call_3 (b->allocate_pool, GRUB_EFI_LOADER_DATA,
|
||||||
|
sizeof(*alloc), (void**)&alloc);
|
||||||
|
|
||||||
|
if (status == GRUB_EFI_SUCCESS)
|
||||||
|
{
|
||||||
|
alloc->next = efi_allocated_memory;
|
||||||
|
alloc->address = address;
|
||||||
|
alloc->pages = pages;
|
||||||
|
efi_allocated_memory = alloc;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
grub_printf ("Could not malloc memory to remember EFI allocation. "
|
||||||
|
"Exiting GRUB won't free all memory.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_drop_alloc (grub_efi_physical_address_t address,
|
||||||
|
grub_efi_uintn_t pages)
|
||||||
|
{
|
||||||
|
struct efi_allocation *ea, *eap;
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
|
||||||
|
for (eap = NULL, ea = efi_allocated_memory; ea; eap = ea, ea = ea->next)
|
||||||
|
{
|
||||||
|
if (ea->address != address || ea->pages != pages)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Remove the current entry from the list. */
|
||||||
|
if (eap)
|
||||||
|
eap->next = ea->next;
|
||||||
|
else
|
||||||
|
efi_allocated_memory = ea->next;
|
||||||
|
|
||||||
|
/* Then free the memory backing it. */
|
||||||
|
efi_call_1 (b->free_pool, ea);
|
||||||
|
|
||||||
|
/* And leave, we're done. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate pages. Return the pointer to the first of allocated pages. */
|
||||||
|
void *
|
||||||
|
grub_efi_allocate_pages_real (grub_efi_physical_address_t address,
|
||||||
|
grub_efi_uintn_t pages,
|
||||||
|
grub_efi_allocate_type_t alloctype,
|
||||||
|
grub_efi_memory_type_t memtype)
|
||||||
|
{
|
||||||
|
grub_efi_status_t status;
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
|
||||||
|
/* Limit the memory access to less than 4GB for 32-bit platforms. */
|
||||||
|
if (address > GRUB_EFI_MAX_USABLE_ADDRESS)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address);
|
||||||
|
if (status != GRUB_EFI_SUCCESS)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (address == 0)
|
||||||
|
{
|
||||||
|
/* Uggh, the address 0 was allocated... This is too annoying,
|
||||||
|
so reallocate another one. */
|
||||||
|
address = GRUB_EFI_MAX_USABLE_ADDRESS;
|
||||||
|
status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address);
|
||||||
|
grub_efi_free_pages (0, pages);
|
||||||
|
if (status != GRUB_EFI_SUCCESS)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_efi_store_alloc (address, pages);
|
||||||
|
|
||||||
|
return (void *) ((grub_addr_t) address);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
grub_efi_allocate_any_pages (grub_efi_uintn_t pages)
|
||||||
|
{
|
||||||
|
return grub_efi_allocate_pages_real (GRUB_EFI_MAX_USABLE_ADDRESS,
|
||||||
|
pages, GRUB_EFI_ALLOCATE_MAX_ADDRESS,
|
||||||
|
GRUB_EFI_LOADER_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
grub_efi_allocate_fixed (grub_efi_physical_address_t address,
|
||||||
|
grub_efi_uintn_t pages)
|
||||||
|
{
|
||||||
|
return grub_efi_allocate_pages_real (address, pages,
|
||||||
|
GRUB_EFI_ALLOCATE_ADDRESS,
|
||||||
|
GRUB_EFI_LOADER_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free pages starting from ADDRESS. */
|
||||||
|
void
|
||||||
|
grub_efi_free_pages (grub_efi_physical_address_t address,
|
||||||
|
grub_efi_uintn_t pages)
|
||||||
|
{
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
efi_call_2 (b->free_pages, address, pages);
|
||||||
|
|
||||||
|
grub_efi_drop_alloc (address, pages);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined (__i386__) || defined (__x86_64__)
|
||||||
|
|
||||||
|
/* Helper for stop_broadcom. */
|
||||||
|
static int
|
||||||
|
find_card (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||||
|
void *data __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
grub_pci_address_t addr;
|
||||||
|
grub_uint8_t cap;
|
||||||
|
grub_uint16_t pm_state;
|
||||||
|
|
||||||
|
if ((pciid & 0xffff) != GRUB_PCI_VENDOR_BROADCOM)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
|
if (grub_pci_read (addr) >> 24 != GRUB_PCI_CLASS_NETWORK)
|
||||||
|
return 0;
|
||||||
|
cap = grub_pci_find_capability (dev, GRUB_PCI_CAP_POWER_MANAGEMENT);
|
||||||
|
if (!cap)
|
||||||
|
return 0;
|
||||||
|
addr = grub_pci_make_address (dev, cap + 4);
|
||||||
|
pm_state = grub_pci_read_word (addr);
|
||||||
|
pm_state = pm_state | 0x03;
|
||||||
|
grub_pci_write_word (addr, pm_state);
|
||||||
|
grub_pci_read_word (addr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
stop_broadcom (void)
|
||||||
|
{
|
||||||
|
grub_pci_iterate (find_card, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_efi_finish_boot_services (grub_efi_uintn_t *outbuf_size, void *outbuf,
|
||||||
|
grub_efi_uintn_t *map_key,
|
||||||
|
grub_efi_uintn_t *efi_desc_size,
|
||||||
|
grub_efi_uint32_t *efi_desc_version)
|
||||||
|
{
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
grub_efi_status_t status;
|
||||||
|
|
||||||
|
#if defined (__i386__) || defined (__x86_64__)
|
||||||
|
const grub_uint16_t apple[] = { 'A', 'p', 'p', 'l', 'e' };
|
||||||
|
int is_apple;
|
||||||
|
|
||||||
|
is_apple = (grub_memcmp (grub_efi_system_table->firmware_vendor,
|
||||||
|
apple, sizeof (apple)) == 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
|
||||||
|
&finish_desc_size, &finish_desc_version) < 0)
|
||||||
|
return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
|
||||||
|
|
||||||
|
if (outbuf && *outbuf_size < finish_mmap_size)
|
||||||
|
return grub_error (GRUB_ERR_IO, "memory map buffer is too small");
|
||||||
|
|
||||||
|
finish_mmap_buf = grub_malloc (finish_mmap_size);
|
||||||
|
if (!finish_mmap_buf)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
|
||||||
|
&finish_desc_size, &finish_desc_version) <= 0)
|
||||||
|
{
|
||||||
|
grub_free (finish_mmap_buf);
|
||||||
|
return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
|
||||||
|
}
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
status = efi_call_2 (b->exit_boot_services, grub_efi_image_handle,
|
||||||
|
finish_key);
|
||||||
|
if (status == GRUB_EFI_SUCCESS)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (status != GRUB_EFI_INVALID_PARAMETER)
|
||||||
|
{
|
||||||
|
grub_free (finish_mmap_buf);
|
||||||
|
return grub_error (GRUB_ERR_IO, "couldn't terminate EFI services");
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_free (finish_mmap_buf);
|
||||||
|
grub_printf ("Trying to terminate EFI services again\n");
|
||||||
|
}
|
||||||
|
grub_efi_is_finished = 1;
|
||||||
|
if (outbuf_size)
|
||||||
|
*outbuf_size = finish_mmap_size;
|
||||||
|
if (outbuf)
|
||||||
|
grub_memcpy (outbuf, finish_mmap_buf, finish_mmap_size);
|
||||||
|
if (map_key)
|
||||||
|
*map_key = finish_key;
|
||||||
|
if (efi_desc_size)
|
||||||
|
*efi_desc_size = finish_desc_size;
|
||||||
|
if (efi_desc_version)
|
||||||
|
*efi_desc_version = finish_desc_version;
|
||||||
|
|
||||||
|
#if defined (__i386__) || defined (__x86_64__)
|
||||||
|
if (is_apple)
|
||||||
|
stop_broadcom ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To obtain the UEFI memory map, we must pass a buffer of sufficient size
|
||||||
|
* to hold the entire map. This function returns a sane start value for
|
||||||
|
* buffer size.
|
||||||
|
*/
|
||||||
|
grub_efi_uintn_t
|
||||||
|
grub_efi_find_mmap_size (void)
|
||||||
|
{
|
||||||
|
grub_efi_uintn_t mmap_size = 0;
|
||||||
|
grub_efi_uintn_t desc_size;
|
||||||
|
|
||||||
|
if (grub_efi_get_memory_map (&mmap_size, NULL, NULL, &desc_size, 0) < 0)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_IO, "cannot get EFI memory map size");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add an extra page, since UEFI can alter the memory map itself on
|
||||||
|
* callbacks or explicit calls, including console output.
|
||||||
|
*/
|
||||||
|
return ALIGN_UP (mmap_size + GRUB_EFI_PAGE_SIZE, GRUB_EFI_PAGE_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the memory map as defined in the EFI spec. Return 1 if successful,
|
||||||
|
return 0 if partial, or return -1 if an error occurs. */
|
||||||
|
int
|
||||||
|
grub_efi_get_memory_map (grub_efi_uintn_t *memory_map_size,
|
||||||
|
grub_efi_memory_descriptor_t *memory_map,
|
||||||
|
grub_efi_uintn_t *map_key,
|
||||||
|
grub_efi_uintn_t *descriptor_size,
|
||||||
|
grub_efi_uint32_t *descriptor_version)
|
||||||
|
{
|
||||||
|
grub_efi_status_t status;
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
grub_efi_uintn_t key;
|
||||||
|
grub_efi_uint32_t version;
|
||||||
|
grub_efi_uintn_t size;
|
||||||
|
|
||||||
|
if (grub_efi_is_finished)
|
||||||
|
{
|
||||||
|
int ret = 1;
|
||||||
|
if (*memory_map_size < finish_mmap_size)
|
||||||
|
{
|
||||||
|
grub_memcpy (memory_map, finish_mmap_buf, *memory_map_size);
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_memcpy (memory_map, finish_mmap_buf, finish_mmap_size);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
*memory_map_size = finish_mmap_size;
|
||||||
|
if (map_key)
|
||||||
|
*map_key = finish_key;
|
||||||
|
if (descriptor_size)
|
||||||
|
*descriptor_size = finish_desc_size;
|
||||||
|
if (descriptor_version)
|
||||||
|
*descriptor_version = finish_desc_version;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allow some parameters to be missing. */
|
||||||
|
if (! map_key)
|
||||||
|
map_key = &key;
|
||||||
|
if (! descriptor_version)
|
||||||
|
descriptor_version = &version;
|
||||||
|
if (! descriptor_size)
|
||||||
|
descriptor_size = &size;
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
status = efi_call_5 (b->get_memory_map, memory_map_size, memory_map, map_key,
|
||||||
|
descriptor_size, descriptor_version);
|
||||||
|
if (*descriptor_size == 0)
|
||||||
|
*descriptor_size = sizeof (grub_efi_memory_descriptor_t);
|
||||||
|
if (status == GRUB_EFI_SUCCESS)
|
||||||
|
return 1;
|
||||||
|
else if (status == GRUB_EFI_BUFFER_TOO_SMALL)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sort the memory map in place. */
|
||||||
|
static void
|
||||||
|
sort_memory_map (grub_efi_memory_descriptor_t *memory_map,
|
||||||
|
grub_efi_uintn_t desc_size,
|
||||||
|
grub_efi_memory_descriptor_t *memory_map_end)
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t *d1;
|
||||||
|
grub_efi_memory_descriptor_t *d2;
|
||||||
|
|
||||||
|
for (d1 = memory_map;
|
||||||
|
d1 < memory_map_end;
|
||||||
|
d1 = NEXT_MEMORY_DESCRIPTOR (d1, desc_size))
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t *max_desc = d1;
|
||||||
|
|
||||||
|
for (d2 = NEXT_MEMORY_DESCRIPTOR (d1, desc_size);
|
||||||
|
d2 < memory_map_end;
|
||||||
|
d2 = NEXT_MEMORY_DESCRIPTOR (d2, desc_size))
|
||||||
|
{
|
||||||
|
if (max_desc->num_pages < d2->num_pages)
|
||||||
|
max_desc = d2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_desc != d1)
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t tmp;
|
||||||
|
|
||||||
|
tmp = *d1;
|
||||||
|
*d1 = *max_desc;
|
||||||
|
*max_desc = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Filter the descriptors. GRUB needs only available memory. */
|
||||||
|
static grub_efi_memory_descriptor_t *
|
||||||
|
filter_memory_map (grub_efi_memory_descriptor_t *memory_map,
|
||||||
|
grub_efi_memory_descriptor_t *filtered_memory_map,
|
||||||
|
grub_efi_uintn_t desc_size,
|
||||||
|
grub_efi_memory_descriptor_t *memory_map_end)
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t *desc;
|
||||||
|
grub_efi_memory_descriptor_t *filtered_desc;
|
||||||
|
|
||||||
|
for (desc = memory_map, filtered_desc = filtered_memory_map;
|
||||||
|
desc < memory_map_end;
|
||||||
|
desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||||
|
{
|
||||||
|
if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY
|
||||||
|
#if 1
|
||||||
|
&& desc->physical_start <= GRUB_EFI_MAX_USABLE_ADDRESS
|
||||||
|
#endif
|
||||||
|
&& desc->physical_start + PAGES_TO_BYTES (desc->num_pages) > 0x100000
|
||||||
|
&& desc->num_pages != 0)
|
||||||
|
{
|
||||||
|
grub_memcpy (filtered_desc, desc, desc_size);
|
||||||
|
|
||||||
|
/* Avoid less than 1MB, because some loaders seem to be confused. */
|
||||||
|
if (desc->physical_start < 0x100000)
|
||||||
|
{
|
||||||
|
desc->num_pages -= BYTES_TO_PAGES (0x100000
|
||||||
|
- desc->physical_start);
|
||||||
|
desc->physical_start = 0x100000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
if (BYTES_TO_PAGES (filtered_desc->physical_start)
|
||||||
|
+ filtered_desc->num_pages
|
||||||
|
> BYTES_TO_PAGES_DOWN (GRUB_EFI_MAX_USABLE_ADDRESS))
|
||||||
|
filtered_desc->num_pages
|
||||||
|
= (BYTES_TO_PAGES_DOWN (GRUB_EFI_MAX_USABLE_ADDRESS)
|
||||||
|
- BYTES_TO_PAGES (filtered_desc->physical_start));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (filtered_desc->num_pages == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
filtered_desc = NEXT_MEMORY_DESCRIPTOR (filtered_desc, desc_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return filtered_desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the total number of pages. */
|
||||||
|
static grub_efi_uint64_t
|
||||||
|
get_total_pages (grub_efi_memory_descriptor_t *memory_map,
|
||||||
|
grub_efi_uintn_t desc_size,
|
||||||
|
grub_efi_memory_descriptor_t *memory_map_end)
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t *desc;
|
||||||
|
grub_efi_uint64_t total = 0;
|
||||||
|
|
||||||
|
for (desc = memory_map;
|
||||||
|
desc < memory_map_end;
|
||||||
|
desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||||
|
total += desc->num_pages;
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add memory regions. */
|
||||||
|
static void
|
||||||
|
add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
|
||||||
|
grub_efi_uintn_t desc_size,
|
||||||
|
grub_efi_memory_descriptor_t *memory_map_end,
|
||||||
|
grub_efi_uint64_t required_pages)
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t *desc;
|
||||||
|
|
||||||
|
for (desc = memory_map;
|
||||||
|
desc < memory_map_end;
|
||||||
|
desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||||
|
{
|
||||||
|
grub_efi_uint64_t pages;
|
||||||
|
grub_efi_physical_address_t start;
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
start = desc->physical_start;
|
||||||
|
pages = desc->num_pages;
|
||||||
|
if (pages > required_pages)
|
||||||
|
{
|
||||||
|
start += PAGES_TO_BYTES (pages - required_pages);
|
||||||
|
pages = required_pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = grub_efi_allocate_pages_real (start, pages,
|
||||||
|
GRUB_EFI_ALLOCATE_ADDRESS,
|
||||||
|
GRUB_EFI_LOADER_CODE);
|
||||||
|
if (! addr)
|
||||||
|
grub_fatal ("cannot allocate conventional memory %p with %u pages",
|
||||||
|
(void *) ((grub_addr_t) start),
|
||||||
|
(unsigned) pages);
|
||||||
|
|
||||||
|
grub_mm_init_region (addr, PAGES_TO_BYTES (pages));
|
||||||
|
|
||||||
|
required_pages -= pages;
|
||||||
|
if (required_pages == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (required_pages > 0)
|
||||||
|
grub_fatal ("too little memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_efi_memory_fini (void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Free all stale allocations. grub_efi_free_pages() will remove
|
||||||
|
* the found entry from the list and it will always find the first
|
||||||
|
* list entry (efi_allocated_memory is the list start). Hence we
|
||||||
|
* remove all entries from the list until none is left altogether.
|
||||||
|
*/
|
||||||
|
while (efi_allocated_memory)
|
||||||
|
grub_efi_free_pages (efi_allocated_memory->address,
|
||||||
|
efi_allocated_memory->pages);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Print the memory map. */
|
||||||
|
static void
|
||||||
|
print_memory_map (grub_efi_memory_descriptor_t *memory_map,
|
||||||
|
grub_efi_uintn_t desc_size,
|
||||||
|
grub_efi_memory_descriptor_t *memory_map_end)
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t *desc;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (desc = memory_map, i = 0;
|
||||||
|
desc < memory_map_end;
|
||||||
|
desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size), i++)
|
||||||
|
{
|
||||||
|
grub_printf ("MD: t=%x, p=%llx, v=%llx, n=%llx, a=%llx\n",
|
||||||
|
desc->type, desc->physical_start, desc->virtual_start,
|
||||||
|
desc->num_pages, desc->attribute);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_efi_mm_init (void)
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t *memory_map;
|
||||||
|
grub_efi_memory_descriptor_t *memory_map_end;
|
||||||
|
grub_efi_memory_descriptor_t *filtered_memory_map;
|
||||||
|
grub_efi_memory_descriptor_t *filtered_memory_map_end;
|
||||||
|
grub_efi_uintn_t map_size;
|
||||||
|
grub_efi_uintn_t desc_size;
|
||||||
|
grub_efi_uint64_t total_pages;
|
||||||
|
grub_efi_uint64_t required_pages;
|
||||||
|
int mm_status;
|
||||||
|
|
||||||
|
/* Prepare a memory region to store two memory maps. */
|
||||||
|
memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
|
||||||
|
if (! memory_map)
|
||||||
|
grub_fatal ("cannot allocate memory");
|
||||||
|
|
||||||
|
/* Obtain descriptors for available memory. */
|
||||||
|
map_size = MEMORY_MAP_SIZE;
|
||||||
|
|
||||||
|
mm_status = grub_efi_get_memory_map (&map_size, memory_map, 0, &desc_size, 0);
|
||||||
|
|
||||||
|
if (mm_status == 0)
|
||||||
|
{
|
||||||
|
grub_efi_free_pages
|
||||||
|
((grub_efi_physical_address_t) ((grub_addr_t) memory_map),
|
||||||
|
2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
|
||||||
|
|
||||||
|
/* Freeing/allocating operations may increase memory map size. */
|
||||||
|
map_size += desc_size * 32;
|
||||||
|
|
||||||
|
memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (map_size));
|
||||||
|
if (! memory_map)
|
||||||
|
grub_fatal ("cannot allocate memory");
|
||||||
|
|
||||||
|
mm_status = grub_efi_get_memory_map (&map_size, memory_map, 0,
|
||||||
|
&desc_size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mm_status < 0)
|
||||||
|
grub_fatal ("cannot get memory map");
|
||||||
|
|
||||||
|
memory_map_end = NEXT_MEMORY_DESCRIPTOR (memory_map, map_size);
|
||||||
|
|
||||||
|
filtered_memory_map = memory_map_end;
|
||||||
|
|
||||||
|
filtered_memory_map_end = filter_memory_map (memory_map, filtered_memory_map,
|
||||||
|
desc_size, memory_map_end);
|
||||||
|
|
||||||
|
/* By default, request a quarter of the available memory. */
|
||||||
|
total_pages = get_total_pages (filtered_memory_map, desc_size,
|
||||||
|
filtered_memory_map_end);
|
||||||
|
|
||||||
|
#if defined (__mips__) && (_MIPS_SIM == _ABI64)
|
||||||
|
required_pages = (total_pages > 4096) ? (total_pages - 4096) : (total_pages >> 1);
|
||||||
|
#else
|
||||||
|
required_pages = (total_pages >> 2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (required_pages < BYTES_TO_PAGES (MIN_HEAP_SIZE))
|
||||||
|
required_pages = BYTES_TO_PAGES (MIN_HEAP_SIZE);
|
||||||
|
else if (required_pages > BYTES_TO_PAGES (MAX_HEAP_SIZE))
|
||||||
|
required_pages = BYTES_TO_PAGES (MAX_HEAP_SIZE);
|
||||||
|
|
||||||
|
/* Sort the filtered descriptors, so that GRUB can allocate pages
|
||||||
|
from smaller regions. */
|
||||||
|
sort_memory_map (filtered_memory_map, desc_size, filtered_memory_map_end);
|
||||||
|
|
||||||
|
/* Allocate memory regions for GRUB's memory management. */
|
||||||
|
add_memory_regions (filtered_memory_map, desc_size,
|
||||||
|
filtered_memory_map_end, required_pages);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* For debug. */
|
||||||
|
map_size = MEMORY_MAP_SIZE;
|
||||||
|
|
||||||
|
if (grub_efi_get_memory_map (&map_size, memory_map, 0, &desc_size, 0) < 0)
|
||||||
|
grub_fatal ("cannot get memory map");
|
||||||
|
|
||||||
|
grub_printf ("printing memory map\n");
|
||||||
|
print_memory_map (memory_map, desc_size,
|
||||||
|
NEXT_MEMORY_DESCRIPTOR (memory_map, map_size));
|
||||||
|
grub_fatal ("Debug. ");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Release the memory maps. */
|
||||||
|
grub_efi_free_pages ((grub_addr_t) memory_map,
|
||||||
|
2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined (__aarch64__) || defined (__arm__) || defined (__riscv)
|
||||||
|
grub_err_t
|
||||||
|
grub_efi_get_ram_base(grub_addr_t *base_addr)
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t *memory_map, *desc;
|
||||||
|
grub_efi_uintn_t memory_map_size, desc_size;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memory_map_size = grub_efi_find_mmap_size();
|
||||||
|
|
||||||
|
memory_map = grub_malloc (memory_map_size);
|
||||||
|
if (! memory_map)
|
||||||
|
return GRUB_ERR_OUT_OF_MEMORY;
|
||||||
|
ret = grub_efi_get_memory_map (&memory_map_size, memory_map, NULL,
|
||||||
|
&desc_size, NULL);
|
||||||
|
|
||||||
|
if (ret < 1)
|
||||||
|
return GRUB_ERR_BUG;
|
||||||
|
|
||||||
|
for (desc = memory_map, *base_addr = GRUB_EFI_MAX_USABLE_ADDRESS;
|
||||||
|
(grub_addr_t) desc < ((grub_addr_t) memory_map + memory_map_size);
|
||||||
|
desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||||
|
if (desc->attribute & GRUB_EFI_MEMORY_WB)
|
||||||
|
*base_addr = grub_min (*base_addr, desc->physical_start);
|
||||||
|
|
||||||
|
grub_free(memory_map);
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
23
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/cache.S
Normal file
23
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/cache.S
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
|
||||||
|
FUNCTION (grub_arch_sync_caches)
|
||||||
|
jr.hb $ra
|
||||||
|
|
||||||
150
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/dl.c
Normal file
150
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/dl.c
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
/* dl-mips64.c - arch-dependent part of loadable module support */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2002,2005,2007,2009,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/elf.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/cpu/types.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
|
||||||
|
/* Check if EHDR is a valid ELF header. */
|
||||||
|
grub_err_t
|
||||||
|
grub_arch_dl_check_header (void *ehdr)
|
||||||
|
{
|
||||||
|
Elf_Ehdr *e = ehdr;
|
||||||
|
|
||||||
|
/* Check the magic numbers. */
|
||||||
|
#ifdef GRUB_CPU_WORDS_BIGENDIAN
|
||||||
|
if (e->e_ident[EI_CLASS] != ELFCLASS64
|
||||||
|
|| e->e_ident[EI_DATA] != ELFDATA2MSB
|
||||||
|
|| e->e_machine != EM_MIPS)
|
||||||
|
#else
|
||||||
|
if (e->e_ident[EI_CLASS] != ELFCLASS64
|
||||||
|
|| e->e_ident[EI_DATA] != ELFDATA2LSB
|
||||||
|
|| e->e_machine != EM_MIPS)
|
||||||
|
#endif
|
||||||
|
return grub_error (GRUB_ERR_BAD_OS, N_("invalid arch-dependent ELF magic"));
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma GCC diagnostic ignored "-Wcast-align"
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_arch_dl_get_tramp_got_size (const void *ehdr __attribute__ ((unused)),
|
||||||
|
grub_size_t *tramp, grub_size_t *got)
|
||||||
|
{
|
||||||
|
*tramp = 0;
|
||||||
|
*got = 0;
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Relocate symbols. */
|
||||||
|
grub_err_t
|
||||||
|
grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||||
|
Elf_Shdr *s, grub_dl_segment_t seg)
|
||||||
|
{
|
||||||
|
Elf_Ehdr *e = ehdr;
|
||||||
|
Elf_Rel *rel, *max;
|
||||||
|
|
||||||
|
for (rel = (Elf_Rel *) ((char *) e + s->sh_offset),
|
||||||
|
max = (Elf_Rel *) ((char *) rel + s->sh_size);
|
||||||
|
rel < max;
|
||||||
|
rel = (Elf_Rel *) ((char *) rel + s->sh_entsize))
|
||||||
|
{
|
||||||
|
grub_uint8_t *addr;
|
||||||
|
Elf_Sym *sym;
|
||||||
|
Elf_Addr r_info;
|
||||||
|
grub_uint64_t sym_value;
|
||||||
|
|
||||||
|
if (seg->size < rel->r_offset)
|
||||||
|
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||||
|
"reloc offset is out of the segment");
|
||||||
|
|
||||||
|
r_info = ((grub_uint64_t) rel->r_info << 32) |
|
||||||
|
(grub_uint32_t) grub_be_to_cpu64 (rel->r_info);
|
||||||
|
|
||||||
|
addr = (grub_uint8_t *) ((char *) seg->addr + rel->r_offset);
|
||||||
|
sym = (Elf_Sym *) ((char *) mod->symtab
|
||||||
|
+ mod->symsize * ELF_R_SYM (r_info));
|
||||||
|
sym_value = sym->st_value;
|
||||||
|
if (s->sh_type == SHT_RELA)
|
||||||
|
{
|
||||||
|
sym_value += ((Elf_Rela *) rel)->r_addend;
|
||||||
|
}
|
||||||
|
switch (ELF_R_TYPE (r_info))
|
||||||
|
{
|
||||||
|
case R_MIPS_64:
|
||||||
|
*(grub_uint64_t *) addr += sym_value;
|
||||||
|
break;
|
||||||
|
case R_MIPS_32:
|
||||||
|
*(grub_uint32_t *) addr += sym_value;
|
||||||
|
break;
|
||||||
|
case R_MIPS_26:
|
||||||
|
{
|
||||||
|
grub_uint32_t value;
|
||||||
|
grub_uint32_t raw;
|
||||||
|
raw = (*(grub_uint32_t *) addr) & 0x3ffffff;
|
||||||
|
value = raw << 2;
|
||||||
|
value += sym_value;
|
||||||
|
raw = (value >> 2) & 0x3ffffff;
|
||||||
|
|
||||||
|
*(grub_uint32_t *) addr =
|
||||||
|
raw | ((*(grub_uint32_t *) addr) & 0xfc000000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R_MIPS_LO16:
|
||||||
|
#ifdef GRUB_CPU_WORDS_BIGENDIAN
|
||||||
|
addr += 2;
|
||||||
|
#endif
|
||||||
|
*(grub_uint16_t *) addr = (grub_int16_t) sym_value;
|
||||||
|
break;
|
||||||
|
case R_MIPS_HI16:
|
||||||
|
#ifdef GRUB_CPU_WORDS_BIGENDIAN
|
||||||
|
addr += 2;
|
||||||
|
#endif
|
||||||
|
*(grub_uint16_t *) addr = (grub_int16_t) ((sym_value + 0x8000UL) >> 16);
|
||||||
|
break;
|
||||||
|
case R_MIPS_HIGHER:
|
||||||
|
#ifdef GRUB_CPU_WORDS_BIGENDIAN
|
||||||
|
addr += 2;
|
||||||
|
#endif
|
||||||
|
*(grub_uint16_t *) addr = (grub_int16_t) ((sym_value + 0x80008000UL) >> 32);
|
||||||
|
break;
|
||||||
|
case R_MIPS_HIGHEST:
|
||||||
|
#ifdef GRUB_CPU_WORDS_BIGENDIAN
|
||||||
|
addr += 2;
|
||||||
|
#endif
|
||||||
|
*(grub_uint16_t *) addr = (grub_uint16_t) ((sym_value + 0x800080008000UL) >> 48);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||||
|
N_("relocation 0x%x is not implemented yet"),
|
||||||
|
ELF_R_TYPE (r_info));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
85
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/efi/init.c
Normal file
85
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/efi/init.c
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/* init.c - initialize an arm-based EFI system */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2013 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/env.h>
|
||||||
|
#include <grub/kernel.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/cpu/time.h>
|
||||||
|
#include <grub/efi/efi.h>
|
||||||
|
#include <grub/loader.h>
|
||||||
|
#include <grub/time.h>
|
||||||
|
#include <grub/machine/loongson.h>
|
||||||
|
|
||||||
|
static grub_uint64_t tmr;
|
||||||
|
static grub_efi_event_t tmr_evt;
|
||||||
|
|
||||||
|
static grub_uint64_t
|
||||||
|
grub_efi_get_time_ms (void)
|
||||||
|
{
|
||||||
|
return tmr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_loongson_increment_timer (grub_efi_event_t event __attribute__ ((unused)),
|
||||||
|
void *context __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
tmr += 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_machine_init (void)
|
||||||
|
{
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
|
||||||
|
grub_efi_init ();
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
efi_call_5 (b->create_event, GRUB_EFI_EVT_TIMER | GRUB_EFI_EVT_NOTIFY_SIGNAL,
|
||||||
|
GRUB_EFI_TPL_CALLBACK, grub_loongson_increment_timer, NULL, &tmr_evt);
|
||||||
|
efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_PERIODIC, 100000);
|
||||||
|
|
||||||
|
grub_install_get_time_ms (grub_efi_get_time_ms);
|
||||||
|
|
||||||
|
if (grub_efi_is_loongson ())
|
||||||
|
grub_efi_loongson_init ();
|
||||||
|
else
|
||||||
|
/* FIXME: Get cpuclock from EFI. */
|
||||||
|
grub_timer_init (1000000000U);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_machine_fini (int flags)
|
||||||
|
{
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
|
||||||
|
if (!(flags & GRUB_LOADER_FLAG_NORETURN))
|
||||||
|
return;
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
|
||||||
|
efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_CANCEL, 0);
|
||||||
|
efi_call_1 (b->close_event, tmr_evt);
|
||||||
|
|
||||||
|
if (grub_efi_is_loongson ())
|
||||||
|
grub_efi_loongson_fini ();
|
||||||
|
grub_efi_fini ();
|
||||||
|
}
|
||||||
33
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/efi/loongson.c
Normal file
33
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/efi/loongson.c
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/efi/efi.h>
|
||||||
|
#include <grub/cpu/time.h>
|
||||||
|
#include <grub/loader.h>
|
||||||
|
#include <grub/machine/loongson.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_efi_loongson_init (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_efi_loongson_fini (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
47
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/efi/startup.S
Normal file
47
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/efi/startup.S
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2013 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
|
||||||
|
.file "startup.S"
|
||||||
|
.text
|
||||||
|
|
||||||
|
.set push
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
FUNCTION(_start)
|
||||||
|
/*
|
||||||
|
* EFI_SYSTEM_TABLE and EFI_HANDLE are passed in a1/a0.
|
||||||
|
*/
|
||||||
|
daddiu $sp, -16
|
||||||
|
sd $ra, ($sp)
|
||||||
|
|
||||||
|
dla $a2, grub_efi_image_handle
|
||||||
|
sd $a0, ($a2)
|
||||||
|
dla $a2, grub_efi_system_table
|
||||||
|
sd $a1, ($a2)
|
||||||
|
|
||||||
|
jal grub_main
|
||||||
|
|
||||||
|
1:
|
||||||
|
ld $ra, ($sp)
|
||||||
|
daddiu $sp, 16
|
||||||
|
jr $ra
|
||||||
|
|
||||||
|
.set pop
|
||||||
|
|
||||||
47
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/init.c
Normal file
47
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/mips64/init.c
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/kernel.h>
|
||||||
|
#include <grub/env.h>
|
||||||
|
#include <grub/time.h>
|
||||||
|
#include <grub/cpu/mips.h>
|
||||||
|
|
||||||
|
grub_uint32_t grub_arch_cpuclock;
|
||||||
|
|
||||||
|
/* FIXME: use interrupt to count high. */
|
||||||
|
grub_uint64_t
|
||||||
|
grub_get_rtc (void)
|
||||||
|
{
|
||||||
|
static grub_uint32_t high = 0;
|
||||||
|
static grub_uint32_t last = 0;
|
||||||
|
grub_uint32_t low;
|
||||||
|
|
||||||
|
asm volatile ("mfc0 %0, " GRUB_CPU_MIPS_COP0_TIMER_COUNT : "=r" (low));
|
||||||
|
if (low < last)
|
||||||
|
high++;
|
||||||
|
last = low;
|
||||||
|
|
||||||
|
return (((grub_uint64_t) high) << 32) | low;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_timer_init (grub_uint32_t cpuclock)
|
||||||
|
{
|
||||||
|
grub_arch_cpuclock = cpuclock;
|
||||||
|
grub_install_get_time_ms (grub_rtc_get_time_ms);
|
||||||
|
}
|
||||||
40
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/efi/halt.c
Normal file
40
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/efi/halt.c
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/* efi.c - generic EFI support */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2006,2007,2008,2009,2010 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/efi/api.h>
|
||||||
|
#include <grub/efi/efi.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/kernel.h>
|
||||||
|
#include <grub/acpi.h>
|
||||||
|
#include <grub/loader.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_halt (void)
|
||||||
|
{
|
||||||
|
grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
|
||||||
|
#if !defined(__ia64__) && !defined(__arm__) && !defined(__aarch64__) && !defined(__mips__) &&\
|
||||||
|
!defined(__riscv)
|
||||||
|
grub_acpi_halt ();
|
||||||
|
#endif
|
||||||
|
efi_call_4 (grub_efi_system_table->runtime_services->reset_system,
|
||||||
|
GRUB_EFI_RESET_SHUTDOWN, GRUB_EFI_SUCCESS, 0, NULL);
|
||||||
|
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
495
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/mips64/efi/loongson.c
Normal file
495
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/mips64/efi/loongson.c
Normal file
@@ -0,0 +1,495 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/cache.h>
|
||||||
|
#include <grub/efi/efi.h>
|
||||||
|
#include <grub/cpu/efi/memory.h>
|
||||||
|
#include <grub/cpu/memory.h>
|
||||||
|
#include <grub/machine/loongson.h>
|
||||||
|
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
|
||||||
|
#define loongson_params (&loongson_boot_params->boot_params.efi.smbios.lp)
|
||||||
|
#define loongson_boot_params_size ALIGN_UP (sizeof (*loongson_boot_params), 8)
|
||||||
|
#define loongson_reset_code_size (&grub_efi_loongson_reset_end - &grub_efi_loongson_reset_start)
|
||||||
|
|
||||||
|
extern grub_uint8_t grub_efi_loongson_reset_start;
|
||||||
|
extern grub_uint8_t grub_efi_loongson_reset_end;
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
grub_efi_loongson_boot_params boot_params;
|
||||||
|
grub_efi_loongson_memory_map memory_map;
|
||||||
|
grub_efi_loongson_cpu_info cpu_info;
|
||||||
|
grub_efi_loongson_system_info system_info;
|
||||||
|
grub_efi_loongson_irq_src_routing_table irq_src_routing_table;
|
||||||
|
grub_efi_loongson_interface_info interface_info;
|
||||||
|
grub_efi_loongson_special_attribute special_attribute;
|
||||||
|
grub_efi_loongson_board_devices board_devices;
|
||||||
|
} GRUB_PACKED
|
||||||
|
* loongson_boot_params;
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_loongson_init_reset_system (void)
|
||||||
|
{
|
||||||
|
grub_efi_loongson_boot_params *boot_params;
|
||||||
|
grub_uint8_t *reset_code_addr = (grub_uint8_t *) loongson_boot_params +
|
||||||
|
loongson_boot_params_size;
|
||||||
|
|
||||||
|
boot_params = &loongson_boot_params->boot_params;
|
||||||
|
grub_efi_loongson_reset_system_addr =
|
||||||
|
(grub_uint64_t) grub_efi_system_table->runtime_services->reset_system;
|
||||||
|
grub_memcpy (reset_code_addr, &grub_efi_loongson_reset_start, loongson_reset_code_size);
|
||||||
|
grub_arch_sync_caches (reset_code_addr, loongson_reset_code_size);
|
||||||
|
|
||||||
|
boot_params->reset_system.reset_cold = (grub_uint64_t) reset_code_addr +
|
||||||
|
((grub_uint64_t) &grub_efi_loongson_reset_cold -
|
||||||
|
(grub_uint64_t) &grub_efi_loongson_reset_start);
|
||||||
|
boot_params->reset_system.reset_warm = (grub_uint64_t) reset_code_addr +
|
||||||
|
((grub_uint64_t) &grub_efi_loongson_reset_warm -
|
||||||
|
(grub_uint64_t) &grub_efi_loongson_reset_start);
|
||||||
|
boot_params->reset_system.shutdown = (grub_uint64_t) reset_code_addr +
|
||||||
|
((grub_uint64_t) &grub_efi_loongson_reset_shutdown -
|
||||||
|
(grub_uint64_t) &grub_efi_loongson_reset_start);
|
||||||
|
boot_params->reset_system.do_suspend = (grub_uint64_t) reset_code_addr +
|
||||||
|
((grub_uint64_t) &grub_efi_loongson_reset_suspend -
|
||||||
|
(grub_uint64_t) &grub_efi_loongson_reset_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_loongson_init_smbios (grub_efi_loongson_smbios_table *smbios_table)
|
||||||
|
{
|
||||||
|
grub_efi_loongson_smbios_table *dst = &loongson_boot_params->boot_params.efi.smbios;
|
||||||
|
|
||||||
|
dst->vers = smbios_table->vers;
|
||||||
|
dst->vga_bios = smbios_table->vga_bios;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_loongson_init_cpu_info (grub_efi_loongson_smbios_table *smbios_table)
|
||||||
|
{
|
||||||
|
grub_efi_loongson_cpu_info *src = (void *) smbios_table->lp.cpu_offset;
|
||||||
|
grub_efi_loongson_cpu_info *dst = &loongson_boot_params->cpu_info;
|
||||||
|
|
||||||
|
if (!src)
|
||||||
|
return;
|
||||||
|
|
||||||
|
grub_memcpy (dst, src, sizeof (grub_efi_loongson_cpu_info));
|
||||||
|
loongson_params->cpu_offset = (grub_uint64_t) dst - (grub_uint64_t) loongson_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_loongson_init_system_info (grub_efi_loongson_smbios_table *smbios_table)
|
||||||
|
{
|
||||||
|
grub_efi_loongson_system_info *src = (void *) smbios_table->lp.system_offset;
|
||||||
|
grub_efi_loongson_system_info *dst = &loongson_boot_params->system_info;
|
||||||
|
|
||||||
|
if (!src)
|
||||||
|
return;
|
||||||
|
|
||||||
|
grub_memcpy (dst, src, sizeof (grub_efi_loongson_system_info));
|
||||||
|
loongson_params->system_offset = (grub_uint64_t) dst - (grub_uint64_t) loongson_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_loongson_init_irq_src_routing_table (grub_efi_loongson_smbios_table *smbios_table)
|
||||||
|
{
|
||||||
|
grub_efi_loongson_irq_src_routing_table *src = (void *) smbios_table->lp.irq_offset;
|
||||||
|
grub_efi_loongson_irq_src_routing_table *dst = &loongson_boot_params->irq_src_routing_table;
|
||||||
|
|
||||||
|
if (!src)
|
||||||
|
return;
|
||||||
|
|
||||||
|
grub_memcpy (dst, src, sizeof (grub_efi_loongson_irq_src_routing_table));
|
||||||
|
loongson_params->irq_offset = (grub_uint64_t) dst - (grub_uint64_t) loongson_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_loongson_init_interface_info (grub_efi_loongson_smbios_table *smbios_table)
|
||||||
|
{
|
||||||
|
grub_efi_loongson_interface_info *src = (void *) smbios_table->lp.interface_offset;
|
||||||
|
grub_efi_loongson_interface_info *dst = &loongson_boot_params->interface_info;
|
||||||
|
|
||||||
|
if (!src)
|
||||||
|
return;
|
||||||
|
|
||||||
|
grub_memcpy (dst, src, sizeof (grub_efi_loongson_interface_info));
|
||||||
|
loongson_params->interface_offset = (grub_uint64_t) dst - (grub_uint64_t) loongson_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_loongson_init_special_attribute (grub_efi_loongson_smbios_table *smbios_table)
|
||||||
|
{
|
||||||
|
grub_efi_loongson_special_attribute *src = (void *) smbios_table->lp.special_offset;
|
||||||
|
grub_efi_loongson_special_attribute *dst = &loongson_boot_params->special_attribute;
|
||||||
|
|
||||||
|
if (!src)
|
||||||
|
return;
|
||||||
|
|
||||||
|
grub_memcpy (dst, src, sizeof (grub_efi_loongson_special_attribute));
|
||||||
|
loongson_params->special_offset = (grub_uint64_t) dst - (grub_uint64_t) loongson_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_loongson_init_board_devices (grub_efi_loongson_smbios_table *smbios_table)
|
||||||
|
{
|
||||||
|
grub_efi_loongson_board_devices *src = (void *) smbios_table->lp.boarddev_table_offset;
|
||||||
|
grub_efi_loongson_board_devices *dst = &loongson_boot_params->board_devices;
|
||||||
|
|
||||||
|
if (!src)
|
||||||
|
return;
|
||||||
|
|
||||||
|
grub_memcpy (dst, src, sizeof (grub_efi_loongson_board_devices));
|
||||||
|
loongson_params->boarddev_table_offset = (grub_uint64_t) dst - (grub_uint64_t) loongson_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ADD_MEMORY_DESCRIPTOR(desc, size) \
|
||||||
|
((grub_efi_memory_descriptor_t *) ((char *) (desc) + (size)))
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_efi_loongson_init_memory_map (grub_efi_loongson_smbios_table *smbios_table,
|
||||||
|
grub_efi_memory_descriptor_t *mmap_buf,
|
||||||
|
grub_efi_uintn_t mmap_size,
|
||||||
|
grub_efi_uintn_t desc_size)
|
||||||
|
{
|
||||||
|
grub_efi_loongson_memory_map *src = (void *) smbios_table->lp.memory_offset;
|
||||||
|
grub_efi_loongson_memory_map *dst = &loongson_boot_params->memory_map;
|
||||||
|
grub_efi_memory_descriptor_t *mmap_end;
|
||||||
|
grub_efi_memory_descriptor_t *desc;
|
||||||
|
grub_efi_memory_descriptor_t *desc_next;
|
||||||
|
grub_efi_uint32_t mem_types_reserved[] =
|
||||||
|
{
|
||||||
|
1, // GRUB_EFI_RESERVED_MEMORY_TYPE
|
||||||
|
0, // GRUB_EFI_LOADER_CODE
|
||||||
|
0, // GRUB_EFI_LOADER_DATA
|
||||||
|
0, // GRUB_EFI_BOOT_SERVICES_CODE
|
||||||
|
0, // GRUB_EFI_BOOT_SERVICES_DATA
|
||||||
|
1, // GRUB_EFI_RUNTIME_SERVICES_CODE
|
||||||
|
1, // GRUB_EFI_RUNTIME_SERVICES_DATA
|
||||||
|
0, // GRUB_EFI_CONVENTIONAL_MEMORY
|
||||||
|
1, // GRUB_EFI_UNUSABLE_MEMORY
|
||||||
|
0, // GRUB_EFI_ACPI_RECLAIM_MEMORY
|
||||||
|
0, // GRUB_EFI_ACPI_MEMORY_NVS
|
||||||
|
1, // GRUB_EFI_MEMORY_MAPPED_IO
|
||||||
|
1, // GRUB_EFI_MEMORY_MAPPED_IO_PORT_SPACE
|
||||||
|
1, // GRUB_EFI_PAL_CODE
|
||||||
|
1, // GRUB_EFI_PERSISTENT_MEMORY
|
||||||
|
};
|
||||||
|
grub_uint32_t need_sort = 1;
|
||||||
|
|
||||||
|
if (!src)
|
||||||
|
return;
|
||||||
|
|
||||||
|
dst->vers = src->vers;
|
||||||
|
dst->nr_map = 0;
|
||||||
|
dst->mem_freq = src->mem_freq;
|
||||||
|
loongson_params->memory_offset = (grub_uint64_t) dst - (grub_uint64_t) loongson_params;
|
||||||
|
|
||||||
|
if (!mmap_buf || !mmap_size || !desc_size)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mmap_end = ADD_MEMORY_DESCRIPTOR (mmap_buf, mmap_size);
|
||||||
|
|
||||||
|
/* drop reserved */
|
||||||
|
for (desc = mmap_buf,
|
||||||
|
desc_next = desc;
|
||||||
|
desc < mmap_end;
|
||||||
|
desc = ADD_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||||
|
{
|
||||||
|
desc->type = mem_types_reserved[desc->type];
|
||||||
|
if (desc->type)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (desc != desc_next)
|
||||||
|
*desc_next = *desc;
|
||||||
|
desc_next = ADD_MEMORY_DESCRIPTOR (desc_next, desc_size);
|
||||||
|
}
|
||||||
|
mmap_end = desc_next;
|
||||||
|
|
||||||
|
/* sort: low->high */
|
||||||
|
while (need_sort)
|
||||||
|
{
|
||||||
|
need_sort = 0;
|
||||||
|
|
||||||
|
for (desc = mmap_buf,
|
||||||
|
desc_next = ADD_MEMORY_DESCRIPTOR (desc, desc_size);
|
||||||
|
(desc < mmap_end) && (desc_next < mmap_end);
|
||||||
|
desc = desc_next,
|
||||||
|
desc_next = ADD_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t tmp;
|
||||||
|
|
||||||
|
if (desc->physical_start <= desc_next->physical_start)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tmp = *desc;
|
||||||
|
*desc = *desc_next;
|
||||||
|
*desc_next = tmp;
|
||||||
|
need_sort = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* combine continuous memory map */
|
||||||
|
for (desc = mmap_buf,
|
||||||
|
desc_next = ADD_MEMORY_DESCRIPTOR (desc, desc_size);
|
||||||
|
desc_next < mmap_end;
|
||||||
|
desc_next = ADD_MEMORY_DESCRIPTOR (desc_next, desc_size))
|
||||||
|
{
|
||||||
|
grub_efi_physical_address_t prev_end = desc->physical_start + (desc->num_pages << 12);
|
||||||
|
|
||||||
|
if (prev_end == desc_next->physical_start)
|
||||||
|
{
|
||||||
|
desc->num_pages += desc_next->num_pages;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
desc = ADD_MEMORY_DESCRIPTOR (desc, desc_size);
|
||||||
|
grub_memcpy (desc, desc_next, desc_size);
|
||||||
|
}
|
||||||
|
mmap_end = ADD_MEMORY_DESCRIPTOR (desc, desc_size);
|
||||||
|
|
||||||
|
/* write to loongson memory map */
|
||||||
|
for (desc = mmap_buf;
|
||||||
|
desc < mmap_end;
|
||||||
|
desc = ADD_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||||
|
{
|
||||||
|
grub_efi_physical_address_t physical_start = grub_vtop ((void *) desc->physical_start);
|
||||||
|
grub_efi_physical_address_t physical_end = physical_start + (desc->num_pages << 12);
|
||||||
|
|
||||||
|
physical_start = ALIGN_UP (physical_start, 0x100000);
|
||||||
|
physical_end = ALIGN_DOWN (physical_end, 0x100000);
|
||||||
|
|
||||||
|
if (physical_start >= physical_end || (physical_end - physical_start) < 0x100000)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
dst->map[dst->nr_map].node_id = (desc->physical_start >> 44) & 0xf;
|
||||||
|
dst->map[dst->nr_map].mem_type = (physical_end <= 0x10000000) ?
|
||||||
|
GRUB_EFI_LOONGSON_SYSTEM_RAM_LOW :
|
||||||
|
GRUB_EFI_LOONGSON_SYSTEM_RAM_HIGH;
|
||||||
|
dst->map[dst->nr_map].mem_start = physical_start;
|
||||||
|
dst->map[dst->nr_map].mem_size = (physical_end - physical_start) >> 20;
|
||||||
|
|
||||||
|
grub_dprintf ("loongson", "memory map %03u: 0x%016lx 0x%016lx @ %u\n",
|
||||||
|
dst->nr_map, physical_start, physical_end - physical_start,
|
||||||
|
dst->map[dst->nr_map].node_id);
|
||||||
|
|
||||||
|
dst->nr_map ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12)
|
||||||
|
#define SUB_MEMORY_DESCRIPTOR(desc, size) \
|
||||||
|
((grub_efi_memory_descriptor_t *) ((char *) (desc) - (size)))
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_efi_loongson_alloc_boot_params (void)
|
||||||
|
{
|
||||||
|
grub_efi_memory_descriptor_t *mmap_buf;
|
||||||
|
grub_efi_memory_descriptor_t *mmap_end;
|
||||||
|
grub_efi_memory_descriptor_t *desc;
|
||||||
|
grub_efi_uintn_t mmap_size;
|
||||||
|
grub_efi_uintn_t desc_size;
|
||||||
|
grub_efi_physical_address_t address;
|
||||||
|
grub_efi_allocate_type_t type;
|
||||||
|
grub_efi_uintn_t pages;
|
||||||
|
grub_efi_status_t status;
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
int mm_status;
|
||||||
|
|
||||||
|
type = GRUB_EFI_ALLOCATE_ADDRESS;
|
||||||
|
pages = BYTES_TO_PAGES (loongson_boot_params_size + loongson_reset_code_size);
|
||||||
|
|
||||||
|
mmap_size = (1 << 12);
|
||||||
|
mmap_buf = grub_malloc (mmap_size);
|
||||||
|
if (!mmap_buf)
|
||||||
|
grub_fatal ("out of memory!");
|
||||||
|
|
||||||
|
mm_status = grub_efi_get_memory_map (&mmap_size, mmap_buf, 0, &desc_size, 0);
|
||||||
|
if (mm_status == 0)
|
||||||
|
{
|
||||||
|
grub_free (mmap_buf);
|
||||||
|
mmap_size += desc_size * 32;
|
||||||
|
|
||||||
|
mmap_buf = grub_malloc (mmap_size);
|
||||||
|
if (!mmap_buf)
|
||||||
|
grub_fatal ("out of memory!");
|
||||||
|
|
||||||
|
mm_status = grub_efi_get_memory_map (&mmap_size, mmap_buf, 0, &desc_size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mm_status < 0)
|
||||||
|
grub_fatal ("cannot get memory map!");
|
||||||
|
|
||||||
|
mmap_end = ADD_MEMORY_DESCRIPTOR (mmap_buf, mmap_size);
|
||||||
|
|
||||||
|
for (desc = SUB_MEMORY_DESCRIPTOR (mmap_end, desc_size);
|
||||||
|
desc >= mmap_buf;
|
||||||
|
desc = SUB_MEMORY_DESCRIPTOR (desc, desc_size))
|
||||||
|
{
|
||||||
|
if (desc->type != GRUB_EFI_CONVENTIONAL_MEMORY)
|
||||||
|
continue;
|
||||||
|
if (desc->physical_start >= GRUB_EFI_MAX_USABLE_ADDRESS)
|
||||||
|
continue;
|
||||||
|
if (desc->num_pages < pages)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
address = desc->physical_start;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_free (mmap_buf);
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_RUNTIME_SERVICES_DATA, pages, &address);
|
||||||
|
if (status != GRUB_EFI_SUCCESS)
|
||||||
|
grub_fatal ("cannot allocate Loongson boot parameters!");
|
||||||
|
|
||||||
|
loongson_boot_params = (void *) ((grub_addr_t) address);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_efi_loongson_free_boot_params (void)
|
||||||
|
{
|
||||||
|
grub_efi_free_pages ((grub_addr_t) loongson_boot_params,
|
||||||
|
BYTES_TO_PAGES (loongson_boot_params_size + loongson_reset_code_size));
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
grub_efi_loongson_get_smbios_table (void)
|
||||||
|
{
|
||||||
|
static grub_efi_loongson_smbios_table *smbios_table;
|
||||||
|
grub_efi_loongson_boot_params *old_boot_params;
|
||||||
|
struct bootparamsinterface* boot_params;
|
||||||
|
void * tmp_boot_params = NULL;
|
||||||
|
char * p = NULL;
|
||||||
|
if(smbios_table)
|
||||||
|
return smbios_table;
|
||||||
|
|
||||||
|
tmp_boot_params = grub_efi_loongson_get_boot_params();
|
||||||
|
if(tmp_boot_params == NULL)
|
||||||
|
{
|
||||||
|
grub_dprintf("loongson", "tmp_boot_params is NULL\n");
|
||||||
|
return tmp_boot_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
boot_params = (struct bootparamsinterface *)tmp_boot_params;
|
||||||
|
p = (char *)&(boot_params->signature);
|
||||||
|
if(grub_strncmp(p, "BPI", 3) == 0)
|
||||||
|
{
|
||||||
|
grub_dprintf("loongson", "find new bpi\n");
|
||||||
|
return boot_params ? boot_params : 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
old_boot_params = (grub_efi_loongson_boot_params *)tmp_boot_params;
|
||||||
|
return old_boot_params ? &old_boot_params->efi.smbios : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_efi_is_loongson (void)
|
||||||
|
{
|
||||||
|
return grub_efi_loongson_get_smbios_table () ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
grub_efi_loongson_get_boot_params (void)
|
||||||
|
{
|
||||||
|
static void * boot_params = NULL;
|
||||||
|
grub_efi_configuration_table_t *tables;
|
||||||
|
grub_efi_guid_t smbios_guid = GRUB_EFI_LOONGSON_SMBIOS_TABLE_GUID;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if (boot_params)
|
||||||
|
return boot_params;
|
||||||
|
|
||||||
|
/* Look for Loongson SMBIOS in UEFI config tables. */
|
||||||
|
tables = grub_efi_system_table->configuration_table;
|
||||||
|
|
||||||
|
for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
|
||||||
|
if (grub_memcmp (&tables[i].vendor_guid, &smbios_guid, sizeof (smbios_guid)) == 0)
|
||||||
|
{
|
||||||
|
boot_params= tables[i].vendor_table;
|
||||||
|
grub_dprintf ("loongson", "found registered SMBIOS @ %p\n", boot_params);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return boot_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_uint8_t
|
||||||
|
grub_efi_loongson_calculatesum8 (const grub_uint8_t *buffer, grub_efi_uintn_t length)
|
||||||
|
{
|
||||||
|
grub_uint8_t sum;
|
||||||
|
grub_efi_uintn_t count;
|
||||||
|
|
||||||
|
for (sum = 0, count = 0; count < length; count++)
|
||||||
|
{
|
||||||
|
sum = (grub_uint8_t) (sum + *(buffer + count));
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_uint8_t
|
||||||
|
grub_efi_loongson_grub_calculatechecksum8 (const grub_uint8_t *buffer, grub_efi_uintn_t length)
|
||||||
|
{
|
||||||
|
grub_uint8_t checksum;
|
||||||
|
|
||||||
|
checksum = grub_efi_loongson_calculatesum8(buffer, length);
|
||||||
|
|
||||||
|
return (grub_uint8_t) (0x100 - checksum);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
grub_uint32_t
|
||||||
|
grub_efi_loongson_memmap_sort(struct memmap array[], grub_uint32_t length, mem_map * bpmem, grub_uint32_t index, grub_uint32_t memtype)
|
||||||
|
{
|
||||||
|
grub_uint64_t tempmemsize = 0;
|
||||||
|
grub_uint32_t j = 0;
|
||||||
|
grub_uint32_t t = 0;
|
||||||
|
|
||||||
|
for(j = 0; j < length;)
|
||||||
|
{
|
||||||
|
tempmemsize = array[j].memsize;
|
||||||
|
for(t = j + 1; t < length; t++)
|
||||||
|
{
|
||||||
|
if(array[j].memstart + tempmemsize == array[t].memstart)
|
||||||
|
{
|
||||||
|
tempmemsize += array[t].memsize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bpmem->map[index].memtype = memtype;
|
||||||
|
bpmem->map[index].memstart = array[j].memstart;
|
||||||
|
bpmem->map[index].memsize = tempmemsize;
|
||||||
|
grub_dprintf("loongson", "map[%d]:type %x, start 0x%llx, end 0x%llx\n",
|
||||||
|
index,
|
||||||
|
bpmem->map[index].memtype,
|
||||||
|
(unsigned long long)bpmem->map[index].memstart,
|
||||||
|
(unsigned long long)bpmem->map[index].memstart+ bpmem->map[index].memsize
|
||||||
|
);
|
||||||
|
j = t;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
|
||||||
|
.file "loongson.S"
|
||||||
|
.text
|
||||||
|
|
||||||
|
.set push
|
||||||
|
.set noreorder
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
VARIABLE (grub_efi_loongson_reset_start)
|
||||||
|
|
||||||
|
VARIABLE (grub_efi_loongson_reset_system_addr)
|
||||||
|
.dword 0
|
||||||
|
|
||||||
|
reset_system:
|
||||||
|
bal 1f
|
||||||
|
move $a1, $zero
|
||||||
|
1:
|
||||||
|
ld $t9, -16($ra)
|
||||||
|
move $a2, $zero
|
||||||
|
jalr $t9
|
||||||
|
move $a3, $zero
|
||||||
|
|
||||||
|
FUNCTION(grub_efi_loongson_reset_cold)
|
||||||
|
b reset_system
|
||||||
|
li $a0, 0
|
||||||
|
|
||||||
|
FUNCTION(grub_efi_loongson_reset_warm)
|
||||||
|
b reset_system
|
||||||
|
li $a0, 1
|
||||||
|
|
||||||
|
FUNCTION(grub_efi_loongson_reset_shutdown)
|
||||||
|
b reset_system
|
||||||
|
li $a0, 2
|
||||||
|
|
||||||
|
FUNCTION(grub_efi_loongson_reset_suspend)
|
||||||
|
b reset_system
|
||||||
|
li $a0, 3
|
||||||
|
|
||||||
|
VARIABLE (grub_efi_loongson_reset_end)
|
||||||
|
|
||||||
|
.set pop
|
||||||
|
|
||||||
169
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/mips64/relocator.c
Normal file
169
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/mips64/relocator.c
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/cache.h>
|
||||||
|
|
||||||
|
#include <grub/mips64/relocator.h>
|
||||||
|
#include <grub/relocator_private.h>
|
||||||
|
|
||||||
|
extern grub_uint8_t grub_relocator_forward_start;
|
||||||
|
extern grub_uint8_t grub_relocator_forward_end;
|
||||||
|
extern grub_uint8_t grub_relocator_backward_start;
|
||||||
|
extern grub_uint8_t grub_relocator_backward_end;
|
||||||
|
|
||||||
|
#define REGW_SIZEOF (6 * sizeof (grub_uint32_t))
|
||||||
|
#define JUMP_SIZEOF (2 * sizeof (grub_uint32_t))
|
||||||
|
|
||||||
|
#define RELOCATOR_SRC_SIZEOF(x) (&grub_relocator_##x##_end \
|
||||||
|
- &grub_relocator_##x##_start)
|
||||||
|
#define RELOCATOR_SIZEOF(x) (RELOCATOR_SRC_SIZEOF(x) \
|
||||||
|
+ REGW_SIZEOF * 3)
|
||||||
|
grub_size_t grub_relocator_align = sizeof (grub_uint64_t);
|
||||||
|
grub_size_t grub_relocator_forward_size;
|
||||||
|
grub_size_t grub_relocator_backward_size;
|
||||||
|
grub_size_t grub_relocator_jumper_size = JUMP_SIZEOF + REGW_SIZEOF;
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_cpu_relocator_init (void)
|
||||||
|
{
|
||||||
|
grub_relocator_forward_size = RELOCATOR_SIZEOF(forward);
|
||||||
|
grub_relocator_backward_size = RELOCATOR_SIZEOF(backward);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
write_reg (int regn, grub_uint64_t val, void **target)
|
||||||
|
{
|
||||||
|
grub_uint32_t lui;
|
||||||
|
grub_uint32_t ori;
|
||||||
|
grub_uint32_t dsll;
|
||||||
|
|
||||||
|
/* lui $r, 0 */
|
||||||
|
lui = (0x3c00 | regn) << 16;
|
||||||
|
/* ori $r, $r, 0 */
|
||||||
|
ori = (0x3400 | (regn << 5) | regn) << 16;
|
||||||
|
/* dsll $r, $r, 16 */
|
||||||
|
dsll = (regn << 16) | (regn << 11) | (16 << 6) | 56;
|
||||||
|
|
||||||
|
/* lui $r, val[63:48]. */
|
||||||
|
*(grub_uint32_t *) *target = lui | (grub_uint16_t) (val >> 48);
|
||||||
|
*target = ((grub_uint32_t *) *target) + 1;
|
||||||
|
/* ori $r, val[47:32]. */
|
||||||
|
*(grub_uint32_t *) *target = ori | (grub_uint16_t) (val >> 32);
|
||||||
|
*target = ((grub_uint32_t *) *target) + 1;
|
||||||
|
/* dsll $r, $r, 16 */
|
||||||
|
*(grub_uint32_t *) *target = dsll;
|
||||||
|
*target = ((grub_uint32_t *) *target) + 1;
|
||||||
|
/* ori $r, val[31:16]. */
|
||||||
|
*(grub_uint32_t *) *target = ori | (grub_uint16_t) (val >> 16);
|
||||||
|
*target = ((grub_uint32_t *) *target) + 1;
|
||||||
|
/* dsll $r, $r, 16 */
|
||||||
|
*(grub_uint32_t *) *target = dsll;
|
||||||
|
*target = ((grub_uint32_t *) *target) + 1;
|
||||||
|
/* ori $r, val[15:0]. */
|
||||||
|
*(grub_uint32_t *) *target = ori | (grub_uint16_t) val;
|
||||||
|
*target = ((grub_uint32_t *) *target) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
write_jump (int regn, void **target)
|
||||||
|
{
|
||||||
|
/* j $r. */
|
||||||
|
*(grub_uint32_t *) *target = (regn << 21) | 0x8;
|
||||||
|
*target = ((grub_uint32_t *) *target) + 1;
|
||||||
|
/* nop. */
|
||||||
|
*(grub_uint32_t *) *target = 0;
|
||||||
|
*target = ((grub_uint32_t *) *target) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_cpu_relocator_jumper (void *rels, grub_addr_t addr)
|
||||||
|
{
|
||||||
|
write_reg (1, addr, &rels);
|
||||||
|
write_jump (1, &rels);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_cpu_relocator_backward (void *ptr0, void *src, void *dest,
|
||||||
|
grub_size_t size)
|
||||||
|
{
|
||||||
|
void *ptr = ptr0;
|
||||||
|
write_reg (8, (grub_uint64_t) src, &ptr);
|
||||||
|
write_reg (9, (grub_uint64_t) dest, &ptr);
|
||||||
|
write_reg (10, (grub_uint64_t) size, &ptr);
|
||||||
|
grub_memcpy (ptr, &grub_relocator_backward_start,
|
||||||
|
RELOCATOR_SRC_SIZEOF (backward));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_cpu_relocator_forward (void *ptr0, void *src, void *dest,
|
||||||
|
grub_size_t size)
|
||||||
|
{
|
||||||
|
void *ptr = ptr0;
|
||||||
|
write_reg (8, (grub_uint64_t) src, &ptr);
|
||||||
|
write_reg (9, (grub_uint64_t) dest, &ptr);
|
||||||
|
write_reg (10, (grub_uint64_t) size, &ptr);
|
||||||
|
grub_memcpy (ptr, &grub_relocator_forward_start,
|
||||||
|
RELOCATOR_SRC_SIZEOF (forward));
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_relocator64_boot (struct grub_relocator *rel,
|
||||||
|
struct grub_relocator64_state state)
|
||||||
|
{
|
||||||
|
grub_relocator_chunk_t ch;
|
||||||
|
void *ptr;
|
||||||
|
grub_err_t err;
|
||||||
|
void *relst;
|
||||||
|
grub_size_t relsize;
|
||||||
|
grub_size_t stateset_size = 31 * REGW_SIZEOF + JUMP_SIZEOF;
|
||||||
|
unsigned i;
|
||||||
|
grub_addr_t vtarget;
|
||||||
|
|
||||||
|
err = grub_relocator_alloc_chunk_align (rel, &ch, 0,
|
||||||
|
(0xffffffff - stateset_size)
|
||||||
|
+ 1, stateset_size,
|
||||||
|
grub_relocator_align,
|
||||||
|
GRUB_RELOCATOR_PREFERENCE_NONE, 0);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
ptr = get_virtual_current_address (ch);
|
||||||
|
for (i = 1; i < 32; i++)
|
||||||
|
write_reg (i, state.gpr[i], &ptr);
|
||||||
|
write_jump (state.jumpreg, &ptr);
|
||||||
|
|
||||||
|
vtarget = (grub_addr_t) grub_map_memory (get_physical_target_address (ch),
|
||||||
|
stateset_size);
|
||||||
|
|
||||||
|
err = grub_relocator_prepare_relocs (rel, vtarget, &relst, &relsize);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
grub_arch_sync_caches ((void *) relst, relsize);
|
||||||
|
|
||||||
|
((void (*) (void)) relst) ();
|
||||||
|
|
||||||
|
/* Not reached. */
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
56
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/mips64/relocator_asm.S
Normal file
56
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/mips64/relocator_asm.S
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
|
||||||
|
.p2align 4 /* force 16-byte alignment */
|
||||||
|
|
||||||
|
.set push
|
||||||
|
.set noreorder
|
||||||
|
.set nomacro
|
||||||
|
|
||||||
|
VARIABLE (grub_relocator_forward_start)
|
||||||
|
|
||||||
|
copycont1:
|
||||||
|
ld $11,0($8)
|
||||||
|
sd $11,0($9)
|
||||||
|
daddiu $8, $8, 8
|
||||||
|
daddiu $10, $10, -8
|
||||||
|
bne $10, $0, copycont1
|
||||||
|
daddiu $9, $9, 8
|
||||||
|
|
||||||
|
VARIABLE (grub_relocator_forward_end)
|
||||||
|
|
||||||
|
VARIABLE (grub_relocator_backward_start)
|
||||||
|
|
||||||
|
daddu $9, $9, $10
|
||||||
|
daddu $8, $8, $10
|
||||||
|
/* Backward movsl is implicitly off-by-one. compensate that. */
|
||||||
|
daddiu $9, $9, -8
|
||||||
|
daddiu $8, $8, -8
|
||||||
|
copycont2:
|
||||||
|
ld $11,0($8)
|
||||||
|
sd $11,0($9)
|
||||||
|
daddiu $8, $8, -8
|
||||||
|
daddiu $10, $10, -8
|
||||||
|
bne $10, $0, copycont2
|
||||||
|
daddiu $9, $9, -8
|
||||||
|
|
||||||
|
VARIABLE (grub_relocator_backward_end)
|
||||||
|
|
||||||
|
.set pop
|
||||||
69
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/mips64/setjmp.S
Normal file
69
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/mips64/setjmp.S
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2003,2007,2009 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/mips64/asm.h>
|
||||||
|
|
||||||
|
.file "setjmp.S"
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE "GPLv3+"
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
/*
|
||||||
|
* int grub_setjmp (grub_jmp_buf env)
|
||||||
|
*/
|
||||||
|
FUNCTION(grub_setjmp)
|
||||||
|
GRUB_ASM_REG_S $s0, 0($a0)
|
||||||
|
GRUB_ASM_REG_S $s1, 8($a0)
|
||||||
|
GRUB_ASM_REG_S $s2, 16($a0)
|
||||||
|
GRUB_ASM_REG_S $s3, 24($a0)
|
||||||
|
GRUB_ASM_REG_S $s4, 32($a0)
|
||||||
|
GRUB_ASM_REG_S $s5, 40($a0)
|
||||||
|
GRUB_ASM_REG_S $s6, 48($a0)
|
||||||
|
GRUB_ASM_REG_S $s7, 56($a0)
|
||||||
|
GRUB_ASM_REG_S $s8, 64($a0)
|
||||||
|
GRUB_ASM_REG_S $gp, 72($a0)
|
||||||
|
GRUB_ASM_REG_S $sp, 80($a0)
|
||||||
|
GRUB_ASM_REG_S $ra, 88($a0)
|
||||||
|
move $v0, $zero
|
||||||
|
move $v1, $zero
|
||||||
|
jr $ra
|
||||||
|
nop
|
||||||
|
/*
|
||||||
|
* int grub_longjmp (grub_jmp_buf env, int val)
|
||||||
|
*/
|
||||||
|
FUNCTION(grub_longjmp)
|
||||||
|
GRUB_ASM_REG_L $s0, 0($a0)
|
||||||
|
GRUB_ASM_REG_L $s1, 8($a0)
|
||||||
|
GRUB_ASM_REG_L $s2, 16($a0)
|
||||||
|
GRUB_ASM_REG_L $s3, 24($a0)
|
||||||
|
GRUB_ASM_REG_L $s4, 32($a0)
|
||||||
|
GRUB_ASM_REG_L $s5, 40($a0)
|
||||||
|
GRUB_ASM_REG_L $s6, 48($a0)
|
||||||
|
GRUB_ASM_REG_L $s7, 56($a0)
|
||||||
|
GRUB_ASM_REG_L $s8, 64($a0)
|
||||||
|
GRUB_ASM_REG_L $gp, 72($a0)
|
||||||
|
GRUB_ASM_REG_L $sp, 80($a0)
|
||||||
|
GRUB_ASM_REG_L $ra, 88($a0)
|
||||||
|
addiu $v0, $zero, 1
|
||||||
|
movn $v0, $a1, $a1
|
||||||
|
move $v1, $zero
|
||||||
|
jr $ra
|
||||||
|
nop
|
||||||
1660
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/relocator.c
Normal file
1660
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/relocator.c
Normal file
File diff suppressed because it is too large
Load Diff
26
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/setjmp.S
Normal file
26
GRUB2/MOD_SRC/grub-2.04/grub-core/lib/setjmp.S
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#if defined(__i386__)
|
||||||
|
#include "./i386/setjmp.S"
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
#include "./x86_64/setjmp.S"
|
||||||
|
#elif defined(__sparc__)
|
||||||
|
#include "./sparc64/setjmp.S"
|
||||||
|
#elif defined(__mips__)
|
||||||
|
#if _MIPS_SIM == _ABI64
|
||||||
|
#include "./mips64/setjmp.S"
|
||||||
|
#else
|
||||||
|
#include "./mips/setjmp.S"
|
||||||
|
#endif
|
||||||
|
#elif defined(__powerpc__) || defined(__PPC__)
|
||||||
|
#include "./powerpc/setjmp.S"
|
||||||
|
#elif defined(__ia64__)
|
||||||
|
#include "./ia64/setjmp.S"
|
||||||
|
#include "./ia64/longjmp.S"
|
||||||
|
#elif defined(__arm__)
|
||||||
|
#include "./arm/setjmp.S"
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
#include "./arm64/setjmp.S"
|
||||||
|
#elif defined(__riscv)
|
||||||
|
#include "./riscv/setjmp.S"
|
||||||
|
#else
|
||||||
|
#error "Unknown target cpu type"
|
||||||
|
#endif
|
||||||
859
GRUB2/MOD_SRC/grub-2.04/grub-core/loader/arm64/linux.c
Normal file
859
GRUB2/MOD_SRC/grub-2.04/grub-core/loader/arm64/linux.c
Normal file
@@ -0,0 +1,859 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2013 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/charset.h>
|
||||||
|
#include <grub/command.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/file.h>
|
||||||
|
#include <grub/fdt.h>
|
||||||
|
#include <grub/linux.h>
|
||||||
|
#include <grub/loader.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/cpu/linux.h>
|
||||||
|
#include <grub/efi/efi.h>
|
||||||
|
#include <grub/efi/fdtload.h>
|
||||||
|
#include <grub/efi/memory.h>
|
||||||
|
#include <grub/efi/pe32.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/lib/cmdline.h>
|
||||||
|
#include <grub/verify.h>
|
||||||
|
#include <grub/term.h>
|
||||||
|
#include <grub/env.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
static grub_dl_t my_mod;
|
||||||
|
static int loaded;
|
||||||
|
|
||||||
|
static void *kernel_addr;
|
||||||
|
static grub_uint64_t kernel_size;
|
||||||
|
|
||||||
|
static char *linux_args;
|
||||||
|
static grub_uint32_t cmdline_size;
|
||||||
|
|
||||||
|
static grub_addr_t initrd_start;
|
||||||
|
static grub_addr_t initrd_end;
|
||||||
|
|
||||||
|
#define LINUX_MAX_ARGC 1024
|
||||||
|
static int ventoy_debug = 0;
|
||||||
|
static int ventoy_initrd_called = 0;
|
||||||
|
static int ventoy_linux_argc = 0;
|
||||||
|
static char **ventoy_linux_args = NULL;
|
||||||
|
static int ventoy_extra_initrd_num = 0;
|
||||||
|
static char *ventoy_extra_initrd_list[256];
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc, char *argv[]);
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_arch_efi_linux_check_image (struct linux_arch_kernel_header * lh)
|
||||||
|
{
|
||||||
|
if (lh->magic != GRUB_LINUX_ARMXX_MAGIC_SIGNATURE)
|
||||||
|
return grub_error(GRUB_ERR_BAD_OS, "invalid magic number");
|
||||||
|
|
||||||
|
if ((lh->code0 & 0xffff) != GRUB_PE32_MAGIC)
|
||||||
|
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||||
|
N_("plain image kernel not supported - rebuild with CONFIG_(U)EFI_STUB enabled"));
|
||||||
|
|
||||||
|
grub_dprintf ("linux", "UEFI stub kernel:\n");
|
||||||
|
grub_dprintf ("linux", "PE/COFF header @ %08x\n", lh->hdr_offset);
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
finalize_params_linux (void)
|
||||||
|
{
|
||||||
|
int node, retval;
|
||||||
|
|
||||||
|
void *fdt;
|
||||||
|
|
||||||
|
fdt = grub_fdt_load (GRUB_EFI_LINUX_FDT_EXTRA_SPACE);
|
||||||
|
|
||||||
|
if (!fdt)
|
||||||
|
goto failure;
|
||||||
|
|
||||||
|
node = grub_fdt_find_subnode (fdt, 0, "chosen");
|
||||||
|
if (node < 0)
|
||||||
|
node = grub_fdt_add_subnode (fdt, 0, "chosen");
|
||||||
|
|
||||||
|
if (node < 1)
|
||||||
|
goto failure;
|
||||||
|
|
||||||
|
/* Set initrd info */
|
||||||
|
if (initrd_start && initrd_end > initrd_start)
|
||||||
|
{
|
||||||
|
grub_dprintf ("linux", "Initrd @ %p-%p\n",
|
||||||
|
(void *) initrd_start, (void *) initrd_end);
|
||||||
|
|
||||||
|
retval = grub_fdt_set_prop64 (fdt, node, "linux,initrd-start",
|
||||||
|
initrd_start);
|
||||||
|
if (retval)
|
||||||
|
goto failure;
|
||||||
|
retval = grub_fdt_set_prop64 (fdt, node, "linux,initrd-end",
|
||||||
|
initrd_end);
|
||||||
|
if (retval)
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_fdt_install() != GRUB_ERR_NONE)
|
||||||
|
goto failure;
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
|
||||||
|
failure:
|
||||||
|
grub_fdt_unload();
|
||||||
|
return grub_error(GRUB_ERR_BAD_OS, "failed to install/update FDT");
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_arch_efi_linux_boot_image (grub_addr_t addr, grub_size_t size, char *args)
|
||||||
|
{
|
||||||
|
grub_efi_memory_mapped_device_path_t *mempath;
|
||||||
|
grub_efi_handle_t image_handle;
|
||||||
|
grub_efi_boot_services_t *b;
|
||||||
|
grub_efi_status_t status;
|
||||||
|
grub_efi_loaded_image_t *loaded_image;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
mempath = grub_malloc (2 * sizeof (grub_efi_memory_mapped_device_path_t));
|
||||||
|
if (!mempath)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
mempath[0].header.type = GRUB_EFI_HARDWARE_DEVICE_PATH_TYPE;
|
||||||
|
mempath[0].header.subtype = GRUB_EFI_MEMORY_MAPPED_DEVICE_PATH_SUBTYPE;
|
||||||
|
mempath[0].header.length = grub_cpu_to_le16_compile_time (sizeof (*mempath));
|
||||||
|
mempath[0].memory_type = GRUB_EFI_LOADER_DATA;
|
||||||
|
mempath[0].start_address = addr;
|
||||||
|
mempath[0].end_address = addr + size;
|
||||||
|
|
||||||
|
mempath[1].header.type = GRUB_EFI_END_DEVICE_PATH_TYPE;
|
||||||
|
mempath[1].header.subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
||||||
|
mempath[1].header.length = sizeof (grub_efi_device_path_t);
|
||||||
|
|
||||||
|
b = grub_efi_system_table->boot_services;
|
||||||
|
status = b->load_image (0, grub_efi_image_handle,
|
||||||
|
(grub_efi_device_path_t *) mempath,
|
||||||
|
(void *) addr, size, &image_handle);
|
||||||
|
if (status != GRUB_EFI_SUCCESS)
|
||||||
|
return grub_error (GRUB_ERR_BAD_OS, "cannot load image");
|
||||||
|
|
||||||
|
grub_dprintf ("linux", "linux command line: '%s'\n", args);
|
||||||
|
|
||||||
|
/* Convert command line to UCS-2 */
|
||||||
|
loaded_image = grub_efi_get_loaded_image (image_handle);
|
||||||
|
loaded_image->load_options_size = len =
|
||||||
|
(grub_strlen (args) + 1) * sizeof (grub_efi_char16_t);
|
||||||
|
loaded_image->load_options =
|
||||||
|
grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size));
|
||||||
|
if (!loaded_image->load_options)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
loaded_image->load_options_size =
|
||||||
|
2 * grub_utf8_to_utf16 (loaded_image->load_options, len,
|
||||||
|
(grub_uint8_t *) args, len, NULL);
|
||||||
|
|
||||||
|
grub_dprintf ("linux", "starting image %p\n", image_handle);
|
||||||
|
status = b->start_image (image_handle, 0, NULL);
|
||||||
|
|
||||||
|
/* When successful, not reached */
|
||||||
|
b->unload_image (image_handle);
|
||||||
|
grub_efi_free_pages ((grub_addr_t) loaded_image->load_options,
|
||||||
|
GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size));
|
||||||
|
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void ventoy_debug_pause(void)
|
||||||
|
{
|
||||||
|
char key;
|
||||||
|
|
||||||
|
if (0 == ventoy_debug)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_printf("press Enter to continue ......\n");
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
key = grub_getkey();
|
||||||
|
if (key == '\n' || key == '\r')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ventoy_preboot(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const char *file;
|
||||||
|
char buf[128];
|
||||||
|
|
||||||
|
if (ventoy_debug)
|
||||||
|
{
|
||||||
|
grub_printf("ventoy_preboot %d %d\n", ventoy_linux_argc, ventoy_initrd_called);
|
||||||
|
ventoy_debug_pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ventoy_linux_argc == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ventoy_initrd_called)
|
||||||
|
{
|
||||||
|
ventoy_initrd_called = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_snprintf(buf, sizeof(buf), "mem:%s:size:%s", grub_env_get("ventoy_cpio_addr"), grub_env_get("ventoy_cpio_size"));
|
||||||
|
|
||||||
|
ventoy_extra_initrd_list[ventoy_extra_initrd_num++] = grub_strdup(buf);
|
||||||
|
|
||||||
|
file = grub_env_get("vtoy_img_part_file");
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
ventoy_extra_initrd_list[ventoy_extra_initrd_num++] = grub_strdup(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ventoy_debug)
|
||||||
|
{
|
||||||
|
grub_printf("========== initrd list ==========\n");
|
||||||
|
for (i = 0; i < ventoy_extra_initrd_num; i++)
|
||||||
|
{
|
||||||
|
grub_printf("%s\n", ventoy_extra_initrd_list[i]);
|
||||||
|
}
|
||||||
|
grub_printf("=================================\n");
|
||||||
|
|
||||||
|
ventoy_debug_pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_cmd_initrd(NULL, ventoy_extra_initrd_num, ventoy_extra_initrd_list);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ventoy_boot_opt_filter(char *opt)
|
||||||
|
{
|
||||||
|
if (grub_strcmp(opt, "noinitrd") == 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_strcmp(opt, "vga=current") == 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_strncmp(opt, "rdinit=", 7) == 0)
|
||||||
|
{
|
||||||
|
if (grub_strcmp(opt, "rdinit=/vtoy/vtoy") != 0)
|
||||||
|
{
|
||||||
|
opt[0] = 'v';
|
||||||
|
opt[1] = 't';
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_strncmp(opt, "init=", 5) == 0)
|
||||||
|
{
|
||||||
|
opt[0] = 'v';
|
||||||
|
opt[1] = 't';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_strncmp(opt, "dm=", 3) == 0)
|
||||||
|
{
|
||||||
|
opt[0] = 'D';
|
||||||
|
opt[1] = 'M';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ventoy_debug)
|
||||||
|
{
|
||||||
|
if (grub_strcmp(opt, "quiet") == 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_strncmp(opt, "loglevel=", 9) == 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_strcmp(opt, "splash") == 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ventoy_bootopt_hook(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int TmpIdx;
|
||||||
|
int count = 0;
|
||||||
|
const char *env;
|
||||||
|
char c;
|
||||||
|
char *newenv;
|
||||||
|
char *last, *pos;
|
||||||
|
|
||||||
|
//grub_printf("ventoy_bootopt_hook: %d %d\n", argc, ventoy_linux_argc);
|
||||||
|
|
||||||
|
if (ventoy_linux_argc == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* To avoid --- parameter, we split two parts */
|
||||||
|
for (TmpIdx = 0; TmpIdx < argc; TmpIdx++)
|
||||||
|
{
|
||||||
|
if (ventoy_boot_opt_filter(argv[TmpIdx]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_strncmp(argv[TmpIdx], "--", 2) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_linux_args[count++] = grub_strdup(argv[TmpIdx]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < ventoy_linux_argc; i++)
|
||||||
|
{
|
||||||
|
ventoy_linux_args[count] = ventoy_linux_args[i + (LINUX_MAX_ARGC / 2)];
|
||||||
|
ventoy_linux_args[i + (LINUX_MAX_ARGC / 2)] = NULL;
|
||||||
|
|
||||||
|
if (ventoy_linux_args[count][0] == '@')
|
||||||
|
{
|
||||||
|
env = grub_env_get(ventoy_linux_args[count] + 1);
|
||||||
|
if (env)
|
||||||
|
{
|
||||||
|
grub_free(ventoy_linux_args[count]);
|
||||||
|
|
||||||
|
newenv = grub_strdup(env);
|
||||||
|
last = newenv;
|
||||||
|
|
||||||
|
while (*last)
|
||||||
|
{
|
||||||
|
while (*last)
|
||||||
|
{
|
||||||
|
if (*last != ' ' && *last != '\t')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
last++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*last == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (pos = last; *pos; pos++)
|
||||||
|
{
|
||||||
|
if (*pos == ' ' || *pos == '\t')
|
||||||
|
{
|
||||||
|
c = *pos;
|
||||||
|
*pos = 0;
|
||||||
|
if (0 == ventoy_boot_opt_filter(last))
|
||||||
|
{
|
||||||
|
ventoy_linux_args[count++] = grub_strdup(last);
|
||||||
|
}
|
||||||
|
*pos = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*pos == 0)
|
||||||
|
{
|
||||||
|
if (0 == ventoy_boot_opt_filter(last))
|
||||||
|
{
|
||||||
|
ventoy_linux_args[count++] = grub_strdup(last);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
last = pos + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (TmpIdx < argc)
|
||||||
|
{
|
||||||
|
if (ventoy_boot_opt_filter(argv[TmpIdx]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_linux_args[count++] = grub_strdup(argv[TmpIdx]);
|
||||||
|
TmpIdx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ventoy_debug)
|
||||||
|
{
|
||||||
|
ventoy_linux_args[count++] = grub_strdup("loglevel=7");
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_linux_argc = count;
|
||||||
|
|
||||||
|
if (ventoy_debug)
|
||||||
|
{
|
||||||
|
grub_printf("========== bootoption ==========\n");
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
grub_printf("%s ", ventoy_linux_args[i]);
|
||||||
|
}
|
||||||
|
grub_printf("\n================================\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_set_boot_opt (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const char *vtdebug;
|
||||||
|
|
||||||
|
for (i = 0; i < argc; i++)
|
||||||
|
{
|
||||||
|
ventoy_linux_args[ventoy_linux_argc + (LINUX_MAX_ARGC / 2) ] = grub_strdup(argv[i]);
|
||||||
|
ventoy_linux_argc++;
|
||||||
|
}
|
||||||
|
|
||||||
|
vtdebug = grub_env_get("vtdebug_flag");
|
||||||
|
if (vtdebug && vtdebug[0])
|
||||||
|
{
|
||||||
|
ventoy_debug = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ventoy_debug) grub_printf("ventoy set boot opt %d\n", ventoy_linux_argc);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_unset_boot_opt (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
|
||||||
|
for (i = 0; i < LINUX_MAX_ARGC; i++)
|
||||||
|
{
|
||||||
|
if (ventoy_linux_args[i])
|
||||||
|
{
|
||||||
|
grub_free(ventoy_linux_args[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_debug = 0;
|
||||||
|
ventoy_linux_argc = 0;
|
||||||
|
ventoy_initrd_called = 0;
|
||||||
|
grub_memset(ventoy_linux_args, 0, sizeof(char *) * LINUX_MAX_ARGC);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int newclen = 0;
|
||||||
|
char *pos = NULL;
|
||||||
|
char *end = NULL;
|
||||||
|
char buf[256] = {0};
|
||||||
|
|
||||||
|
if (argc != 1)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (pos = argv[0]; *pos; pos++)
|
||||||
|
{
|
||||||
|
if (*pos == '/')
|
||||||
|
{
|
||||||
|
end = pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end)
|
||||||
|
{
|
||||||
|
/* grub2 newc bug workaround */
|
||||||
|
newclen = (int)grub_strlen(end + 1);
|
||||||
|
if ((110 + newclen) % 4 == 0)
|
||||||
|
{
|
||||||
|
grub_snprintf(buf, sizeof(buf), "newc:.%s:%s", end + 1, argv[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_snprintf(buf, sizeof(buf), "newc:%s:%s", end + 1, argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ventoy_extra_initrd_num < 256)
|
||||||
|
{
|
||||||
|
ventoy_extra_initrd_list[ventoy_extra_initrd_num++] = grub_strdup(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_extra_initrd_reset (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
|
||||||
|
for (i = 0; i < ventoy_extra_initrd_num; i++)
|
||||||
|
{
|
||||||
|
if (ventoy_extra_initrd_list[i])
|
||||||
|
{
|
||||||
|
grub_free(ventoy_extra_initrd_list[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_memset(ventoy_extra_initrd_list, 0, sizeof(ventoy_extra_initrd_list));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_linux_boot (void)
|
||||||
|
{
|
||||||
|
ventoy_preboot();
|
||||||
|
|
||||||
|
if (finalize_params_linux () != GRUB_ERR_NONE)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
return (grub_arch_efi_linux_boot_image((grub_addr_t)kernel_addr,
|
||||||
|
kernel_size, linux_args));
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_linux_unload (void)
|
||||||
|
{
|
||||||
|
grub_dl_unref (my_mod);
|
||||||
|
loaded = 0;
|
||||||
|
if (initrd_start)
|
||||||
|
grub_efi_free_pages ((grub_efi_physical_address_t) initrd_start,
|
||||||
|
GRUB_EFI_BYTES_TO_PAGES (initrd_end - initrd_start));
|
||||||
|
initrd_start = initrd_end = 0;
|
||||||
|
grub_free (linux_args);
|
||||||
|
if (kernel_addr)
|
||||||
|
grub_efi_free_pages ((grub_addr_t) kernel_addr,
|
||||||
|
GRUB_EFI_BYTES_TO_PAGES (kernel_size));
|
||||||
|
grub_fdt_unload ();
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* As per linux/Documentation/arm/Booting
|
||||||
|
* ARM initrd needs to be covered by kernel linear mapping,
|
||||||
|
* so place it in the first 512MB of DRAM.
|
||||||
|
*
|
||||||
|
* As per linux/Documentation/arm64/booting.txt
|
||||||
|
* ARM64 initrd needs to be contained entirely within a 1GB aligned window
|
||||||
|
* of up to 32GB of size that covers the kernel image as well.
|
||||||
|
* Since the EFI stub loader will attempt to load the kernel near start of
|
||||||
|
* RAM, place the buffer in the first 32GB of RAM.
|
||||||
|
*/
|
||||||
|
#ifdef __arm__
|
||||||
|
#define INITRD_MAX_ADDRESS_OFFSET (512U * 1024 * 1024)
|
||||||
|
#else /* __aarch64__ */
|
||||||
|
#define INITRD_MAX_ADDRESS_OFFSET (32ULL * 1024 * 1024 * 1024)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function returns a pointer to a legally allocated initrd buffer,
|
||||||
|
* or NULL if unsuccessful
|
||||||
|
*/
|
||||||
|
static void *
|
||||||
|
allocate_initrd_mem (int initrd_pages)
|
||||||
|
{
|
||||||
|
grub_addr_t max_addr;
|
||||||
|
|
||||||
|
if (grub_efi_get_ram_base (&max_addr) != GRUB_ERR_NONE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
max_addr += INITRD_MAX_ADDRESS_OFFSET - 1;
|
||||||
|
|
||||||
|
return grub_efi_allocate_pages_real (max_addr, initrd_pages,
|
||||||
|
GRUB_EFI_ALLOCATE_MAX_ADDRESS,
|
||||||
|
GRUB_EFI_LOADER_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct grub_linux_initrd_context initrd_ctx = { 0, 0, 0 };
|
||||||
|
int initrd_size, initrd_pages;
|
||||||
|
void *initrd_mem = NULL;
|
||||||
|
|
||||||
|
if (argc == 0)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!loaded)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("you need to load the kernel first"));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_initrd_init (argc, argv, &initrd_ctx))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
initrd_size = grub_get_initrd_size (&initrd_ctx);
|
||||||
|
grub_dprintf ("linux", "Loading initrd\n");
|
||||||
|
|
||||||
|
initrd_pages = (GRUB_EFI_BYTES_TO_PAGES (initrd_size));
|
||||||
|
initrd_mem = allocate_initrd_mem (initrd_pages);
|
||||||
|
|
||||||
|
if (!initrd_mem)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_initrd_load (&initrd_ctx, argv, initrd_mem))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
initrd_start = (grub_addr_t) initrd_mem;
|
||||||
|
initrd_end = initrd_start + initrd_size;
|
||||||
|
grub_dprintf ("linux", "[addr=%p, size=0x%x]\n",
|
||||||
|
(void *) initrd_start, initrd_size);
|
||||||
|
|
||||||
|
fail:
|
||||||
|
grub_initrd_close (&initrd_ctx);
|
||||||
|
if (initrd_mem && !initrd_start)
|
||||||
|
grub_efi_free_pages ((grub_addr_t) initrd_mem, initrd_pages);
|
||||||
|
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
grub_file_t file = 0;
|
||||||
|
struct linux_arch_kernel_header lh;
|
||||||
|
grub_err_t err;
|
||||||
|
|
||||||
|
grub_dl_ref (my_mod);
|
||||||
|
|
||||||
|
if (argc == 0)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
|
||||||
|
if (!file)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
kernel_size = grub_file_size (file);
|
||||||
|
|
||||||
|
if (grub_file_read (file, &lh, sizeof (lh)) < (long) sizeof (lh))
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
if (grub_arch_efi_linux_check_image (&lh) != GRUB_ERR_NONE)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
grub_loader_unset();
|
||||||
|
|
||||||
|
grub_dprintf ("linux", "kernel file size: %lld\n", (long long) kernel_size);
|
||||||
|
kernel_addr = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (kernel_size));
|
||||||
|
grub_dprintf ("linux", "kernel numpages: %lld\n",
|
||||||
|
(long long) GRUB_EFI_BYTES_TO_PAGES (kernel_size));
|
||||||
|
if (!kernel_addr)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_file_seek (file, 0);
|
||||||
|
if (grub_file_read (file, kernel_addr, kernel_size)
|
||||||
|
< (grub_int64_t) kernel_size)
|
||||||
|
{
|
||||||
|
if (!grub_errno)
|
||||||
|
grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), argv[0]);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_dprintf ("linux", "kernel @ %p\n", kernel_addr);
|
||||||
|
|
||||||
|
cmdline_size = grub_loader_cmdline_size (argc, argv) + sizeof (LINUX_IMAGE);
|
||||||
|
linux_args = grub_malloc (cmdline_size);
|
||||||
|
if (!linux_args)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
grub_memcpy (linux_args, LINUX_IMAGE, sizeof (LINUX_IMAGE));
|
||||||
|
|
||||||
|
if (ventoy_linux_argc)
|
||||||
|
{
|
||||||
|
ventoy_bootopt_hook(argc, argv);
|
||||||
|
err = grub_create_loader_cmdline (ventoy_linux_argc, ventoy_linux_args,
|
||||||
|
linux_args + sizeof (LINUX_IMAGE) - 1,
|
||||||
|
cmdline_size,
|
||||||
|
GRUB_VERIFY_KERNEL_CMDLINE); }
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err = grub_create_loader_cmdline (argc, argv,
|
||||||
|
linux_args + sizeof (LINUX_IMAGE) - 1,
|
||||||
|
cmdline_size,
|
||||||
|
GRUB_VERIFY_KERNEL_CMDLINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (grub_errno == GRUB_ERR_NONE)
|
||||||
|
{
|
||||||
|
grub_loader_set (grub_linux_boot, grub_linux_unload, 0);
|
||||||
|
loaded = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (file)
|
||||||
|
grub_file_close (file);
|
||||||
|
|
||||||
|
if (grub_errno != GRUB_ERR_NONE)
|
||||||
|
{
|
||||||
|
grub_dl_unref (my_mod);
|
||||||
|
loaded = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (linux_args && !loaded)
|
||||||
|
grub_free (linux_args);
|
||||||
|
|
||||||
|
if (kernel_addr && !loaded)
|
||||||
|
grub_efi_free_pages ((grub_addr_t) kernel_addr,
|
||||||
|
GRUB_EFI_BYTES_TO_PAGES (kernel_size));
|
||||||
|
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
ventoy_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const char *file;
|
||||||
|
char buf[64];
|
||||||
|
|
||||||
|
if (ventoy_debug) grub_printf("ventoy_cmd_initrd %d\n", ventoy_linux_argc);
|
||||||
|
|
||||||
|
if (ventoy_linux_argc == 0)
|
||||||
|
{
|
||||||
|
return grub_cmd_initrd(cmd, argc, argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_snprintf(buf, sizeof(buf), "mem:%s:size:%s", grub_env_get("ventoy_cpio_addr"), grub_env_get("ventoy_cpio_size"));
|
||||||
|
|
||||||
|
if (ventoy_debug) grub_printf("membuf=%s\n", buf);
|
||||||
|
|
||||||
|
ventoy_extra_initrd_list[ventoy_extra_initrd_num++] = grub_strdup(buf);
|
||||||
|
|
||||||
|
file = grub_env_get("vtoy_img_part_file");
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
ventoy_extra_initrd_list[ventoy_extra_initrd_num++] = grub_strdup(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < argc; i++)
|
||||||
|
{
|
||||||
|
ventoy_extra_initrd_list[ventoy_extra_initrd_num++] = grub_strdup(argv[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_initrd_called = 1;
|
||||||
|
|
||||||
|
if (ventoy_debug)
|
||||||
|
{
|
||||||
|
grub_printf("========== initrd list ==========\n");
|
||||||
|
for (i = 0; i < ventoy_extra_initrd_num; i++)
|
||||||
|
{
|
||||||
|
grub_printf("%s\n", ventoy_extra_initrd_list[i]);
|
||||||
|
}
|
||||||
|
grub_printf("=================================\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return grub_cmd_initrd(cmd, ventoy_extra_initrd_num, ventoy_extra_initrd_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static grub_command_t cmd_linux, cmd_initrd, cmd_linuxefi, cmd_initrdefi;
|
||||||
|
static grub_command_t cmd_set_bootopt, cmd_unset_bootopt, cmd_extra_initrd_append, cmd_extra_initrd_reset;
|
||||||
|
|
||||||
|
|
||||||
|
GRUB_MOD_INIT (linux)
|
||||||
|
{
|
||||||
|
cmd_linux = grub_register_command ("linux", grub_cmd_linux, 0,
|
||||||
|
N_("Load Linux."));
|
||||||
|
cmd_initrd = grub_register_command ("initrd", ventoy_cmd_initrd, 0,
|
||||||
|
N_("Load initrd."));
|
||||||
|
|
||||||
|
cmd_linuxefi = grub_register_command ("linuxefi", grub_cmd_linux,
|
||||||
|
0, N_("Load Linux."));
|
||||||
|
cmd_initrdefi = grub_register_command ("initrdefi", ventoy_cmd_initrd,
|
||||||
|
0, N_("Load initrd."));
|
||||||
|
|
||||||
|
cmd_set_bootopt = grub_register_command ("vt_set_boot_opt", grub_cmd_set_boot_opt, 0, N_("set ext boot opt"));
|
||||||
|
cmd_unset_bootopt = grub_register_command ("vt_unset_boot_opt", grub_cmd_unset_boot_opt, 0, N_("unset ext boot opt"));
|
||||||
|
|
||||||
|
cmd_extra_initrd_append = grub_register_command ("vt_img_extra_initrd_append", grub_cmd_extra_initrd_append, 0, N_(""));
|
||||||
|
cmd_extra_initrd_reset = grub_register_command ("vt_img_extra_initrd_reset", grub_cmd_extra_initrd_reset, 0, N_(""));
|
||||||
|
|
||||||
|
ventoy_linux_args = grub_zalloc(sizeof(char *) * LINUX_MAX_ARGC);
|
||||||
|
|
||||||
|
my_mod = mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI (linux)
|
||||||
|
{
|
||||||
|
grub_unregister_command (cmd_linux);
|
||||||
|
grub_unregister_command (cmd_initrd);
|
||||||
|
}
|
||||||
@@ -88,7 +88,6 @@ static int ventoy_linux_argc = 0;
|
|||||||
static char **ventoy_linux_args = NULL;
|
static char **ventoy_linux_args = NULL;
|
||||||
static int ventoy_extra_initrd_num = 0;
|
static int ventoy_extra_initrd_num = 0;
|
||||||
static char *ventoy_extra_initrd_list[256];
|
static char *ventoy_extra_initrd_list[256];
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), int argc, char *argv[]);
|
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), int argc, char *argv[]);
|
||||||
|
|
||||||
@@ -507,6 +506,13 @@ static int ventoy_boot_opt_filter(char *opt)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (grub_strncmp(opt, "dm=", 3) == 0)
|
||||||
|
{
|
||||||
|
opt[0] = 'D';
|
||||||
|
opt[1] = 'M';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (ventoy_debug)
|
if (ventoy_debug)
|
||||||
{
|
{
|
||||||
if (grub_strcmp(opt, "quiet") == 0)
|
if (grub_strcmp(opt, "quiet") == 0)
|
||||||
@@ -531,6 +537,7 @@ static int ventoy_boot_opt_filter(char *opt)
|
|||||||
static int ventoy_bootopt_hook(int argc, char *argv[])
|
static int ventoy_bootopt_hook(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int TmpIdx;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
const char *env;
|
const char *env;
|
||||||
char c;
|
char c;
|
||||||
@@ -544,14 +551,20 @@ static int ventoy_bootopt_hook(int argc, char *argv[])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < argc; i++)
|
/* To avoid --- parameter, we split two parts */
|
||||||
|
for (TmpIdx = 0; TmpIdx < argc; TmpIdx++)
|
||||||
{
|
{
|
||||||
if (ventoy_boot_opt_filter(argv[i]))
|
if (ventoy_boot_opt_filter(argv[TmpIdx]))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ventoy_linux_args[count++] = grub_strdup(argv[i]);
|
if (grub_strncmp(argv[TmpIdx], "--", 2) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_linux_args[count++] = grub_strdup(argv[TmpIdx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < ventoy_linux_argc; i++)
|
for (i = 0; i < ventoy_linux_argc; i++)
|
||||||
@@ -623,6 +636,17 @@ static int ventoy_bootopt_hook(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (TmpIdx < argc)
|
||||||
|
{
|
||||||
|
if (ventoy_boot_opt_filter(argv[TmpIdx]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_linux_args[count++] = grub_strdup(argv[TmpIdx]);
|
||||||
|
TmpIdx++;
|
||||||
|
}
|
||||||
|
|
||||||
if (ventoy_debug)
|
if (ventoy_debug)
|
||||||
{
|
{
|
||||||
ventoy_linux_args[count++] = grub_strdup("loglevel=7");
|
ventoy_linux_args[count++] = grub_strdup("loglevel=7");
|
||||||
|
|||||||
316
GRUB2/MOD_SRC/grub-2.04/grub-core/loader/linux.c
Normal file
316
GRUB2/MOD_SRC/grub-2.04/grub-core/loader/linux.c
Normal file
@@ -0,0 +1,316 @@
|
|||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/linux.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/file.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/env.h>
|
||||||
|
#include <grub/term.h>
|
||||||
|
|
||||||
|
struct newc_head
|
||||||
|
{
|
||||||
|
char magic[6];
|
||||||
|
char ino[8];
|
||||||
|
char mode[8];
|
||||||
|
char uid[8];
|
||||||
|
char gid[8];
|
||||||
|
char nlink[8];
|
||||||
|
char mtime[8];
|
||||||
|
char filesize[8];
|
||||||
|
char devmajor[8];
|
||||||
|
char devminor[8];
|
||||||
|
char rdevmajor[8];
|
||||||
|
char rdevminor[8];
|
||||||
|
char namesize[8];
|
||||||
|
char check[8];
|
||||||
|
} GRUB_PACKED;
|
||||||
|
|
||||||
|
struct grub_linux_initrd_component
|
||||||
|
{
|
||||||
|
grub_file_t file;
|
||||||
|
char *newc_name;
|
||||||
|
grub_off_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dir
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
struct dir *next;
|
||||||
|
struct dir *child;
|
||||||
|
};
|
||||||
|
|
||||||
|
static char
|
||||||
|
hex (grub_uint8_t val)
|
||||||
|
{
|
||||||
|
if (val < 10)
|
||||||
|
return '0' + val;
|
||||||
|
return 'a' + val - 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_field (char *var, grub_uint32_t val)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *ptr = var;
|
||||||
|
for (i = 28; i >= 0; i -= 4)
|
||||||
|
*ptr++ = hex((val >> i) & 0xf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_uint8_t *
|
||||||
|
make_header (grub_uint8_t *ptr,
|
||||||
|
const char *name, grub_size_t len,
|
||||||
|
grub_uint32_t mode,
|
||||||
|
grub_off_t fsize)
|
||||||
|
{
|
||||||
|
struct newc_head *head = (struct newc_head *) ptr;
|
||||||
|
grub_uint8_t *optr;
|
||||||
|
grub_size_t oh = 0;
|
||||||
|
grub_memcpy (head->magic, "070701", 6);
|
||||||
|
set_field (head->ino, 0);
|
||||||
|
set_field (head->mode, mode);
|
||||||
|
set_field (head->uid, 0);
|
||||||
|
set_field (head->gid, 0);
|
||||||
|
set_field (head->nlink, 1);
|
||||||
|
set_field (head->mtime, 0);
|
||||||
|
set_field (head->filesize, fsize);
|
||||||
|
set_field (head->devmajor, 0);
|
||||||
|
set_field (head->devminor, 0);
|
||||||
|
set_field (head->rdevmajor, 0);
|
||||||
|
set_field (head->rdevminor, 0);
|
||||||
|
set_field (head->namesize, len);
|
||||||
|
set_field (head->check, 0);
|
||||||
|
optr = ptr;
|
||||||
|
ptr += sizeof (struct newc_head);
|
||||||
|
grub_memcpy (ptr, name, len);
|
||||||
|
ptr += len;
|
||||||
|
oh = ALIGN_UP_OVERHEAD (ptr - optr, 4);
|
||||||
|
grub_memset (ptr, 0, oh);
|
||||||
|
ptr += oh;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_dir (struct dir *root)
|
||||||
|
{
|
||||||
|
if (!root)
|
||||||
|
return;
|
||||||
|
free_dir (root->next);
|
||||||
|
free_dir (root->child);
|
||||||
|
grub_free (root->name);
|
||||||
|
grub_free (root);
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_size_t
|
||||||
|
insert_dir (const char *name, struct dir **root,
|
||||||
|
grub_uint8_t *ptr)
|
||||||
|
{
|
||||||
|
struct dir *cur, **head = root;
|
||||||
|
const char *cb, *ce = name;
|
||||||
|
grub_size_t size = 0;
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
for (cb = ce; *cb == '/'; cb++);
|
||||||
|
for (ce = cb; *ce && *ce != '/'; ce++);
|
||||||
|
if (!*ce)
|
||||||
|
break;
|
||||||
|
|
||||||
|
for (cur = *root; cur; cur = cur->next)
|
||||||
|
if (grub_memcmp (cur->name, cb, ce - cb)
|
||||||
|
&& cur->name[ce - cb] == 0)
|
||||||
|
break;
|
||||||
|
if (!cur)
|
||||||
|
{
|
||||||
|
struct dir *n;
|
||||||
|
n = grub_zalloc (sizeof (*n));
|
||||||
|
if (!n)
|
||||||
|
return 0;
|
||||||
|
n->next = *head;
|
||||||
|
n->name = grub_strndup (cb, ce - cb);
|
||||||
|
if (ptr)
|
||||||
|
{
|
||||||
|
grub_dprintf ("linux", "Creating directory %s, %s\n", name, ce);
|
||||||
|
ptr = make_header (ptr, name, ce - name,
|
||||||
|
040777, 0);
|
||||||
|
}
|
||||||
|
size += ALIGN_UP ((ce - (char *) name)
|
||||||
|
+ sizeof (struct newc_head), 4);
|
||||||
|
*head = n;
|
||||||
|
cur = n;
|
||||||
|
}
|
||||||
|
root = &cur->next;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_initrd_init (int argc, char *argv[],
|
||||||
|
struct grub_linux_initrd_context *initrd_ctx)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int newc = 0;
|
||||||
|
struct dir *root = 0;
|
||||||
|
|
||||||
|
initrd_ctx->nfiles = 0;
|
||||||
|
initrd_ctx->components = 0;
|
||||||
|
|
||||||
|
initrd_ctx->components = grub_zalloc (argc
|
||||||
|
* sizeof (initrd_ctx->components[0]));
|
||||||
|
if (!initrd_ctx->components)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
initrd_ctx->size = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < argc; i++)
|
||||||
|
{
|
||||||
|
const char *fname = argv[i];
|
||||||
|
|
||||||
|
initrd_ctx->size = ALIGN_UP (initrd_ctx->size, 4);
|
||||||
|
|
||||||
|
if (grub_memcmp (argv[i], "newc:", 5) == 0)
|
||||||
|
{
|
||||||
|
const char *ptr, *eptr;
|
||||||
|
ptr = argv[i] + 5;
|
||||||
|
while (*ptr == '/')
|
||||||
|
ptr++;
|
||||||
|
eptr = grub_strchr (ptr, ':');
|
||||||
|
if (eptr)
|
||||||
|
{
|
||||||
|
initrd_ctx->components[i].newc_name = grub_strndup (ptr, eptr - ptr);
|
||||||
|
if (!initrd_ctx->components[i].newc_name)
|
||||||
|
{
|
||||||
|
grub_initrd_close (initrd_ctx);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
initrd_ctx->size
|
||||||
|
+= ALIGN_UP (sizeof (struct newc_head)
|
||||||
|
+ grub_strlen (initrd_ctx->components[i].newc_name),
|
||||||
|
4);
|
||||||
|
initrd_ctx->size += insert_dir (initrd_ctx->components[i].newc_name,
|
||||||
|
&root, 0);
|
||||||
|
newc = 1;
|
||||||
|
fname = eptr + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (newc)
|
||||||
|
{
|
||||||
|
initrd_ctx->size += ALIGN_UP (sizeof (struct newc_head)
|
||||||
|
+ sizeof ("TRAILER!!!") - 1, 4);
|
||||||
|
free_dir (root);
|
||||||
|
root = 0;
|
||||||
|
newc = 0;
|
||||||
|
}
|
||||||
|
initrd_ctx->components[i].file = grub_file_open (fname,
|
||||||
|
GRUB_FILE_TYPE_LINUX_INITRD
|
||||||
|
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||||
|
if (!initrd_ctx->components[i].file)
|
||||||
|
{
|
||||||
|
grub_initrd_close (initrd_ctx);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
initrd_ctx->nfiles++;
|
||||||
|
initrd_ctx->components[i].size
|
||||||
|
= grub_file_size (initrd_ctx->components[i].file);
|
||||||
|
initrd_ctx->size += initrd_ctx->components[i].size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newc)
|
||||||
|
{
|
||||||
|
initrd_ctx->size = ALIGN_UP (initrd_ctx->size, 4);
|
||||||
|
initrd_ctx->size += ALIGN_UP (sizeof (struct newc_head)
|
||||||
|
+ sizeof ("TRAILER!!!") - 1, 4);
|
||||||
|
free_dir (root);
|
||||||
|
root = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_size_t
|
||||||
|
grub_get_initrd_size (struct grub_linux_initrd_context *initrd_ctx)
|
||||||
|
{
|
||||||
|
return initrd_ctx->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_initrd_close (struct grub_linux_initrd_context *initrd_ctx)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
if (!initrd_ctx->components)
|
||||||
|
return;
|
||||||
|
for (i = 0; i < initrd_ctx->nfiles; i++)
|
||||||
|
{
|
||||||
|
grub_free (initrd_ctx->components[i].newc_name);
|
||||||
|
grub_file_close (initrd_ctx->components[i].file);
|
||||||
|
}
|
||||||
|
grub_free (initrd_ctx->components);
|
||||||
|
initrd_ctx->components = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int ventoy_need_prompt_load_file(void);
|
||||||
|
extern grub_ssize_t ventoy_load_file_with_prompt(grub_file_t file, void *buf, grub_ssize_t size);
|
||||||
|
grub_err_t
|
||||||
|
grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx,
|
||||||
|
char *argv[], void *target)
|
||||||
|
{
|
||||||
|
grub_uint8_t *ptr = target;
|
||||||
|
int i;
|
||||||
|
int newc = 0;
|
||||||
|
struct dir *root = 0;
|
||||||
|
grub_ssize_t cursize = 0;
|
||||||
|
grub_ssize_t readsize = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < initrd_ctx->nfiles; i++)
|
||||||
|
{
|
||||||
|
grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4));
|
||||||
|
ptr += ALIGN_UP_OVERHEAD (cursize, 4);
|
||||||
|
|
||||||
|
if (initrd_ctx->components[i].newc_name)
|
||||||
|
{
|
||||||
|
ptr += insert_dir (initrd_ctx->components[i].newc_name,
|
||||||
|
&root, ptr);
|
||||||
|
ptr = make_header (ptr, initrd_ctx->components[i].newc_name,
|
||||||
|
grub_strlen (initrd_ctx->components[i].newc_name),
|
||||||
|
0100777,
|
||||||
|
initrd_ctx->components[i].size);
|
||||||
|
newc = 1;
|
||||||
|
}
|
||||||
|
else if (newc)
|
||||||
|
{
|
||||||
|
ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1,
|
||||||
|
0, 0);
|
||||||
|
free_dir (root);
|
||||||
|
root = 0;
|
||||||
|
newc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursize = initrd_ctx->components[i].size;
|
||||||
|
if (ventoy_need_prompt_load_file() && initrd_ctx->components[i].newc_name &&
|
||||||
|
grub_strcmp(initrd_ctx->components[i].newc_name, "boot.wim") == 0)
|
||||||
|
{
|
||||||
|
readsize = ventoy_load_file_with_prompt(initrd_ctx->components[i].file, ptr, cursize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
readsize = grub_file_read (initrd_ctx->components[i].file, ptr, cursize);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (readsize != cursize)
|
||||||
|
{
|
||||||
|
if (!grub_errno)
|
||||||
|
grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"),
|
||||||
|
argv[i]);
|
||||||
|
grub_initrd_close (initrd_ctx);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
ptr += cursize;
|
||||||
|
}
|
||||||
|
if (newc)
|
||||||
|
{
|
||||||
|
grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4));
|
||||||
|
ptr += ALIGN_UP_OVERHEAD (cursize, 4);
|
||||||
|
ptr = make_header (ptr, "TRAILER!!!", sizeof ("TRAILER!!!") - 1, 0, 0);
|
||||||
|
}
|
||||||
|
free_dir (root);
|
||||||
|
root = 0;
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
1041
GRUB2/MOD_SRC/grub-2.04/grub-core/loader/mips64/linux.c
Normal file
1041
GRUB2/MOD_SRC/grub-2.04/grub-core/loader/mips64/linux.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -33,15 +33,35 @@
|
|||||||
#include <grub/gfxterm.h>
|
#include <grub/gfxterm.h>
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
#include <grub/env.h>
|
#include <grub/env.h>
|
||||||
|
#include <grub/extcmd.h>
|
||||||
|
#include <grub/ventoy.h>
|
||||||
|
#include "ventoy/ventoy_def.h"
|
||||||
|
|
||||||
int g_ventoy_menu_refresh = 0;
|
int g_ventoy_menu_refresh = 0;
|
||||||
int g_ventoy_memdisk_mode = 0;
|
int g_ventoy_memdisk_mode = 0;
|
||||||
int g_ventoy_iso_raw = 0;
|
int g_ventoy_iso_raw = 0;
|
||||||
|
int g_ventoy_grub2_mode = 0;
|
||||||
|
int g_ventoy_wimboot_mode = 0;
|
||||||
int g_ventoy_iso_uefi_drv = 0;
|
int g_ventoy_iso_uefi_drv = 0;
|
||||||
int g_ventoy_last_entry = -1;
|
int g_ventoy_last_entry = -1;
|
||||||
int g_ventoy_suppress_esc = 0;
|
int g_ventoy_suppress_esc = 0;
|
||||||
|
int g_ventoy_suppress_esc_default = 1;
|
||||||
int g_ventoy_menu_esc = 0;
|
int g_ventoy_menu_esc = 0;
|
||||||
int g_ventoy_fn_mutex = 0;
|
int g_ventoy_fn_mutex = 0;
|
||||||
|
int g_ventoy_terminal_output = 0;
|
||||||
|
|
||||||
|
#define VTOY_COMM_HOTKEY(cmdkey) \
|
||||||
|
if (0 == g_ventoy_fn_mutex) { \
|
||||||
|
cmdstr = grub_env_get(cmdkey); \
|
||||||
|
if (cmdstr) \
|
||||||
|
{ \
|
||||||
|
menu_fini (); \
|
||||||
|
g_ventoy_fn_mutex = 1; \
|
||||||
|
grub_script_execute_sourcecode(cmdstr); \
|
||||||
|
g_ventoy_fn_mutex = 0; \
|
||||||
|
goto refresh; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
/* Time to delay after displaying an error message about a default/fallback
|
/* Time to delay after displaying an error message about a default/fallback
|
||||||
entry failing to boot. */
|
entry failing to boot. */
|
||||||
@@ -378,10 +398,57 @@ grub_menu_execute_with_fallback (grub_menu_t menu,
|
|||||||
|
|
||||||
static struct grub_menu_viewer *viewers;
|
static struct grub_menu_viewer *viewers;
|
||||||
|
|
||||||
|
int g_menu_update_mode = 0;
|
||||||
|
int g_ventoy_tip_label_enable = 0;
|
||||||
|
const char * g_ventoy_tip_msg1 = NULL;
|
||||||
|
const char * g_ventoy_tip_msg2 = NULL;
|
||||||
|
static const char *g_ventoy_cur_img_path = NULL;
|
||||||
|
static void menu_set_chosen_tip(grub_menu_t menu, int entry)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
img_info *img;
|
||||||
|
menu_tip *tip;
|
||||||
|
grub_menu_entry_t e = grub_menu_get_entry (menu, entry);
|
||||||
|
|
||||||
|
g_ventoy_tip_msg1 = g_ventoy_tip_msg2 = NULL;
|
||||||
|
if (e && e->id && grub_strncmp(e->id, "VID_", 4) == 0)
|
||||||
|
{
|
||||||
|
img = (img_info *)(void *)grub_strtoul(e->id + 4, NULL, 16);
|
||||||
|
if (img)
|
||||||
|
{
|
||||||
|
g_ventoy_tip_msg1 = img->tip1;
|
||||||
|
g_ventoy_tip_msg2 = img->tip2;
|
||||||
|
g_ventoy_cur_img_path = img->path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (e && e->id && grub_strncmp(e->id, "DIR_", 4) == 0)
|
||||||
|
{
|
||||||
|
for (i = 0; i < e->argc; i++)
|
||||||
|
{
|
||||||
|
if (e->args[i] && grub_strncmp(e->args[i], "_VTIP_", 6) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < e->argc)
|
||||||
|
{
|
||||||
|
tip = (menu_tip *)(void *)grub_strtoul(e->args[i] + 6, NULL, 16);
|
||||||
|
if (tip)
|
||||||
|
{
|
||||||
|
g_ventoy_tip_msg1 = tip->tip1;
|
||||||
|
g_ventoy_tip_msg2 = tip->tip2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
menu_set_chosen_entry (int entry)
|
menu_set_chosen_entry (grub_menu_t menu, int entry)
|
||||||
{
|
{
|
||||||
struct grub_menu_viewer *cur;
|
struct grub_menu_viewer *cur;
|
||||||
|
|
||||||
|
menu_set_chosen_tip(menu, entry);
|
||||||
for (cur = viewers; cur; cur = cur->next)
|
for (cur = viewers; cur; cur = cur->next)
|
||||||
cur->set_chosen_entry (entry, cur->data);
|
cur->set_chosen_entry (entry, cur->data);
|
||||||
}
|
}
|
||||||
@@ -595,7 +662,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
default_entry = get_entry_number (menu, "default");
|
default_entry = get_entry_number (menu, "default");
|
||||||
|
|
||||||
if (g_ventoy_suppress_esc)
|
if (g_ventoy_suppress_esc)
|
||||||
default_entry = 1;
|
default_entry = g_ventoy_suppress_esc_default;
|
||||||
else if (g_ventoy_last_entry >= 0 && g_ventoy_last_entry < menu->size) {
|
else if (g_ventoy_last_entry >= 0 && g_ventoy_last_entry < menu->size) {
|
||||||
default_entry = g_ventoy_last_entry;
|
default_entry = g_ventoy_last_entry;
|
||||||
}
|
}
|
||||||
@@ -677,6 +744,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
current_entry = default_entry;
|
current_entry = default_entry;
|
||||||
|
|
||||||
refresh:
|
refresh:
|
||||||
|
menu_set_chosen_tip(menu, current_entry);
|
||||||
menu_init (current_entry, menu, nested);
|
menu_init (current_entry, menu, nested);
|
||||||
|
|
||||||
/* Initialize the time. */
|
/* Initialize the time. */
|
||||||
@@ -729,13 +797,13 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
case GRUB_TERM_KEY_HOME:
|
case GRUB_TERM_KEY_HOME:
|
||||||
case GRUB_TERM_CTRL | 'a':
|
case GRUB_TERM_CTRL | 'a':
|
||||||
current_entry = 0;
|
current_entry = 0;
|
||||||
menu_set_chosen_entry (current_entry);
|
menu_set_chosen_entry (menu, current_entry);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GRUB_TERM_KEY_END:
|
case GRUB_TERM_KEY_END:
|
||||||
case GRUB_TERM_CTRL | 'e':
|
case GRUB_TERM_CTRL | 'e':
|
||||||
current_entry = menu->size - 1;
|
current_entry = menu->size - 1;
|
||||||
menu_set_chosen_entry (current_entry);
|
menu_set_chosen_entry (menu, current_entry);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GRUB_TERM_KEY_UP:
|
case GRUB_TERM_KEY_UP:
|
||||||
@@ -743,7 +811,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
case '^':
|
case '^':
|
||||||
if (current_entry > 0)
|
if (current_entry > 0)
|
||||||
current_entry--;
|
current_entry--;
|
||||||
menu_set_chosen_entry (current_entry);
|
menu_set_chosen_entry (menu, current_entry);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GRUB_TERM_CTRL | 'n':
|
case GRUB_TERM_CTRL | 'n':
|
||||||
@@ -751,7 +819,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
case 'v':
|
case 'v':
|
||||||
if (current_entry < menu->size - 1)
|
if (current_entry < menu->size - 1)
|
||||||
current_entry++;
|
current_entry++;
|
||||||
menu_set_chosen_entry (current_entry);
|
menu_set_chosen_entry (menu, current_entry);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GRUB_TERM_CTRL | 'g':
|
case GRUB_TERM_CTRL | 'g':
|
||||||
@@ -760,7 +828,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
current_entry = 0;
|
current_entry = 0;
|
||||||
else
|
else
|
||||||
current_entry -= GRUB_MENU_PAGE_SIZE;
|
current_entry -= GRUB_MENU_PAGE_SIZE;
|
||||||
menu_set_chosen_entry (current_entry);
|
menu_set_chosen_entry (menu, current_entry);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GRUB_TERM_CTRL | 'c':
|
case GRUB_TERM_CTRL | 'c':
|
||||||
@@ -769,7 +837,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
current_entry += GRUB_MENU_PAGE_SIZE;
|
current_entry += GRUB_MENU_PAGE_SIZE;
|
||||||
else
|
else
|
||||||
current_entry = menu->size - 1;
|
current_entry = menu->size - 1;
|
||||||
menu_set_chosen_entry (current_entry);
|
menu_set_chosen_entry (menu, current_entry);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '\n':
|
case '\n':
|
||||||
@@ -804,82 +872,37 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
|
|
||||||
case GRUB_TERM_KEY_F2:
|
case GRUB_TERM_KEY_F2:
|
||||||
case '2':
|
case '2':
|
||||||
if (0 == g_ventoy_fn_mutex) {
|
VTOY_COMM_HOTKEY("VTOY_F2_CMD");
|
||||||
cmdstr = grub_env_get("VTOY_F2_CMD");
|
|
||||||
if (cmdstr)
|
|
||||||
{
|
|
||||||
menu_fini ();
|
|
||||||
g_ventoy_fn_mutex = 1;
|
|
||||||
grub_script_execute_sourcecode(cmdstr);
|
|
||||||
g_ventoy_fn_mutex = 0;
|
|
||||||
goto refresh;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case GRUB_TERM_KEY_F3:
|
case GRUB_TERM_KEY_F3:
|
||||||
case '3':
|
case '3':
|
||||||
if (0 == g_ventoy_fn_mutex) {
|
VTOY_COMM_HOTKEY("VTOY_F3_CMD");
|
||||||
cmdstr = grub_env_get("VTOY_F3_CMD");
|
|
||||||
if (cmdstr)
|
|
||||||
{
|
|
||||||
menu_fini ();
|
|
||||||
grub_script_execute_sourcecode(cmdstr);
|
|
||||||
goto refresh;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case GRUB_TERM_KEY_F4:
|
case GRUB_TERM_KEY_F4:
|
||||||
case '4':
|
case '4':
|
||||||
if (0 == g_ventoy_fn_mutex) {
|
VTOY_COMM_HOTKEY("VTOY_F4_CMD");
|
||||||
cmdstr = grub_env_get("VTOY_F4_CMD");
|
|
||||||
if (cmdstr)
|
|
||||||
{
|
|
||||||
menu_fini ();
|
|
||||||
g_ventoy_fn_mutex = 1;
|
|
||||||
grub_script_execute_sourcecode(cmdstr);
|
|
||||||
g_ventoy_fn_mutex = 0;
|
|
||||||
goto refresh;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case GRUB_TERM_KEY_F5:
|
case GRUB_TERM_KEY_F5:
|
||||||
case '5':
|
case '5':
|
||||||
if (0 == g_ventoy_fn_mutex) {
|
VTOY_COMM_HOTKEY("VTOY_F5_CMD");
|
||||||
cmdstr = grub_env_get("VTOY_F5_CMD");
|
|
||||||
if (cmdstr)
|
|
||||||
{
|
|
||||||
menu_fini ();
|
|
||||||
g_ventoy_fn_mutex = 1;
|
|
||||||
grub_script_execute_sourcecode(cmdstr);
|
|
||||||
g_ventoy_fn_mutex = 0;
|
|
||||||
goto refresh;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case GRUB_TERM_KEY_F6:
|
case GRUB_TERM_KEY_F6:
|
||||||
case '6':
|
case '6':
|
||||||
if (0 == g_ventoy_fn_mutex) {
|
VTOY_COMM_HOTKEY("VTOY_F6_CMD");
|
||||||
cmdstr = grub_env_get("VTOY_F6_CMD");
|
|
||||||
if (cmdstr)
|
|
||||||
{
|
|
||||||
menu_fini ();
|
|
||||||
g_ventoy_fn_mutex = 1;
|
|
||||||
grub_script_execute_sourcecode(cmdstr);
|
|
||||||
g_ventoy_fn_mutex = 0;
|
|
||||||
goto refresh;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case GRUB_TERM_KEY_F7:
|
case GRUB_TERM_KEY_F7:
|
||||||
case '7':
|
menu_fini ();
|
||||||
cmdstr = grub_env_get("VTOY_F7_CMD");
|
if (g_ventoy_terminal_output == 0)
|
||||||
if (cmdstr)
|
|
||||||
{
|
{
|
||||||
menu_fini ();
|
grub_script_execute_sourcecode("terminal_output console");
|
||||||
grub_script_execute_sourcecode(cmdstr);
|
g_ventoy_terminal_output = 1;
|
||||||
goto refresh;
|
|
||||||
}
|
}
|
||||||
break;
|
else
|
||||||
|
{
|
||||||
|
grub_script_execute_sourcecode("terminal_output gfxterm");
|
||||||
|
g_ventoy_terminal_output = 0;
|
||||||
|
}
|
||||||
|
goto refresh;
|
||||||
case GRUB_TERM_KEY_F1:
|
case GRUB_TERM_KEY_F1:
|
||||||
case '1':
|
case '1':
|
||||||
menu_fini ();
|
menu_fini ();
|
||||||
@@ -893,12 +916,58 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
g_ventoy_menu_refresh = 1;
|
g_ventoy_menu_refresh = 1;
|
||||||
goto refresh;
|
goto refresh;
|
||||||
|
|
||||||
|
case (GRUB_TERM_CTRL | 'r'):
|
||||||
|
menu_fini ();
|
||||||
|
g_ventoy_grub2_mode = 1 - g_ventoy_grub2_mode;
|
||||||
|
g_ventoy_menu_refresh = 1;
|
||||||
|
goto refresh;
|
||||||
|
|
||||||
|
case (GRUB_TERM_CTRL | 'w'):
|
||||||
|
menu_fini ();
|
||||||
|
g_ventoy_wimboot_mode = 1 - g_ventoy_wimboot_mode;
|
||||||
|
g_ventoy_menu_refresh = 1;
|
||||||
|
goto refresh;
|
||||||
|
|
||||||
case (GRUB_TERM_CTRL | 'u'):
|
case (GRUB_TERM_CTRL | 'u'):
|
||||||
menu_fini ();
|
menu_fini ();
|
||||||
g_ventoy_iso_uefi_drv = 1 - g_ventoy_iso_uefi_drv;
|
g_ventoy_iso_uefi_drv = 1 - g_ventoy_iso_uefi_drv;
|
||||||
g_ventoy_menu_refresh = 1;
|
g_ventoy_menu_refresh = 1;
|
||||||
goto refresh;
|
goto refresh;
|
||||||
|
|
||||||
|
case (GRUB_TERM_CTRL | 'h'):
|
||||||
|
case 'h':
|
||||||
|
{
|
||||||
|
cmdstr = grub_env_get("VTOY_HELP_CMD");
|
||||||
|
if (cmdstr)
|
||||||
|
{
|
||||||
|
grub_script_execute_sourcecode(cmdstr);
|
||||||
|
while (grub_getkey() != GRUB_TERM_ESC)
|
||||||
|
;
|
||||||
|
menu_fini ();
|
||||||
|
goto refresh;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (GRUB_TERM_CTRL | 'm'):
|
||||||
|
case 'm':
|
||||||
|
{
|
||||||
|
if (g_ventoy_cur_img_path)
|
||||||
|
{
|
||||||
|
grub_env_set("VTOY_CHKSUM_FILE_PATH", g_ventoy_cur_img_path);
|
||||||
|
cmdstr = grub_env_get("VTOY_CHKSUM_CMD");
|
||||||
|
if (cmdstr)
|
||||||
|
{
|
||||||
|
menu_fini();
|
||||||
|
grub_script_execute_sourcecode(cmdstr);
|
||||||
|
goto refresh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_env_set("VTOY_CHKSUM_FILE_PATH", "X");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
int entry;
|
int entry;
|
||||||
@@ -992,6 +1061,11 @@ show_menu (grub_menu_t menu, int nested, int autobooted)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (autobooted == 0 && g_ventoy_menu_esc && auto_boot) {
|
||||||
|
g_ventoy_last_entry = boot_entry;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
e = grub_menu_get_entry (menu, boot_entry);
|
e = grub_menu_get_entry (menu, boot_entry);
|
||||||
if (! e)
|
if (! e)
|
||||||
continue; /* Menu is empty. */
|
continue; /* Menu is empty. */
|
||||||
|
|||||||
232
GRUB2/MOD_SRC/grub-2.04/grub-core/partmap/gpt.c
Normal file
232
GRUB2/MOD_SRC/grub-2.04/grub-core/partmap/gpt.c
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
/* gpt.c - Read GUID Partition Tables (GPT). */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2002,2005,2006,2007,2008 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/disk.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/partition.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/msdos_partition.h>
|
||||||
|
#include <grub/gpt_partition.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
static grub_uint8_t grub_gpt_magic[8] =
|
||||||
|
{
|
||||||
|
0x45, 0x46, 0x49, 0x20, 0x50, 0x41, 0x52, 0x54
|
||||||
|
};
|
||||||
|
|
||||||
|
static const grub_gpt_part_guid_t grub_gpt_partition_type_empty = GRUB_GPT_PARTITION_TYPE_EMPTY;
|
||||||
|
|
||||||
|
#ifdef GRUB_UTIL
|
||||||
|
static const grub_gpt_part_guid_t grub_gpt_partition_type_bios_boot = GRUB_GPT_PARTITION_TYPE_BIOS_BOOT;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 512 << 7 = 65536 byte sectors. */
|
||||||
|
#define MAX_SECTOR_LOG 7
|
||||||
|
|
||||||
|
static struct grub_partition_map grub_gpt_partition_map;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_gpt_partition_map_iterate (grub_disk_t disk,
|
||||||
|
grub_partition_iterate_hook_t hook,
|
||||||
|
void *hook_data)
|
||||||
|
{
|
||||||
|
struct grub_partition part;
|
||||||
|
struct grub_gpt_header gpt;
|
||||||
|
struct grub_gpt_partentry entry;
|
||||||
|
struct grub_msdos_partition_mbr mbr;
|
||||||
|
grub_uint64_t entries;
|
||||||
|
unsigned int i;
|
||||||
|
int last_offset = 0;
|
||||||
|
int sector_log = 0;
|
||||||
|
|
||||||
|
/* Read the protective MBR. */
|
||||||
|
if (grub_disk_read (disk, 0, 0, sizeof (mbr), &mbr))
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
/* Check if it is valid. */
|
||||||
|
if (mbr.signature != grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE))
|
||||||
|
return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature");
|
||||||
|
|
||||||
|
/* Make sure the MBR is a protective MBR and not a normal MBR. */
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
if (mbr.entries[i].type == GRUB_PC_PARTITION_TYPE_GPT_DISK)
|
||||||
|
break;
|
||||||
|
if (i == 4)
|
||||||
|
return grub_error (GRUB_ERR_BAD_PART_TABLE, "no GPT partition map found");
|
||||||
|
|
||||||
|
/* Read the GPT header. */
|
||||||
|
for (sector_log = 0; sector_log < MAX_SECTOR_LOG; sector_log++)
|
||||||
|
{
|
||||||
|
if (grub_disk_read (disk, 1 << sector_log, 0, sizeof (gpt), &gpt))
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
if (grub_memcmp (gpt.magic, grub_gpt_magic, sizeof (grub_gpt_magic)) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sector_log == MAX_SECTOR_LOG)
|
||||||
|
return grub_error (GRUB_ERR_BAD_PART_TABLE, "no valid GPT header");
|
||||||
|
|
||||||
|
grub_dprintf ("gpt", "Read a valid GPT header\n");
|
||||||
|
|
||||||
|
entries = grub_le_to_cpu64 (gpt.partitions) << sector_log;
|
||||||
|
for (i = 0; i < grub_le_to_cpu32 (gpt.maxpart); i++)
|
||||||
|
{
|
||||||
|
if (grub_disk_read (disk, entries, last_offset,
|
||||||
|
sizeof (entry), &entry))
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
if (grub_memcmp (&grub_gpt_partition_type_empty, &entry.type,
|
||||||
|
sizeof (grub_gpt_partition_type_empty)))
|
||||||
|
{
|
||||||
|
/* Calculate the first block and the size of the partition. */
|
||||||
|
part.start = grub_le_to_cpu64 (entry.start) << sector_log;
|
||||||
|
part.len = (grub_le_to_cpu64 (entry.end)
|
||||||
|
- grub_le_to_cpu64 (entry.start) + 1) << sector_log;
|
||||||
|
part.offset = entries;
|
||||||
|
part.number = i;
|
||||||
|
part.index = last_offset;
|
||||||
|
part.partmap = &grub_gpt_partition_map;
|
||||||
|
part.parent = disk->partition;
|
||||||
|
part.gpt_attrib = entry.attrib;
|
||||||
|
|
||||||
|
grub_dprintf ("gpt", "GPT entry %d: start=%lld, length=%lld\n", i,
|
||||||
|
(unsigned long long) part.start,
|
||||||
|
(unsigned long long) part.len);
|
||||||
|
|
||||||
|
if (hook (disk, &part, hook_data))
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_offset += grub_le_to_cpu32 (gpt.partentry_size);
|
||||||
|
if (last_offset == GRUB_DISK_SECTOR_SIZE)
|
||||||
|
{
|
||||||
|
last_offset = 0;
|
||||||
|
entries++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef GRUB_UTIL
|
||||||
|
/* Context for gpt_partition_map_embed. */
|
||||||
|
struct gpt_partition_map_embed_ctx
|
||||||
|
{
|
||||||
|
grub_disk_addr_t start, len;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Helper for gpt_partition_map_embed. */
|
||||||
|
static int
|
||||||
|
find_usable_region (grub_disk_t disk __attribute__ ((unused)),
|
||||||
|
const grub_partition_t p, void *data)
|
||||||
|
{
|
||||||
|
struct gpt_partition_map_embed_ctx *ctx = data;
|
||||||
|
struct grub_gpt_partentry gptdata;
|
||||||
|
grub_partition_t p2;
|
||||||
|
|
||||||
|
p2 = disk->partition;
|
||||||
|
disk->partition = p->parent;
|
||||||
|
if (grub_disk_read (disk, p->offset, p->index,
|
||||||
|
sizeof (gptdata), &gptdata))
|
||||||
|
{
|
||||||
|
disk->partition = p2;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
disk->partition = p2;
|
||||||
|
|
||||||
|
/* If there's an embed region, it is in a dedicated partition. */
|
||||||
|
if (! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_bios_boot, 16))
|
||||||
|
{
|
||||||
|
ctx->start = p->start;
|
||||||
|
ctx->len = p->len;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
|
||||||
|
unsigned int max_nsectors,
|
||||||
|
grub_embed_type_t embed_type,
|
||||||
|
grub_disk_addr_t **sectors)
|
||||||
|
{
|
||||||
|
struct gpt_partition_map_embed_ctx ctx = {
|
||||||
|
.start = 0,
|
||||||
|
.len = 0
|
||||||
|
};
|
||||||
|
unsigned i;
|
||||||
|
grub_err_t err;
|
||||||
|
|
||||||
|
if (embed_type != GRUB_EMBED_PCBIOS)
|
||||||
|
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||||
|
"GPT currently supports only PC-BIOS embedding");
|
||||||
|
|
||||||
|
err = grub_gpt_partition_map_iterate (disk, find_usable_region, &ctx);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
if (ctx.len == 0)
|
||||||
|
return grub_error (GRUB_ERR_FILE_NOT_FOUND,
|
||||||
|
N_("this GPT partition label contains no BIOS Boot Partition;"
|
||||||
|
" embedding won't be possible"));
|
||||||
|
|
||||||
|
if (ctx.len < *nsectors)
|
||||||
|
return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||||
|
N_("your BIOS Boot Partition is too small;"
|
||||||
|
" embedding won't be possible"));
|
||||||
|
|
||||||
|
*nsectors = ctx.len;
|
||||||
|
if (*nsectors > max_nsectors)
|
||||||
|
*nsectors = max_nsectors;
|
||||||
|
*sectors = grub_malloc (*nsectors * sizeof (**sectors));
|
||||||
|
if (!*sectors)
|
||||||
|
return grub_errno;
|
||||||
|
for (i = 0; i < *nsectors; i++)
|
||||||
|
(*sectors)[i] = ctx.start + i;
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Partition map type. */
|
||||||
|
static struct grub_partition_map grub_gpt_partition_map =
|
||||||
|
{
|
||||||
|
.name = "gpt",
|
||||||
|
.iterate = grub_gpt_partition_map_iterate,
|
||||||
|
#ifdef GRUB_UTIL
|
||||||
|
.embed = gpt_partition_map_embed
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(part_gpt)
|
||||||
|
{
|
||||||
|
grub_partition_map_register (&grub_gpt_partition_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(part_gpt)
|
||||||
|
{
|
||||||
|
grub_partition_map_unregister (&grub_gpt_partition_map);
|
||||||
|
}
|
||||||
113
GRUB2/MOD_SRC/grub-2.04/grub-core/script/function.c
Normal file
113
GRUB2/MOD_SRC/grub-2.04/grub-core/script/function.c
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2005,2007,2009,2010 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/script_sh.h>
|
||||||
|
#include <grub/parser.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/charset.h>
|
||||||
|
|
||||||
|
grub_script_function_t grub_script_function_list;
|
||||||
|
|
||||||
|
grub_script_function_t
|
||||||
|
grub_script_function_create (struct grub_script_arg *functionname_arg,
|
||||||
|
struct grub_script *cmd)
|
||||||
|
{
|
||||||
|
grub_script_function_t func;
|
||||||
|
grub_script_function_t *p;
|
||||||
|
|
||||||
|
func = (grub_script_function_t) grub_malloc (sizeof (*func));
|
||||||
|
if (! func)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
func->name = grub_strdup (functionname_arg->str);
|
||||||
|
if (! func->name)
|
||||||
|
{
|
||||||
|
grub_free (func);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
func->func = cmd;
|
||||||
|
|
||||||
|
/* Keep the list sorted for simplicity. */
|
||||||
|
p = &grub_script_function_list;
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
if (grub_strcmp ((*p)->name, func->name) >= 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
p = &((*p)->next);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the function already exists, overwrite the old function. */
|
||||||
|
if (*p && grub_strcmp ((*p)->name, func->name) == 0)
|
||||||
|
{
|
||||||
|
grub_script_function_t q;
|
||||||
|
|
||||||
|
q = *p;
|
||||||
|
grub_script_free (q->func);
|
||||||
|
q->func = cmd;
|
||||||
|
grub_free (func);
|
||||||
|
func = q;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
func->next = *p;
|
||||||
|
*p = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_script_function_remove (const char *name)
|
||||||
|
{
|
||||||
|
grub_script_function_t *p, q;
|
||||||
|
|
||||||
|
for (p = &grub_script_function_list, q = *p; q; p = &(q->next), q = q->next)
|
||||||
|
if (grub_strcmp (name, q->name) == 0)
|
||||||
|
{
|
||||||
|
*p = q->next;
|
||||||
|
grub_free (q->name);
|
||||||
|
grub_script_free (q->func);
|
||||||
|
grub_free (q);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_script_function_t
|
||||||
|
grub_script_function_find (char *functionname)
|
||||||
|
{
|
||||||
|
grub_script_function_t func;
|
||||||
|
|
||||||
|
for (func = grub_script_function_list; func; func = func->next)
|
||||||
|
if (grub_strcmp (functionname, func->name) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (! func)
|
||||||
|
{
|
||||||
|
char tmp[64];
|
||||||
|
grub_strncpy (tmp, functionname, 63);
|
||||||
|
tmp[63] = 0;
|
||||||
|
/* Avoid truncating inside UTF-8 character. */
|
||||||
|
tmp[grub_getend (tmp, tmp + grub_strlen (tmp))] = 0;
|
||||||
|
grub_error (GRUB_ERR_UNKNOWN_COMMAND, N_("can't find command `%s'"), tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return func;
|
||||||
|
}
|
||||||
795
GRUB2/MOD_SRC/grub-2.04/grub-core/term/keyboard_layout.c
Normal file
795
GRUB2/MOD_SRC/grub-2.04/grub-core/term/keyboard_layout.c
Normal file
@@ -0,0 +1,795 @@
|
|||||||
|
|
||||||
|
#define ventoy_keyboard_set_layout(name) if (grub_strcmp(layout, #name) == 0) return ventoy_keyboard_layout_##name()
|
||||||
|
|
||||||
|
static void ventoy_keyboard_layout_QWERTY_USA(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_disable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_AZERTY(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("a", "q");
|
||||||
|
grub_keymap_add_by_string("A", "Q");
|
||||||
|
grub_keymap_add_by_string("z", "w");
|
||||||
|
grub_keymap_add_by_string("Z", "W");
|
||||||
|
grub_keymap_add_by_string("q", "a");
|
||||||
|
grub_keymap_add_by_string("Q", "A");
|
||||||
|
grub_keymap_add_by_string("m", "semicolon");
|
||||||
|
grub_keymap_add_by_string("M", "colon");
|
||||||
|
grub_keymap_add_by_string("w", "z");
|
||||||
|
grub_keymap_add_by_string("W", "Z");
|
||||||
|
grub_keymap_add_by_string("comma", "m");
|
||||||
|
grub_keymap_add_by_string("question", "M");
|
||||||
|
grub_keymap_add_by_string("semicolon", "comma");
|
||||||
|
grub_keymap_add_by_string("period", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "period");
|
||||||
|
grub_keymap_add_by_string("slash", "greater");
|
||||||
|
grub_keymap_add_by_string("exclam", "slash");
|
||||||
|
grub_keymap_add_by_string("dollar", "bracketright");
|
||||||
|
grub_keymap_add_by_string("asterisk", "backslash");
|
||||||
|
grub_keymap_add_by_string("percent", "doublequote");
|
||||||
|
grub_keymap_add_by_string("ampersand", "1");
|
||||||
|
grub_keymap_add_by_string("1", "exclam");
|
||||||
|
grub_keymap_add_by_string("tilde", "2");
|
||||||
|
grub_keymap_add_by_string("2", "at");
|
||||||
|
grub_keymap_add_by_string("doublequote", "3");
|
||||||
|
grub_keymap_add_by_string("3", "numbersign");
|
||||||
|
grub_keymap_add_by_string("quote", "4");
|
||||||
|
grub_keymap_add_by_string("4", "dollar");
|
||||||
|
grub_keymap_add_by_string("parenleft", "5");
|
||||||
|
grub_keymap_add_by_string("5", "percent");
|
||||||
|
grub_keymap_add_by_string("minus", "6");
|
||||||
|
grub_keymap_add_by_string("6", "caret");
|
||||||
|
grub_keymap_add_by_string("backquote", "7");
|
||||||
|
grub_keymap_add_by_string("7", "ampersand");
|
||||||
|
grub_keymap_add_by_string("underscore", "8");
|
||||||
|
grub_keymap_add_by_string("8", "asterisk");
|
||||||
|
grub_keymap_add_by_string("caret", "9");
|
||||||
|
grub_keymap_add_by_string("9", "parenleft");
|
||||||
|
grub_keymap_add_by_string("at", "0");
|
||||||
|
grub_keymap_add_by_string("0", "parenright");
|
||||||
|
grub_keymap_add_by_string("parenright", "minus");
|
||||||
|
grub_keymap_add_by_string("less", "backquote");
|
||||||
|
grub_keymap_add_by_string("greater", "tilde");
|
||||||
|
grub_keymap_add_by_string("numbersign", "braceright");
|
||||||
|
grub_keymap_add_by_string("backslash", "question");
|
||||||
|
grub_keymap_add_by_string("bracketright", "braceleft");
|
||||||
|
grub_keymap_add_by_string("braceleft", "quote");
|
||||||
|
grub_keymap_add_by_string("braceright", "underscore");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_CZECH_QWERTY(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("semicolon", "backquote");
|
||||||
|
grub_keymap_add_by_string("plus", "1");
|
||||||
|
grub_keymap_add_by_string("equal", "minus");
|
||||||
|
grub_keymap_add_by_string("quote", "equal");
|
||||||
|
grub_keymap_add_by_string("parenright", "bracketright");
|
||||||
|
grub_keymap_add_by_string("doublequote", "backslash");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("1", "exclam");
|
||||||
|
grub_keymap_add_by_string("2", "at");
|
||||||
|
grub_keymap_add_by_string("3", "numbersign");
|
||||||
|
grub_keymap_add_by_string("4", "dollar");
|
||||||
|
grub_keymap_add_by_string("5", "percent");
|
||||||
|
grub_keymap_add_by_string("6", "caret");
|
||||||
|
grub_keymap_add_by_string("7", "ampersand");
|
||||||
|
grub_keymap_add_by_string("8", "asterisk");
|
||||||
|
grub_keymap_add_by_string("9", "parenleft");
|
||||||
|
grub_keymap_add_by_string("0", "parenright");
|
||||||
|
grub_keymap_add_by_string("percent", "underscore");
|
||||||
|
grub_keymap_add_by_string("slash", "braceleft");
|
||||||
|
grub_keymap_add_by_string("parenleft", "braceright");
|
||||||
|
grub_keymap_add_by_string("doublequote", "colon");
|
||||||
|
grub_keymap_add_by_string("exclam", "doublequote");
|
||||||
|
grub_keymap_add_by_string("quote", "bar");
|
||||||
|
grub_keymap_add_by_string("question", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("backquote", "Abackquote");
|
||||||
|
grub_keymap_add_by_string("exclam", "A1");
|
||||||
|
grub_keymap_add_by_string("at", "A2");
|
||||||
|
grub_keymap_add_by_string("numbersign", "A3");
|
||||||
|
grub_keymap_add_by_string("dollar", "A4");
|
||||||
|
grub_keymap_add_by_string("percent", "A5");
|
||||||
|
grub_keymap_add_by_string("caret", "A6");
|
||||||
|
grub_keymap_add_by_string("ampersand", "A7");
|
||||||
|
grub_keymap_add_by_string("asterisk", "A8");
|
||||||
|
grub_keymap_add_by_string("parenleft", "A9");
|
||||||
|
grub_keymap_add_by_string("parenright", "A0");
|
||||||
|
grub_keymap_add_by_string("minus", "Aminus");
|
||||||
|
grub_keymap_add_by_string("equal", "Aequal");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "Abracketleft");
|
||||||
|
grub_keymap_add_by_string("bracketright", "Abracketright");
|
||||||
|
grub_keymap_add_by_string("semicolon", "Asemicolon");
|
||||||
|
grub_keymap_add_by_string("backslash", "Abackslash");
|
||||||
|
grub_keymap_add_by_string("less", "Acomma");
|
||||||
|
grub_keymap_add_by_string("greater", "Aperiod");
|
||||||
|
grub_keymap_add_by_string("slash", "Aslash");
|
||||||
|
grub_keymap_add_by_string("tilde", "Atilde");
|
||||||
|
grub_keymap_add_by_string("underscore", "Aunderscore");
|
||||||
|
grub_keymap_add_by_string("plus", "Aplus");
|
||||||
|
grub_keymap_add_by_string("braceleft", "Abraceleft");
|
||||||
|
grub_keymap_add_by_string("braceright", "Abraceright");
|
||||||
|
grub_keymap_add_by_string("caret", "Adoublequote");
|
||||||
|
grub_keymap_add_by_string("colon", "Acolon");
|
||||||
|
grub_keymap_add_by_string("question", "Aquestion");
|
||||||
|
grub_keymap_add_by_string("bar", "Abar");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_CZECH_QWERTZ(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("y", "z");
|
||||||
|
grub_keymap_add_by_string("z", "y");
|
||||||
|
grub_keymap_add_by_string("Y", "Z");
|
||||||
|
grub_keymap_add_by_string("Z", "Y");
|
||||||
|
grub_keymap_add_by_string("semicolon", "backquote");
|
||||||
|
grub_keymap_add_by_string("plus", "1");
|
||||||
|
grub_keymap_add_by_string("equal", "minus");
|
||||||
|
grub_keymap_add_by_string("quote", "equal");
|
||||||
|
grub_keymap_add_by_string("parenright", "bracketright");
|
||||||
|
grub_keymap_add_by_string("doublequote", "backslash");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("1", "exclam");
|
||||||
|
grub_keymap_add_by_string("2", "at");
|
||||||
|
grub_keymap_add_by_string("3", "numbersign");
|
||||||
|
grub_keymap_add_by_string("4", "dollar");
|
||||||
|
grub_keymap_add_by_string("5", "percent");
|
||||||
|
grub_keymap_add_by_string("6", "caret");
|
||||||
|
grub_keymap_add_by_string("7", "ampersand");
|
||||||
|
grub_keymap_add_by_string("8", "asterisk");
|
||||||
|
grub_keymap_add_by_string("9", "parenleft");
|
||||||
|
grub_keymap_add_by_string("0", "parenright");
|
||||||
|
grub_keymap_add_by_string("percent", "underscore");
|
||||||
|
grub_keymap_add_by_string("slash", "braceleft");
|
||||||
|
grub_keymap_add_by_string("parenleft", "braceright");
|
||||||
|
grub_keymap_add_by_string("doublequote", "colon");
|
||||||
|
grub_keymap_add_by_string("exclam", "doublequote");
|
||||||
|
grub_keymap_add_by_string("quote", "bar");
|
||||||
|
grub_keymap_add_by_string("question", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("tilde", "A1");
|
||||||
|
grub_keymap_add_by_string("caret", "A3");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aq");
|
||||||
|
grub_keymap_add_by_string("bar", "Aw");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "Af");
|
||||||
|
grub_keymap_add_by_string("bracketright", "Ag");
|
||||||
|
grub_keymap_add_by_string("dollar", "Asemicolon");
|
||||||
|
grub_keymap_add_by_string("numbersign", "Ax");
|
||||||
|
grub_keymap_add_by_string("ampersand", "Ac");
|
||||||
|
grub_keymap_add_by_string("at", "Av");
|
||||||
|
grub_keymap_add_by_string("braceleft", "Ab");
|
||||||
|
grub_keymap_add_by_string("braceright", "An");
|
||||||
|
grub_keymap_add_by_string("less", "Acomma");
|
||||||
|
grub_keymap_add_by_string("greater", "Aperiod");
|
||||||
|
grub_keymap_add_by_string("asterisk", "Aslash");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_DANISH(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("plus", "minus");
|
||||||
|
grub_keymap_add_by_string("quote", "equal");
|
||||||
|
grub_keymap_add_by_string("doublequote", "bracketright");
|
||||||
|
grub_keymap_add_by_string("quote", "backslash");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("ampersand", "caret");
|
||||||
|
grub_keymap_add_by_string("slash", "ampersand");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("equal", "parenright");
|
||||||
|
grub_keymap_add_by_string("question", "underscore");
|
||||||
|
grub_keymap_add_by_string("caret", "braceright");
|
||||||
|
grub_keymap_add_by_string("asterisk", "bar");
|
||||||
|
grub_keymap_add_by_string("backquote", "plus");
|
||||||
|
grub_keymap_add_by_string("semicolon", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("bar", "Atilde");
|
||||||
|
grub_keymap_add_by_string("backslash", "Abackquote");
|
||||||
|
grub_keymap_add_by_string("greater", "tilde");
|
||||||
|
grub_keymap_add_by_string("at", "A2");
|
||||||
|
grub_keymap_add_by_string("dollar", "A4");
|
||||||
|
grub_keymap_add_by_string("braceleft", "A7");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "A8");
|
||||||
|
grub_keymap_add_by_string("bracketright", "A9");
|
||||||
|
grub_keymap_add_by_string("braceright", "A0");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aminus");
|
||||||
|
grub_keymap_add_by_string("less", "quote");
|
||||||
|
grub_keymap_add_by_string("greater", "doublequote");
|
||||||
|
grub_keymap_add_by_string("tilde", "Abracketright");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_DVORAK_USA(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("[", "minus");
|
||||||
|
grub_keymap_add_by_string("braceleft", "underscore");
|
||||||
|
grub_keymap_add_by_string("quote", "q");
|
||||||
|
grub_keymap_add_by_string("doublequote", "Q");
|
||||||
|
grub_keymap_add_by_string("comma", "w");
|
||||||
|
grub_keymap_add_by_string("less", "W");
|
||||||
|
grub_keymap_add_by_string("s", "semicolon");
|
||||||
|
grub_keymap_add_by_string("S", "colon");
|
||||||
|
grub_keymap_add_by_string("semicolon", "z");
|
||||||
|
grub_keymap_add_by_string("colon", "Z");
|
||||||
|
grub_keymap_add_by_string("w", "comma");
|
||||||
|
grub_keymap_add_by_string("W", "less");
|
||||||
|
grub_keymap_add_by_string("v", "period");
|
||||||
|
grub_keymap_add_by_string("z", "greater");
|
||||||
|
grub_keymap_add_by_string("z", "slash");
|
||||||
|
grub_keymap_add_by_string("equal", "bracketright");
|
||||||
|
grub_keymap_add_by_string("backslash", "backslash");
|
||||||
|
grub_keymap_add_by_string("underscore", "doublequote");
|
||||||
|
grub_keymap_add_by_string("quote", "q");
|
||||||
|
grub_keymap_add_by_string("doublequote", "Q");
|
||||||
|
grub_keymap_add_by_string("comma", "w");
|
||||||
|
grub_keymap_add_by_string("less", "W");
|
||||||
|
grub_keymap_add_by_string("period", "e");
|
||||||
|
grub_keymap_add_by_string("greater", "E");
|
||||||
|
grub_keymap_add_by_string("p", "r");
|
||||||
|
grub_keymap_add_by_string("P", "R");
|
||||||
|
grub_keymap_add_by_string("y", "t");
|
||||||
|
grub_keymap_add_by_string("Y", "T");
|
||||||
|
grub_keymap_add_by_string("f", "y");
|
||||||
|
grub_keymap_add_by_string("F", "Y");
|
||||||
|
grub_keymap_add_by_string("g", "u");
|
||||||
|
grub_keymap_add_by_string("G", "U");
|
||||||
|
grub_keymap_add_by_string("c", "c");
|
||||||
|
grub_keymap_add_by_string("C", "I");
|
||||||
|
grub_keymap_add_by_string("r", "o");
|
||||||
|
grub_keymap_add_by_string("R", "O");
|
||||||
|
grub_keymap_add_by_string("l", "p");
|
||||||
|
grub_keymap_add_by_string("L", "P");
|
||||||
|
grub_keymap_add_by_string("bracketright", "equal");
|
||||||
|
grub_keymap_add_by_string("braceright", "plus");
|
||||||
|
grub_keymap_add_by_string("a", "a");
|
||||||
|
grub_keymap_add_by_string("A", "A");
|
||||||
|
grub_keymap_add_by_string("o", "s");
|
||||||
|
grub_keymap_add_by_string("O", "S");
|
||||||
|
grub_keymap_add_by_string("e", "d");
|
||||||
|
grub_keymap_add_by_string("E", "D");
|
||||||
|
grub_keymap_add_by_string("u", "f");
|
||||||
|
grub_keymap_add_by_string("U", "F");
|
||||||
|
grub_keymap_add_by_string("i", "g");
|
||||||
|
grub_keymap_add_by_string("I", "G");
|
||||||
|
grub_keymap_add_by_string("d", "h");
|
||||||
|
grub_keymap_add_by_string("D", "H");
|
||||||
|
grub_keymap_add_by_string("h", "j");
|
||||||
|
grub_keymap_add_by_string("H", "J");
|
||||||
|
grub_keymap_add_by_string("t", "k");
|
||||||
|
grub_keymap_add_by_string("T", "K");
|
||||||
|
grub_keymap_add_by_string("n", "l");
|
||||||
|
grub_keymap_add_by_string("N", "L");
|
||||||
|
grub_keymap_add_by_string("s", "semicolon");
|
||||||
|
grub_keymap_add_by_string("S", "colon");
|
||||||
|
grub_keymap_add_by_string("minus", "quote");
|
||||||
|
grub_keymap_add_by_string("underscore", "doublequote");
|
||||||
|
grub_keymap_add_by_string("semicolon", "z");
|
||||||
|
grub_keymap_add_by_string("colon", "Z");
|
||||||
|
grub_keymap_add_by_string("q", "x");
|
||||||
|
grub_keymap_add_by_string("Q", "X");
|
||||||
|
grub_keymap_add_by_string("j", "c");
|
||||||
|
grub_keymap_add_by_string("J", "C");
|
||||||
|
grub_keymap_add_by_string("k", "v");
|
||||||
|
grub_keymap_add_by_string("K", "V");
|
||||||
|
grub_keymap_add_by_string("x", "b");
|
||||||
|
grub_keymap_add_by_string("X", "B");
|
||||||
|
grub_keymap_add_by_string("b", "n");
|
||||||
|
grub_keymap_add_by_string("B", "N");
|
||||||
|
grub_keymap_add_by_string("w", "comma");
|
||||||
|
grub_keymap_add_by_string("W", "less");
|
||||||
|
grub_keymap_add_by_string("v", "period");
|
||||||
|
grub_keymap_add_by_string("V", "greater");
|
||||||
|
grub_keymap_add_by_string("z", "slash");
|
||||||
|
grub_keymap_add_by_string("Z", "question");
|
||||||
|
grub_keymap_add_by_string("slash", "bracketleft");
|
||||||
|
grub_keymap_add_by_string("question", "braceleft");
|
||||||
|
grub_keymap_add_by_string("equal", "bracketright");
|
||||||
|
grub_keymap_add_by_string("plus", "braceright");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_FRENCH(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("less", "backquote");
|
||||||
|
grub_keymap_add_by_string("greater", "tilde");
|
||||||
|
grub_keymap_add_by_string("ampersand", "1");
|
||||||
|
grub_keymap_add_by_string("1", "exclam");
|
||||||
|
grub_keymap_add_by_string("tilde", "2");
|
||||||
|
grub_keymap_add_by_string("2", "at");
|
||||||
|
grub_keymap_add_by_string("doublequote", "3");
|
||||||
|
grub_keymap_add_by_string("3", "numbersign");
|
||||||
|
grub_keymap_add_by_string("quote", "4");
|
||||||
|
grub_keymap_add_by_string("4", "dollar");
|
||||||
|
grub_keymap_add_by_string("parenleft", "5");
|
||||||
|
grub_keymap_add_by_string("5", "percent");
|
||||||
|
grub_keymap_add_by_string("minus", "6");
|
||||||
|
grub_keymap_add_by_string("6", "caret");
|
||||||
|
grub_keymap_add_by_string("backquote", "7");
|
||||||
|
grub_keymap_add_by_string("7", "ampersand");
|
||||||
|
grub_keymap_add_by_string("underscore", "8");
|
||||||
|
grub_keymap_add_by_string("8", "asterisk");
|
||||||
|
grub_keymap_add_by_string("backslash", "9");
|
||||||
|
grub_keymap_add_by_string("9", "parenleft");
|
||||||
|
grub_keymap_add_by_string("at", "0");
|
||||||
|
grub_keymap_add_by_string("0", "parenright");
|
||||||
|
grub_keymap_add_by_string("parenright", "minus");
|
||||||
|
grub_keymap_add_by_string("numbersign", "underscore");
|
||||||
|
grub_keymap_add_by_string("a", "q");
|
||||||
|
grub_keymap_add_by_string("A", "Q");
|
||||||
|
grub_keymap_add_by_string("z", "w");
|
||||||
|
grub_keymap_add_by_string("Z", "W");
|
||||||
|
grub_keymap_add_by_string("caret", "bracketleft");
|
||||||
|
grub_keymap_add_by_string("dollar", "bracketright");
|
||||||
|
grub_keymap_add_by_string("q", "a");
|
||||||
|
grub_keymap_add_by_string("Q", "A");
|
||||||
|
grub_keymap_add_by_string("m", "semicolon");
|
||||||
|
grub_keymap_add_by_string("M", "colon");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "quote");
|
||||||
|
grub_keymap_add_by_string("percent", "doublequote");
|
||||||
|
grub_keymap_add_by_string("asterisk", "backslash");
|
||||||
|
grub_keymap_add_by_string("bracketright", "bar");
|
||||||
|
grub_keymap_add_by_string("w", "z");
|
||||||
|
grub_keymap_add_by_string("W", "Z");
|
||||||
|
grub_keymap_add_by_string("comma", "m");
|
||||||
|
grub_keymap_add_by_string("question", "M");
|
||||||
|
grub_keymap_add_by_string("semicolon", "comma");
|
||||||
|
grub_keymap_add_by_string("period", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "period");
|
||||||
|
grub_keymap_add_by_string("slash", "greater");
|
||||||
|
grub_keymap_add_by_string("exclam", "slash");
|
||||||
|
grub_keymap_add_by_string("bar", "question");
|
||||||
|
grub_keymap_add_by_string("tilde", "A2");
|
||||||
|
grub_keymap_add_by_string("numbersign", "A3");
|
||||||
|
grub_keymap_add_by_string("braceleft", "A4");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "A5");
|
||||||
|
grub_keymap_add_by_string("bar", "A6");
|
||||||
|
grub_keymap_add_by_string("quote", "A7");
|
||||||
|
grub_keymap_add_by_string("backslash", "A8");
|
||||||
|
grub_keymap_add_by_string("caret", "A9");
|
||||||
|
grub_keymap_add_by_string("at", "A0");
|
||||||
|
grub_keymap_add_by_string("bracketright", "Aminus");
|
||||||
|
grub_keymap_add_by_string("braceright", "Aequal");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_GERMAN(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("ampersand", "caret");
|
||||||
|
grub_keymap_add_by_string("slash", "ampersand");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("equal", "parenright");
|
||||||
|
grub_keymap_add_by_string("question", "underscore");
|
||||||
|
grub_keymap_add_by_string("backslash", "minus");
|
||||||
|
grub_keymap_add_by_string("z", "y");
|
||||||
|
grub_keymap_add_by_string("Z", "Y");
|
||||||
|
grub_keymap_add_by_string("y", "z");
|
||||||
|
grub_keymap_add_by_string("Y", "Z");
|
||||||
|
grub_keymap_add_by_string("plus", "bracketright");
|
||||||
|
grub_keymap_add_by_string("asterisk", "braceright");
|
||||||
|
grub_keymap_add_by_string("semicolon", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aminus");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("caret", "backquote");
|
||||||
|
grub_keymap_add_by_string("quote", "equal");
|
||||||
|
grub_keymap_add_by_string("backquote", "plus");
|
||||||
|
grub_keymap_add_by_string("braceright", "doublequote");
|
||||||
|
grub_keymap_add_by_string("bar", "bracketleft");
|
||||||
|
grub_keymap_add_by_string("at", "braceleft");
|
||||||
|
grub_keymap_add_by_string("numbersign", "backslash");
|
||||||
|
grub_keymap_add_by_string("at", "Aq");
|
||||||
|
grub_keymap_add_by_string("less", "backquote");
|
||||||
|
grub_keymap_add_by_string("greater", "tilde");
|
||||||
|
grub_keymap_add_by_string("braceleft", "A7");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "A8");
|
||||||
|
grub_keymap_add_by_string("bracketright", "A9");
|
||||||
|
grub_keymap_add_by_string("braceright", "A0");
|
||||||
|
grub_keymap_add_by_string("tilde", "Abracketright");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aminus");
|
||||||
|
grub_keymap_add_by_string("quote", "bar");
|
||||||
|
grub_keymap_add_by_string("greater", "semicolon");
|
||||||
|
grub_keymap_add_by_string("less", "colon");
|
||||||
|
grub_keymap_add_by_string("bar", "quote");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_ITALIANO(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("backslash", "backquote");
|
||||||
|
grub_keymap_add_by_string("bar", "tilde");
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("tilde", "numbersign");
|
||||||
|
grub_keymap_add_by_string("ampersand", "caret");
|
||||||
|
grub_keymap_add_by_string("slash", "ampersand");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("equal", "parenright");
|
||||||
|
grub_keymap_add_by_string("quote", "minus");
|
||||||
|
grub_keymap_add_by_string("question", "underscore");
|
||||||
|
grub_keymap_add_by_string("caret", "plus");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "bracketleft");
|
||||||
|
grub_keymap_add_by_string("bracketright", "braceleft");
|
||||||
|
grub_keymap_add_by_string("plus", "bracketright");
|
||||||
|
grub_keymap_add_by_string("asterisk", "braceright");
|
||||||
|
grub_keymap_add_by_string("at", "semicolon");
|
||||||
|
grub_keymap_add_by_string("braceleft", "colon");
|
||||||
|
grub_keymap_add_by_string("numbersign", "quote");
|
||||||
|
grub_keymap_add_by_string("braceright", "doublequote");
|
||||||
|
grub_keymap_add_by_string("less", "backslash");
|
||||||
|
grub_keymap_add_by_string("greater", "bar");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("semicolon", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "Abracketleft");
|
||||||
|
grub_keymap_add_by_string("bracketright", "Abracketright");
|
||||||
|
grub_keymap_add_by_string("at", "Asemicolon");
|
||||||
|
grub_keymap_add_by_string("numbersign", "Aquote");
|
||||||
|
grub_keymap_add_by_string("braceright", "Abraceright");
|
||||||
|
grub_keymap_add_by_string("braceleft", "Abraceleft");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_JAPAN_106(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("at", "bracketleft");
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("ampersand", "caret");
|
||||||
|
grub_keymap_add_by_string("quote", "ampersand");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("underscore", "parenright");
|
||||||
|
grub_keymap_add_by_string("equal", "underscore");
|
||||||
|
grub_keymap_add_by_string("plus", "colon");
|
||||||
|
grub_keymap_add_by_string("colon", "quote");
|
||||||
|
grub_keymap_add_by_string("asterisk", "doublequote");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "bracketright");
|
||||||
|
grub_keymap_add_by_string("braceleft", "braceright");
|
||||||
|
grub_keymap_add_by_string("bracketright", "backslash");
|
||||||
|
grub_keymap_add_by_string("braceright", "bar");
|
||||||
|
grub_keymap_add_by_string("backslash", "backquote");
|
||||||
|
grub_keymap_add_by_string("tilde", "plus");
|
||||||
|
grub_keymap_add_by_string("caret", "equal");
|
||||||
|
grub_keymap_add_by_string("backquote", "braceleft");
|
||||||
|
grub_keymap_add_by_string("bar", "tilde");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_LATIN_USA(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("bar", "backquote");
|
||||||
|
grub_keymap_add_by_string("quote", "minus");
|
||||||
|
grub_keymap_add_by_string("question", "underscore");
|
||||||
|
grub_keymap_add_by_string("backquote", "bracketleft");
|
||||||
|
grub_keymap_add_by_string("plus", "bracketright");
|
||||||
|
grub_keymap_add_by_string("braceleft", "quote");
|
||||||
|
grub_keymap_add_by_string("braceright", "backslash");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("ampersand", "caret");
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("slash", "ampersand");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("equal", "parenright");
|
||||||
|
grub_keymap_add_by_string("asterisk", "braceright");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "doublequote");
|
||||||
|
grub_keymap_add_by_string("bracketright", "bar");
|
||||||
|
grub_keymap_add_by_string("semicolon", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("caret", "Aquote");
|
||||||
|
grub_keymap_add_by_string("doublequote", "braceleft");
|
||||||
|
grub_keymap_add_by_string("at", "Aq");
|
||||||
|
grub_keymap_add_by_string("backquote", "Abackslash");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aminus");
|
||||||
|
grub_keymap_add_by_string("greater", "plus");
|
||||||
|
grub_keymap_add_by_string("less", "equal");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aminus");
|
||||||
|
grub_keymap_add_by_string("backquote", "Abackslash");
|
||||||
|
grub_keymap_add_by_string("tilde", "Abracketright");
|
||||||
|
grub_keymap_add_by_string("caret", "Aquote");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_PORTU_BRAZIL(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("quote", "backquote");
|
||||||
|
grub_keymap_add_by_string("quote", "bracketleft");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "bracketright");
|
||||||
|
grub_keymap_add_by_string("tilde", "quote");
|
||||||
|
grub_keymap_add_by_string("bracketright", "backslash");
|
||||||
|
grub_keymap_add_by_string("semicolon", "slash");
|
||||||
|
grub_keymap_add_by_string("bar", "colon");
|
||||||
|
grub_keymap_add_by_string("doublequote", "tilde");
|
||||||
|
grub_keymap_add_by_string("backquote", "braceleft");
|
||||||
|
grub_keymap_add_by_string("braceleft", "braceright");
|
||||||
|
grub_keymap_add_by_string("caret", "doublequote");
|
||||||
|
grub_keymap_add_by_string("braceright", "bar");
|
||||||
|
grub_keymap_add_by_string("colon", "question");
|
||||||
|
grub_keymap_add_by_string("backslash", "semicolon");
|
||||||
|
grub_keymap_add_by_string("bar", "Atilde");
|
||||||
|
grub_keymap_add_by_string("backslash", "Abackquote");
|
||||||
|
grub_keymap_add_by_string("slash", "Aq");
|
||||||
|
grub_keymap_add_by_string("question", "Aw");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_QWERTY_UK(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("at", "doublequote");
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("tilde", "bar");
|
||||||
|
grub_keymap_add_by_string("numbersign", "backslash");
|
||||||
|
grub_keymap_add_by_string("backslash", "numbersign");
|
||||||
|
grub_keymap_add_by_string("bar", "tilde");
|
||||||
|
grub_keymap_add_by_string("backslash", "Atilde");
|
||||||
|
grub_keymap_add_by_string("backslash", "Abackquote");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_QWERTZ(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("ampersand", "percent");
|
||||||
|
grub_keymap_add_by_string("slash", "ampersand");
|
||||||
|
grub_keymap_add_by_string("equal", "parenright");
|
||||||
|
grub_keymap_add_by_string("question", "underscore");
|
||||||
|
grub_keymap_add_by_string("backslash", "minus");
|
||||||
|
grub_keymap_add_by_string("z", "y");
|
||||||
|
grub_keymap_add_by_string("Z", "Y");
|
||||||
|
grub_keymap_add_by_string("y", "z");
|
||||||
|
grub_keymap_add_by_string("Y", "Z");
|
||||||
|
grub_keymap_add_by_string("plus", "bracketright");
|
||||||
|
grub_keymap_add_by_string("asterisk", "braceright");
|
||||||
|
grub_keymap_add_by_string("semicolon", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("caret", "backquote");
|
||||||
|
grub_keymap_add_by_string("backquote", "equal");
|
||||||
|
grub_keymap_add_by_string("numbersign", "backslash");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("percent", "caret");
|
||||||
|
grub_keymap_add_by_string("less", "numbersign");
|
||||||
|
grub_keymap_add_by_string("greater", "bar");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_QWERTZ_HUN(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("y", "z");
|
||||||
|
grub_keymap_add_by_string("z", "y");
|
||||||
|
grub_keymap_add_by_string("Y", "Z");
|
||||||
|
grub_keymap_add_by_string("Z", "Y");
|
||||||
|
grub_keymap_add_by_string("0", "backquote");
|
||||||
|
grub_keymap_add_by_string("quote", "exclam");
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("plus", "numbersign");
|
||||||
|
grub_keymap_add_by_string("exclam", "dollar");
|
||||||
|
grub_keymap_add_by_string("slash", "caret");
|
||||||
|
grub_keymap_add_by_string("equal", "ampersand");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aq");
|
||||||
|
grub_keymap_add_by_string("bar", "Aw");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "Af");
|
||||||
|
grub_keymap_add_by_string("bracketright", "Ag");
|
||||||
|
grub_keymap_add_by_string("greater", "Az");
|
||||||
|
grub_keymap_add_by_string("numbersign", "Ax");
|
||||||
|
grub_keymap_add_by_string("ampersand", "Ac");
|
||||||
|
grub_keymap_add_by_string("at", "Av");
|
||||||
|
grub_keymap_add_by_string("braceleft", "Ab");
|
||||||
|
grub_keymap_add_by_string("braceright", "An");
|
||||||
|
grub_keymap_add_by_string("less", "Am");
|
||||||
|
grub_keymap_add_by_string("dollar", "colon");
|
||||||
|
grub_keymap_add_by_string("question", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("at", "doublequote");
|
||||||
|
grub_keymap_add_by_string("tilde", "A1");
|
||||||
|
grub_keymap_add_by_string("caret", "A3");
|
||||||
|
grub_keymap_add_by_string("backquote", "A7");
|
||||||
|
grub_keymap_add_by_string("asterisk", "0");
|
||||||
|
grub_keymap_add_by_string("dollar", "Asemicolon");
|
||||||
|
grub_keymap_add_by_string("semicolon", "Acomma");
|
||||||
|
grub_keymap_add_by_string("greater", "Aperiod");
|
||||||
|
grub_keymap_add_by_string("asterisk", "Aslash");
|
||||||
|
grub_keymap_add_by_string("backquote", "A9");
|
||||||
|
grub_keymap_add_by_string("doublequote", "A0");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_QWERTZ_SLOV_CROAT(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("quote", "minus");
|
||||||
|
grub_keymap_add_by_string("plus", "equal");
|
||||||
|
grub_keymap_add_by_string("y", "z");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("doublequote", "tilde");
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("ampersand", "caret");
|
||||||
|
grub_keymap_add_by_string("slash", "ampersand");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("equal", "parenright");
|
||||||
|
grub_keymap_add_by_string("question", "underscore");
|
||||||
|
grub_keymap_add_by_string("asterisk", "plus");
|
||||||
|
grub_keymap_add_by_string("Y", "Z");
|
||||||
|
grub_keymap_add_by_string("semicolon", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("tilde", "A1");
|
||||||
|
grub_keymap_add_by_string("caret", "A3");
|
||||||
|
grub_keymap_add_by_string("backquote", "A7");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aq");
|
||||||
|
grub_keymap_add_by_string("bar", "Aw");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "Af");
|
||||||
|
grub_keymap_add_by_string("bracketright", "Ag");
|
||||||
|
grub_keymap_add_by_string("at", "Av");
|
||||||
|
grub_keymap_add_by_string("braceleft", "Ab");
|
||||||
|
grub_keymap_add_by_string("braceright", "An");
|
||||||
|
grub_keymap_add_by_string("less", "Acomma");
|
||||||
|
grub_keymap_add_by_string("greater", "Aperiod");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_SPANISH(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("slash", "ampersand");
|
||||||
|
grub_keymap_add_by_string("ampersand", "caret");
|
||||||
|
grub_keymap_add_by_string("caret", "braceleft");
|
||||||
|
grub_keymap_add_by_string("asterisk", "braceright");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("equal", "parenright");
|
||||||
|
grub_keymap_add_by_string("quote", "minus");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("question", "underscore");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("greater", "bar");
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("backslash", "backquote");
|
||||||
|
grub_keymap_add_by_string("less", "backslash");
|
||||||
|
grub_keymap_add_by_string("semicolon", "less");
|
||||||
|
grub_keymap_add_by_string("backquote", "bracketleft");
|
||||||
|
grub_keymap_add_by_string("plus", "bracketright");
|
||||||
|
grub_keymap_add_by_string("plus", "colon");
|
||||||
|
grub_keymap_add_by_string("at", "semicolon");
|
||||||
|
grub_keymap_add_by_string("bar", "A1");
|
||||||
|
grub_keymap_add_by_string("at", "A2");
|
||||||
|
grub_keymap_add_by_string("numbersign", "A3");
|
||||||
|
grub_keymap_add_by_string("tilde", "A4");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "Abracketleft");
|
||||||
|
grub_keymap_add_by_string("bracketright", "Abracketright");
|
||||||
|
grub_keymap_add_by_string("braceleft", "Aquote");
|
||||||
|
grub_keymap_add_by_string("braceright", "Abackslash");
|
||||||
|
grub_keymap_add_by_string("greater", "bar");
|
||||||
|
grub_keymap_add_by_string("less", "backslash");
|
||||||
|
grub_keymap_add_by_string("backslash", "Abackquote");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_SWEDISH(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("plus", "minus");
|
||||||
|
grub_keymap_add_by_string("quote", "equal");
|
||||||
|
grub_keymap_add_by_string("doublequote", "bracketright");
|
||||||
|
grub_keymap_add_by_string("quote", "backslash");
|
||||||
|
grub_keymap_add_by_string("minus", "slash");
|
||||||
|
grub_keymap_add_by_string("doublequote", "at");
|
||||||
|
grub_keymap_add_by_string("ampersand", "caret");
|
||||||
|
grub_keymap_add_by_string("slash", "ampersand");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("equal", "parenright");
|
||||||
|
grub_keymap_add_by_string("question", "underscore");
|
||||||
|
grub_keymap_add_by_string("caret", "braceright");
|
||||||
|
grub_keymap_add_by_string("asterisk", "bar");
|
||||||
|
grub_keymap_add_by_string("backquote", "plus");
|
||||||
|
grub_keymap_add_by_string("semicolon", "less");
|
||||||
|
grub_keymap_add_by_string("colon", "greater");
|
||||||
|
grub_keymap_add_by_string("underscore", "question");
|
||||||
|
grub_keymap_add_by_string("bar", "Atilde");
|
||||||
|
grub_keymap_add_by_string("backslash", "Abackquote");
|
||||||
|
grub_keymap_add_by_string("greater", "tilde");
|
||||||
|
grub_keymap_add_by_string("at", "A2");
|
||||||
|
grub_keymap_add_by_string("dollar", "A4");
|
||||||
|
grub_keymap_add_by_string("braceleft", "A7");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "A8");
|
||||||
|
grub_keymap_add_by_string("bracketright", "A9");
|
||||||
|
grub_keymap_add_by_string("braceright", "A0");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aminus");
|
||||||
|
grub_keymap_add_by_string("less", "quote");
|
||||||
|
grub_keymap_add_by_string("greater", "doublequote");
|
||||||
|
grub_keymap_add_by_string("tilde", "Abracketright");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_TURKISH_Q(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("doublequote", "backquote");
|
||||||
|
grub_keymap_add_by_string("asterisk", "minus");
|
||||||
|
grub_keymap_add_by_string("minus", "equal");
|
||||||
|
grub_keymap_add_by_string("comma", "backslash");
|
||||||
|
grub_keymap_add_by_string("period", "slash");
|
||||||
|
grub_keymap_add_by_string("quote", "at");
|
||||||
|
grub_keymap_add_by_string("caret", "numbersign");
|
||||||
|
grub_keymap_add_by_string("plus", "dollar");
|
||||||
|
grub_keymap_add_by_string("ampersand", "caret");
|
||||||
|
grub_keymap_add_by_string("slash", "ampersand");
|
||||||
|
grub_keymap_add_by_string("parenleft", "asterisk");
|
||||||
|
grub_keymap_add_by_string("parenright", "parenleft");
|
||||||
|
grub_keymap_add_by_string("equal", "parenright");
|
||||||
|
grub_keymap_add_by_string("question", "underscore");
|
||||||
|
grub_keymap_add_by_string("underscore", "plus");
|
||||||
|
grub_keymap_add_by_string("semicolon", "bar");
|
||||||
|
grub_keymap_add_by_string("colon", "question");
|
||||||
|
grub_keymap_add_by_string("less", "Abackquote");
|
||||||
|
grub_keymap_add_by_string("greater", "A1");
|
||||||
|
grub_keymap_add_by_string("numbersign", "A3");
|
||||||
|
grub_keymap_add_by_string("dollar", "A4");
|
||||||
|
grub_keymap_add_by_string("braceleft", "A7");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "A8");
|
||||||
|
grub_keymap_add_by_string("bracketright", "A9");
|
||||||
|
grub_keymap_add_by_string("braceright", "A0");
|
||||||
|
grub_keymap_add_by_string("backslash", "Aminus");
|
||||||
|
grub_keymap_add_by_string("bar", "Aequal");
|
||||||
|
grub_keymap_add_by_string("at", "Aq");
|
||||||
|
grub_keymap_add_by_string("doublequote", "Abracketleft");
|
||||||
|
grub_keymap_add_by_string("tilde", "Abracketright");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
static void ventoy_keyboard_layout_VIETNAMESE(void) {
|
||||||
|
grub_keymap_reset();
|
||||||
|
grub_keymap_add_by_string("exclam", "A1");
|
||||||
|
grub_keymap_add_by_string("at", "A2");
|
||||||
|
grub_keymap_add_by_string("numbersign", "A3");
|
||||||
|
grub_keymap_add_by_string("dollar", "A4");
|
||||||
|
grub_keymap_add_by_string("percent", "A5");
|
||||||
|
grub_keymap_add_by_string("caret", "A6");
|
||||||
|
grub_keymap_add_by_string("ampersand", "A7");
|
||||||
|
grub_keymap_add_by_string("asterisk", "A8");
|
||||||
|
grub_keymap_add_by_string("parenleft", "A9");
|
||||||
|
grub_keymap_add_by_string("parenright", "A0");
|
||||||
|
grub_keymap_add_by_string("plus", "Aplus");
|
||||||
|
grub_keymap_add_by_string("equal", "Aequal");
|
||||||
|
grub_keymap_add_by_string("braceleft", "Abraceleft");
|
||||||
|
grub_keymap_add_by_string("braceright", "Abraceright");
|
||||||
|
grub_keymap_add_by_string("colon", "Acolon");
|
||||||
|
grub_keymap_add_by_string("semicolon", "Asemicolon");
|
||||||
|
grub_keymap_add_by_string("quote", "Aquote");
|
||||||
|
grub_keymap_add_by_string("backslash", "Abackslash");
|
||||||
|
grub_keymap_add_by_string("less", "Aless");
|
||||||
|
grub_keymap_add_by_string("greater", "Agreater");
|
||||||
|
grub_keymap_add_by_string("comma", "Acomma");
|
||||||
|
grub_keymap_add_by_string("period", "Aperiod");
|
||||||
|
grub_keymap_add_by_string("question", "Aquestion");
|
||||||
|
grub_keymap_add_by_string("slash", "Aslash");
|
||||||
|
grub_keymap_add_by_string("tilde", "Atilde");
|
||||||
|
grub_keymap_add_by_string("backquote", "Abackquote");
|
||||||
|
grub_keymap_add_by_string("bracketright", "Abracketright");
|
||||||
|
grub_keymap_add_by_string("bracketleft", "Abracketleft");
|
||||||
|
grub_keymap_add_by_string("bar", "Abar");
|
||||||
|
grub_keymap_add_by_string("doublequote", "Adoublequote");
|
||||||
|
grub_keymap_add_by_string("colon", "Acolon");
|
||||||
|
grub_keymap_add_by_string("minus", "Aminus");
|
||||||
|
grub_keymap_add_by_string("underscore", "Aunderscore");
|
||||||
|
grub_keymap_enable();
|
||||||
|
}
|
||||||
|
void ventoy_set_keyboard_layout(const char *layout);
|
||||||
|
void ventoy_set_keyboard_layout(const char *layout) {
|
||||||
|
ventoy_keyboard_set_layout(QWERTY_USA);
|
||||||
|
ventoy_keyboard_set_layout(AZERTY);
|
||||||
|
ventoy_keyboard_set_layout(CZECH_QWERTY);
|
||||||
|
ventoy_keyboard_set_layout(CZECH_QWERTZ);
|
||||||
|
ventoy_keyboard_set_layout(DANISH);
|
||||||
|
ventoy_keyboard_set_layout(DVORAK_USA);
|
||||||
|
ventoy_keyboard_set_layout(FRENCH);
|
||||||
|
ventoy_keyboard_set_layout(GERMAN);
|
||||||
|
ventoy_keyboard_set_layout(ITALIANO);
|
||||||
|
ventoy_keyboard_set_layout(JAPAN_106);
|
||||||
|
ventoy_keyboard_set_layout(LATIN_USA);
|
||||||
|
ventoy_keyboard_set_layout(PORTU_BRAZIL);
|
||||||
|
ventoy_keyboard_set_layout(QWERTY_UK);
|
||||||
|
ventoy_keyboard_set_layout(QWERTZ);
|
||||||
|
ventoy_keyboard_set_layout(QWERTZ_HUN);
|
||||||
|
ventoy_keyboard_set_layout(QWERTZ_SLOV_CROAT);
|
||||||
|
ventoy_keyboard_set_layout(SPANISH);
|
||||||
|
ventoy_keyboard_set_layout(SWEDISH);
|
||||||
|
ventoy_keyboard_set_layout(TURKISH_Q);
|
||||||
|
ventoy_keyboard_set_layout(VIETNAMESE);
|
||||||
|
}
|
||||||
463
GRUB2/MOD_SRC/grub-2.04/grub-core/term/serial.c
Normal file
463
GRUB2/MOD_SRC/grub-2.04/grub-core/term/serial.c
Normal file
@@ -0,0 +1,463 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2000,2001,2002,2003,2004,2005,2007,2008,2009,2010 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/serial.h>
|
||||||
|
#include <grub/term.h>
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/terminfo.h>
|
||||||
|
#if !defined (GRUB_MACHINE_EMU) && ((defined(__mips__) && _MIPS_SIM != _ABI64) || defined (__i386__) || defined (__x86_64__))
|
||||||
|
#include <grub/cpu/io.h>
|
||||||
|
#endif
|
||||||
|
#include <grub/extcmd.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/list.h>
|
||||||
|
#ifdef GRUB_MACHINE_MIPS_LOONGSON
|
||||||
|
#include <grub/machine/kernel.h>
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_IEEE1275
|
||||||
|
#include <grub/ieee1275/console.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
#define FOR_SERIAL_PORTS(var) FOR_LIST_ELEMENTS((var), (grub_serial_ports))
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
OPTION_UNIT,
|
||||||
|
OPTION_PORT,
|
||||||
|
OPTION_SPEED,
|
||||||
|
OPTION_WORD,
|
||||||
|
OPTION_PARITY,
|
||||||
|
OPTION_STOP,
|
||||||
|
OPTION_BASE_CLOCK,
|
||||||
|
OPTION_RTSCTS
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Argument options. */
|
||||||
|
static const struct grub_arg_option options[] =
|
||||||
|
{
|
||||||
|
{"unit", 'u', 0, N_("Set the serial unit."), 0, ARG_TYPE_INT},
|
||||||
|
{"port", 'p', 0, N_("Set the serial port address."), 0, ARG_TYPE_STRING},
|
||||||
|
{"speed", 's', 0, N_("Set the serial port speed."), 0, ARG_TYPE_INT},
|
||||||
|
{"word", 'w', 0, N_("Set the serial port word length."), 0, ARG_TYPE_INT},
|
||||||
|
{"parity", 'r', 0, N_("Set the serial port parity."), 0, ARG_TYPE_STRING},
|
||||||
|
{"stop", 't', 0, N_("Set the serial port stop bits."), 0, ARG_TYPE_INT},
|
||||||
|
{"base-clock", 'b', 0, N_("Set the base frequency."), 0, ARG_TYPE_STRING},
|
||||||
|
{"rtscts", 'f', 0, N_("Enable/disable RTS/CTS."), "on|off", ARG_TYPE_STRING},
|
||||||
|
{0, 0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct grub_serial_port *grub_serial_ports;
|
||||||
|
|
||||||
|
struct grub_serial_output_state
|
||||||
|
{
|
||||||
|
struct grub_terminfo_output_state tinfo;
|
||||||
|
struct grub_serial_port *port;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct grub_serial_input_state
|
||||||
|
{
|
||||||
|
struct grub_terminfo_input_state tinfo;
|
||||||
|
struct grub_serial_port *port;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
serial_put (grub_term_output_t term, const int c)
|
||||||
|
{
|
||||||
|
struct grub_serial_output_state *data = term->data;
|
||||||
|
data->port->driver->put (data->port, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
serial_fetch (grub_term_input_t term)
|
||||||
|
{
|
||||||
|
struct grub_serial_input_state *data = term->data;
|
||||||
|
return data->port->driver->fetch (data->port);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct grub_serial_input_state grub_serial_terminfo_input_template =
|
||||||
|
{
|
||||||
|
.tinfo =
|
||||||
|
{
|
||||||
|
.readkey = serial_fetch
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct grub_serial_output_state grub_serial_terminfo_output_template =
|
||||||
|
{
|
||||||
|
.tinfo =
|
||||||
|
{
|
||||||
|
.put = serial_put,
|
||||||
|
.size = { 80, 24 }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct grub_serial_input_state grub_serial_terminfo_input;
|
||||||
|
|
||||||
|
static struct grub_serial_output_state grub_serial_terminfo_output;
|
||||||
|
|
||||||
|
static int registered = 0;
|
||||||
|
|
||||||
|
static struct grub_term_input grub_serial_term_input =
|
||||||
|
{
|
||||||
|
.name = "serial",
|
||||||
|
.init = grub_terminfo_input_init,
|
||||||
|
.getkey = grub_terminfo_getkey,
|
||||||
|
.data = &grub_serial_terminfo_input
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct grub_term_output grub_serial_term_output =
|
||||||
|
{
|
||||||
|
.name = "serial",
|
||||||
|
.init = grub_terminfo_output_init,
|
||||||
|
.putchar = grub_terminfo_putchar,
|
||||||
|
.getwh = grub_terminfo_getwh,
|
||||||
|
.getxy = grub_terminfo_getxy,
|
||||||
|
.gotoxy = grub_terminfo_gotoxy,
|
||||||
|
.cls = grub_terminfo_cls,
|
||||||
|
.setcolorstate = grub_terminfo_setcolorstate,
|
||||||
|
.setcursor = grub_terminfo_setcursor,
|
||||||
|
.flags = GRUB_TERM_CODE_TYPE_ASCII,
|
||||||
|
.data = &grub_serial_terminfo_output,
|
||||||
|
.progress_update_divisor = GRUB_PROGRESS_SLOW
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct grub_serial_port *
|
||||||
|
grub_serial_find (const char *name)
|
||||||
|
{
|
||||||
|
struct grub_serial_port *port;
|
||||||
|
|
||||||
|
FOR_SERIAL_PORTS (port)
|
||||||
|
if (grub_strcmp (port->name, name) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
#if ((defined(__mips__) && _MIPS_SIM != _ABI64) || defined (__i386__) || defined (__x86_64__)) && !defined(GRUB_MACHINE_EMU) && !defined(GRUB_MACHINE_ARC)
|
||||||
|
if (!port && grub_memcmp (name, "port", sizeof ("port") - 1) == 0
|
||||||
|
&& grub_isxdigit (name [sizeof ("port") - 1]))
|
||||||
|
{
|
||||||
|
name = grub_serial_ns8250_add_port (grub_strtoul (&name[sizeof ("port") - 1],
|
||||||
|
0, 16));
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
FOR_SERIAL_PORTS (port)
|
||||||
|
if (grub_strcmp (port->name, name) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GRUB_MACHINE_IEEE1275
|
||||||
|
if (!port && grub_memcmp (name, "ieee1275/", sizeof ("ieee1275/") - 1) == 0)
|
||||||
|
{
|
||||||
|
name = grub_ofserial_add_port (&name[sizeof ("ieee1275/") - 1]);
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
FOR_SERIAL_PORTS (port)
|
||||||
|
if (grub_strcmp (port->name, name) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_serial (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
struct grub_arg_list *state = ctxt->state;
|
||||||
|
char pname[40];
|
||||||
|
const char *name = NULL;
|
||||||
|
struct grub_serial_port *port;
|
||||||
|
struct grub_serial_config config;
|
||||||
|
grub_err_t err;
|
||||||
|
|
||||||
|
if (state[OPTION_UNIT].set)
|
||||||
|
{
|
||||||
|
grub_snprintf (pname, sizeof (pname), "com%ld",
|
||||||
|
grub_strtoul (state[0].arg, 0, 0));
|
||||||
|
name = pname;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state[OPTION_PORT].set)
|
||||||
|
{
|
||||||
|
grub_snprintf (pname, sizeof (pname), "port%lx",
|
||||||
|
grub_strtoul (state[1].arg, 0, 0));
|
||||||
|
name = pname;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc >= 1)
|
||||||
|
name = args[0];
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
name = "com0";
|
||||||
|
|
||||||
|
port = grub_serial_find (name);
|
||||||
|
if (!port)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("serial port `%s' isn't found"),
|
||||||
|
name);
|
||||||
|
|
||||||
|
config = port->config;
|
||||||
|
|
||||||
|
if (state[OPTION_SPEED].set) {
|
||||||
|
config.speed = grub_strtoul (state[OPTION_SPEED].arg, 0, 0);
|
||||||
|
if (config.speed == 0)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("unsupported serial port parity"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state[OPTION_WORD].set)
|
||||||
|
config.word_len = grub_strtoul (state[OPTION_WORD].arg, 0, 0);
|
||||||
|
|
||||||
|
if (state[OPTION_PARITY].set)
|
||||||
|
{
|
||||||
|
if (! grub_strcmp (state[OPTION_PARITY].arg, "no"))
|
||||||
|
config.parity = GRUB_SERIAL_PARITY_NONE;
|
||||||
|
else if (! grub_strcmp (state[OPTION_PARITY].arg, "odd"))
|
||||||
|
config.parity = GRUB_SERIAL_PARITY_ODD;
|
||||||
|
else if (! grub_strcmp (state[OPTION_PARITY].arg, "even"))
|
||||||
|
config.parity = GRUB_SERIAL_PARITY_EVEN;
|
||||||
|
else
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("unsupported serial port parity"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state[OPTION_RTSCTS].set)
|
||||||
|
{
|
||||||
|
if (grub_strcmp (state[OPTION_RTSCTS].arg, "on") == 0)
|
||||||
|
config.rtscts = 1;
|
||||||
|
else if (grub_strcmp (state[OPTION_RTSCTS].arg, "off") == 0)
|
||||||
|
config.rtscts = 0;
|
||||||
|
else
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("unsupported serial port flow control"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state[OPTION_STOP].set)
|
||||||
|
{
|
||||||
|
if (! grub_strcmp (state[OPTION_STOP].arg, "1"))
|
||||||
|
config.stop_bits = GRUB_SERIAL_STOP_BITS_1;
|
||||||
|
else if (! grub_strcmp (state[OPTION_STOP].arg, "2"))
|
||||||
|
config.stop_bits = GRUB_SERIAL_STOP_BITS_2;
|
||||||
|
else if (! grub_strcmp (state[OPTION_STOP].arg, "1.5"))
|
||||||
|
config.stop_bits = GRUB_SERIAL_STOP_BITS_1_5;
|
||||||
|
else
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("unsupported serial port stop bits number"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state[OPTION_BASE_CLOCK].set)
|
||||||
|
{
|
||||||
|
char *ptr;
|
||||||
|
config.base_clock = grub_strtoull (state[OPTION_BASE_CLOCK].arg, &ptr, 0);
|
||||||
|
if (grub_errno)
|
||||||
|
return grub_errno;
|
||||||
|
if (ptr && *ptr == 'M')
|
||||||
|
config.base_clock *= 1000000;
|
||||||
|
if (ptr && (*ptr == 'k' || *ptr == 'K'))
|
||||||
|
config.base_clock *= 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.speed == 0)
|
||||||
|
config.speed = 9600;
|
||||||
|
|
||||||
|
/* Initialize with new settings. */
|
||||||
|
err = port->driver->configure (port, &config);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
#if !defined (GRUB_MACHINE_EMU) && !defined(GRUB_MACHINE_ARC) && ((defined(__mips__) && _MIPS_SIM != _ABI64) || defined (__i386__) || defined (__x86_64__))
|
||||||
|
|
||||||
|
/* Compatibility kludge. */
|
||||||
|
if (port->driver == &grub_ns8250_driver)
|
||||||
|
{
|
||||||
|
if (!registered)
|
||||||
|
{
|
||||||
|
grub_terminfo_output_register (&grub_serial_term_output, "vt100");
|
||||||
|
|
||||||
|
grub_term_register_input ("serial", &grub_serial_term_input);
|
||||||
|
grub_term_register_output ("serial", &grub_serial_term_output);
|
||||||
|
}
|
||||||
|
grub_serial_terminfo_output.port = port;
|
||||||
|
grub_serial_terminfo_input.port = port;
|
||||||
|
registered = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef GRUB_MACHINE_MIPS_LOONGSON
|
||||||
|
const char loongson_defserial[][6] =
|
||||||
|
{
|
||||||
|
[GRUB_ARCH_MACHINE_YEELOONG] = "com0",
|
||||||
|
[GRUB_ARCH_MACHINE_FULOONG2F] = "com2",
|
||||||
|
[GRUB_ARCH_MACHINE_FULOONG2E] = "com1"
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_serial_register (struct grub_serial_port *port)
|
||||||
|
{
|
||||||
|
struct grub_term_input *in;
|
||||||
|
struct grub_term_output *out;
|
||||||
|
struct grub_serial_input_state *indata;
|
||||||
|
struct grub_serial_output_state *outdata;
|
||||||
|
|
||||||
|
in = grub_malloc (sizeof (*in));
|
||||||
|
if (!in)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
indata = grub_malloc (sizeof (*indata));
|
||||||
|
if (!indata)
|
||||||
|
{
|
||||||
|
grub_free (in);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_memcpy (in, &grub_serial_term_input, sizeof (*in));
|
||||||
|
in->data = indata;
|
||||||
|
in->name = grub_xasprintf ("serial_%s", port->name);
|
||||||
|
grub_memcpy (indata, &grub_serial_terminfo_input, sizeof (*indata));
|
||||||
|
|
||||||
|
if (!in->name)
|
||||||
|
{
|
||||||
|
grub_free (in);
|
||||||
|
grub_free (indata);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
out = grub_zalloc (sizeof (*out));
|
||||||
|
if (!out)
|
||||||
|
{
|
||||||
|
grub_free (indata);
|
||||||
|
grub_free ((char *) in->name);
|
||||||
|
grub_free (in);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
outdata = grub_malloc (sizeof (*outdata));
|
||||||
|
if (!outdata)
|
||||||
|
{
|
||||||
|
grub_free (indata);
|
||||||
|
grub_free ((char *) in->name);
|
||||||
|
grub_free (out);
|
||||||
|
grub_free (in);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_memcpy (out, &grub_serial_term_output, sizeof (*out));
|
||||||
|
out->data = outdata;
|
||||||
|
out->name = in->name;
|
||||||
|
grub_memcpy (outdata, &grub_serial_terminfo_output, sizeof (*outdata));
|
||||||
|
|
||||||
|
grub_list_push (GRUB_AS_LIST_P (&grub_serial_ports), GRUB_AS_LIST (port));
|
||||||
|
((struct grub_serial_input_state *) in->data)->port = port;
|
||||||
|
((struct grub_serial_output_state *) out->data)->port = port;
|
||||||
|
port->term_in = in;
|
||||||
|
port->term_out = out;
|
||||||
|
grub_terminfo_output_register (out, "vt100");
|
||||||
|
#ifdef GRUB_MACHINE_MIPS_LOONGSON
|
||||||
|
if (grub_strcmp (port->name, loongson_defserial[grub_arch_machine]) == 0)
|
||||||
|
{
|
||||||
|
grub_term_register_input_active ("serial_*", in);
|
||||||
|
grub_term_register_output_active ("serial_*", out);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_term_register_input_inactive ("serial_*", in);
|
||||||
|
grub_term_register_output_inactive ("serial_*", out);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
grub_term_register_input ("serial_*", in);
|
||||||
|
grub_term_register_output ("serial_*", out);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_serial_unregister (struct grub_serial_port *port)
|
||||||
|
{
|
||||||
|
if (port->driver->fini)
|
||||||
|
port->driver->fini (port);
|
||||||
|
|
||||||
|
if (port->term_in)
|
||||||
|
grub_term_unregister_input (port->term_in);
|
||||||
|
if (port->term_out)
|
||||||
|
grub_term_unregister_output (port->term_out);
|
||||||
|
|
||||||
|
grub_list_remove (GRUB_AS_LIST (port));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_serial_unregister_driver (struct grub_serial_driver *driver)
|
||||||
|
{
|
||||||
|
struct grub_serial_port *port, *next;
|
||||||
|
for (port = grub_serial_ports; port; port = next)
|
||||||
|
{
|
||||||
|
next = port->next;
|
||||||
|
if (port->driver == driver)
|
||||||
|
grub_serial_unregister (port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_extcmd_t cmd;
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(serial)
|
||||||
|
{
|
||||||
|
cmd = grub_register_extcmd ("serial", grub_cmd_serial, 0,
|
||||||
|
N_("[OPTIONS...]"),
|
||||||
|
N_("Configure serial port."), options);
|
||||||
|
grub_memcpy (&grub_serial_terminfo_output,
|
||||||
|
&grub_serial_terminfo_output_template,
|
||||||
|
sizeof (grub_serial_terminfo_output));
|
||||||
|
|
||||||
|
grub_memcpy (&grub_serial_terminfo_input,
|
||||||
|
&grub_serial_terminfo_input_template,
|
||||||
|
sizeof (grub_serial_terminfo_input));
|
||||||
|
|
||||||
|
#if !defined (GRUB_MACHINE_EMU) && !defined(GRUB_MACHINE_ARC) && ((defined(__mips__) && _MIPS_SIM != _ABI64) || defined (__i386__) || defined (__x86_64__))
|
||||||
|
grub_ns8250_init ();
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_IEEE1275
|
||||||
|
grub_ofserial_init ();
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_EFI
|
||||||
|
grub_efiserial_init ();
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_ARC
|
||||||
|
grub_arcserial_init ();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(serial)
|
||||||
|
{
|
||||||
|
while (grub_serial_ports)
|
||||||
|
grub_serial_unregister (grub_serial_ports);
|
||||||
|
if (registered)
|
||||||
|
{
|
||||||
|
grub_term_unregister_input (&grub_serial_term_input);
|
||||||
|
grub_term_unregister_output (&grub_serial_term_output);
|
||||||
|
}
|
||||||
|
grub_unregister_extcmd (cmd);
|
||||||
|
}
|
||||||
@@ -348,12 +348,38 @@ out:
|
|||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_extcmd_t cmd;
|
static void grub_keymap_add_by_string(const char *src, const char *dst)
|
||||||
|
{
|
||||||
|
int in = 0;
|
||||||
|
int out = 0;
|
||||||
|
|
||||||
|
in = parse_key(dst);
|
||||||
|
out = parse_key(src);
|
||||||
|
|
||||||
|
if (in && out)
|
||||||
|
{
|
||||||
|
grub_keymap_add (in, out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "keyboard_layout.c"
|
||||||
|
|
||||||
|
static grub_err_t grub_cmd_set_keylayout (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
ventoy_set_keyboard_layout(args[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_extcmd_t cmd, setcmd;
|
||||||
|
|
||||||
GRUB_MOD_INIT(setkey)
|
GRUB_MOD_INIT(setkey)
|
||||||
{
|
{
|
||||||
cmd = grub_register_extcmd ("setkey", grub_cmd_setkey, 0, N_("NEW_KEY USA_KEY"),
|
cmd = grub_register_extcmd ("setkey", grub_cmd_setkey, 0, N_("NEW_KEY USA_KEY"),
|
||||||
N_("Map default USA_KEY to NEW_KEY."), options);
|
N_("Map default USA_KEY to NEW_KEY."), options);
|
||||||
|
setcmd = grub_register_extcmd ("set_keyboard_layout", grub_cmd_set_keylayout, 0, N_("layout"),
|
||||||
|
N_("Set keyboard layout."), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
GRUB_MOD_FINI(setkey)
|
GRUB_MOD_FINI(setkey)
|
||||||
|
|||||||
@@ -462,6 +462,8 @@ static int lzx_uncompressed ( struct lzx *lzx ) {
|
|||||||
if ( len % 2 )
|
if ( len % 2 )
|
||||||
lzx->input.offset++;
|
lzx->input.offset++;
|
||||||
|
|
||||||
|
lzx->output.offset += len;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -614,7 +616,7 @@ ssize_t lzx_decompress ( const void *data, size_t len, void *buf ) {
|
|||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
if ( len % 2 ) {
|
if ( len % 2 ) {
|
||||||
DBG ( "LZX cannot handle odd-length input data\n" );
|
DBG ( "LZX cannot handle odd-length input data\n" );
|
||||||
return -1;
|
//return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialise global state, if required */
|
/* Initialise global state, if required */
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
5308
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
Normal file
5308
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -21,6 +21,8 @@
|
|||||||
#ifndef __VENTOY_DEF_H__
|
#ifndef __VENTOY_DEF_H__
|
||||||
#define __VENTOY_DEF_H__
|
#define __VENTOY_DEF_H__
|
||||||
|
|
||||||
|
#define VTOY_MAX_DIR_DEPTH 32
|
||||||
|
|
||||||
#define VTOY_MAX_SCRIPT_BUF (4 * 1024 * 1024)
|
#define VTOY_MAX_SCRIPT_BUF (4 * 1024 * 1024)
|
||||||
|
|
||||||
#define VTOY_PART_BUF_LEN (128 * 1024)
|
#define VTOY_PART_BUF_LEN (128 * 1024)
|
||||||
@@ -29,6 +31,8 @@
|
|||||||
|
|
||||||
#define VTOY_SIZE_1GB 1073741824
|
#define VTOY_SIZE_1GB 1073741824
|
||||||
#define VTOY_SIZE_1MB (1024 * 1024)
|
#define VTOY_SIZE_1MB (1024 * 1024)
|
||||||
|
#define VTOY_SIZE_2MB (2 * 1024 * 1024)
|
||||||
|
#define VTOY_SIZE_4MB (4 * 1024 * 1024)
|
||||||
#define VTOY_SIZE_512KB (512 * 1024)
|
#define VTOY_SIZE_512KB (512 * 1024)
|
||||||
#define VTOY_SIZE_1KB 1024
|
#define VTOY_SIZE_1KB 1024
|
||||||
|
|
||||||
@@ -56,6 +60,19 @@
|
|||||||
#define VTOY_PLAT_ARM64_UEFI 0x41413634
|
#define VTOY_PLAT_ARM64_UEFI 0x41413634
|
||||||
#define VTOY_PLAT_X86_64_UEFI 0x55454649
|
#define VTOY_PLAT_X86_64_UEFI 0x55454649
|
||||||
#define VTOY_PLAT_X86_LEGACY 0x42494f53
|
#define VTOY_PLAT_X86_LEGACY 0x42494f53
|
||||||
|
#define VTOY_PLAT_MIPS_UEFI 0x4D495053
|
||||||
|
|
||||||
|
#define VTOY_COMM_CPIO "ventoy.cpio"
|
||||||
|
#if defined(__arm__) || defined(__aarch64__)
|
||||||
|
#define VTOY_ARCH_CPIO "ventoy_arm64.cpio"
|
||||||
|
#elif defined(__mips__)
|
||||||
|
#define VTOY_ARCH_CPIO "ventoy_mips64.cpio"
|
||||||
|
#else
|
||||||
|
#define VTOY_ARCH_CPIO "ventoy_x86.cpio"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ventoy_varg_4(arg) arg[0], arg[1], arg[2], arg[3]
|
||||||
|
#define ventoy_varg_8(arg) arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7]
|
||||||
|
|
||||||
#define VTOY_PWD_CORRUPTED(err) \
|
#define VTOY_PWD_CORRUPTED(err) \
|
||||||
{\
|
{\
|
||||||
@@ -66,6 +83,20 @@
|
|||||||
return (err);\
|
return (err);\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef enum VTOY_FILE_FLT
|
||||||
|
{
|
||||||
|
VTOY_FILE_FLT_ISO = 0, /* .iso */
|
||||||
|
VTOY_FILE_FLT_WIM, /* .wim */
|
||||||
|
VTOY_FILE_FLT_EFI, /* .efi */
|
||||||
|
VTOY_FILE_FLT_IMG, /* .img */
|
||||||
|
VTOY_FILE_FLT_VHD, /* .vhd(x) */
|
||||||
|
VTOY_FILE_FLT_VTOY, /* .vtoy */
|
||||||
|
|
||||||
|
VTOY_FILE_FLT_BUTT
|
||||||
|
}VTOY_FILE_FLT;
|
||||||
|
|
||||||
|
#define FILE_FLT(type) (0 == g_vtoy_file_flt[VTOY_FILE_FLT_##type])
|
||||||
|
|
||||||
typedef struct ventoy_initrd_ctx
|
typedef struct ventoy_initrd_ctx
|
||||||
{
|
{
|
||||||
const char *path_prefix;
|
const char *path_prefix;
|
||||||
@@ -116,6 +147,7 @@ typedef struct cpio_newc_header
|
|||||||
typedef int (*grub_char_check_func)(int c);
|
typedef int (*grub_char_check_func)(int c);
|
||||||
#define ventoy_is_decimal(str) ventoy_string_check(str, grub_isdigit)
|
#define ventoy_is_decimal(str) ventoy_string_check(str, grub_isdigit)
|
||||||
|
|
||||||
|
#define OFFSET_OF(TYPE, MEMBER) ((grub_size_t) &((TYPE *)0)->MEMBER)
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
typedef struct ventoy_patch_vhd
|
typedef struct ventoy_patch_vhd
|
||||||
@@ -167,14 +199,28 @@ typedef struct ventoy_iso9660_vd
|
|||||||
grub_uint32_t space;
|
grub_uint32_t space;
|
||||||
}ventoy_iso9660_vd;
|
}ventoy_iso9660_vd;
|
||||||
|
|
||||||
|
/* https://wiki.osdev.org/El-Torito */
|
||||||
|
typedef struct boot_info_table
|
||||||
|
{
|
||||||
|
grub_uint32_t bi_data0;
|
||||||
|
grub_uint32_t bi_data1;
|
||||||
|
grub_uint32_t bi_PrimaryVolumeDescriptor;
|
||||||
|
grub_uint32_t bi_BootFileLocation;
|
||||||
|
grub_uint32_t bi_BootFileLength;
|
||||||
|
grub_uint32_t bi_Checksum;
|
||||||
|
grub_uint8_t bi_Reserved[40];
|
||||||
|
}boot_info_table;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
#define img_type_iso 0
|
#define img_type_start 0
|
||||||
#define img_type_wim 1
|
#define img_type_iso 0
|
||||||
#define img_type_efi 2
|
#define img_type_wim 1
|
||||||
#define img_type_img 3
|
#define img_type_efi 2
|
||||||
#define img_type_vhd 4
|
#define img_type_img 3
|
||||||
#define img_type_vtoy 5
|
#define img_type_vhd 4
|
||||||
|
#define img_type_vtoy 5
|
||||||
|
#define img_type_max 6
|
||||||
|
|
||||||
typedef struct img_info
|
typedef struct img_info
|
||||||
{
|
{
|
||||||
@@ -183,6 +229,8 @@ typedef struct img_info
|
|||||||
char name[256];
|
char name[256];
|
||||||
|
|
||||||
const char *alias;
|
const char *alias;
|
||||||
|
const char *tip1;
|
||||||
|
const char *tip2;
|
||||||
const char *class;
|
const char *class;
|
||||||
const char *menu_prefix;
|
const char *menu_prefix;
|
||||||
|
|
||||||
@@ -205,6 +253,7 @@ typedef struct img_iterator_node
|
|||||||
img_info **tail;
|
img_info **tail;
|
||||||
char dir[400];
|
char dir[400];
|
||||||
int dirlen;
|
int dirlen;
|
||||||
|
int level;
|
||||||
int isocnt;
|
int isocnt;
|
||||||
int done;
|
int done;
|
||||||
int select;
|
int select;
|
||||||
@@ -256,10 +305,11 @@ extern ventoy_img_chunk_list g_img_chunk_list;
|
|||||||
extern ventoy_img_chunk_list g_wimiso_chunk_list;
|
extern ventoy_img_chunk_list g_wimiso_chunk_list;
|
||||||
extern char *g_wimiso_path;
|
extern char *g_wimiso_path;
|
||||||
extern char g_arch_mode_suffix[64];
|
extern char g_arch_mode_suffix[64];
|
||||||
|
extern const char *g_menu_prefix[img_type_max];
|
||||||
|
|
||||||
extern int g_ventoy_debug;
|
extern int g_ventoy_debug;
|
||||||
void ventoy_debug(const char *fmt, ...);
|
void ventoy_debug(const char *fmt, ...);
|
||||||
#define debug(fmt, ...) if (g_ventoy_debug) ventoy_debug("[VTOY]: "fmt, __VA_ARGS__)
|
#define debug(fmt, args...) if (g_ventoy_debug) ventoy_debug("[VTOY]: "fmt, ##args)
|
||||||
|
|
||||||
#define vtoy_ssprintf(buf, pos, fmt, ...) \
|
#define vtoy_ssprintf(buf, pos, fmt, ...) \
|
||||||
pos += grub_snprintf(buf + pos, VTOY_MAX_SCRIPT_BUF - pos, fmt, __VA_ARGS__)
|
pos += grub_snprintf(buf + pos, VTOY_MAX_SCRIPT_BUF - pos, fmt, __VA_ARGS__)
|
||||||
@@ -365,6 +415,15 @@ typedef struct wim_security_header
|
|||||||
grub_uint32_t count; /* Number of entries */
|
grub_uint32_t count; /* Number of entries */
|
||||||
}wim_security_header;
|
}wim_security_header;
|
||||||
|
|
||||||
|
typedef struct wim_stream_entry
|
||||||
|
{
|
||||||
|
grub_uint64_t len;
|
||||||
|
grub_uint64_t unused1;
|
||||||
|
wim_hash hash;
|
||||||
|
grub_uint16_t name_len;
|
||||||
|
/* name */
|
||||||
|
}wim_stream_entry;
|
||||||
|
|
||||||
/* Directory entry */
|
/* Directory entry */
|
||||||
typedef struct wim_directory_entry
|
typedef struct wim_directory_entry
|
||||||
{
|
{
|
||||||
@@ -389,6 +448,18 @@ typedef struct wim_directory_entry
|
|||||||
/** No security information exists for this file */
|
/** No security information exists for this file */
|
||||||
#define WIM_NO_SECURITY 0xffffffffUL
|
#define WIM_NO_SECURITY 0xffffffffUL
|
||||||
|
|
||||||
|
typedef struct reg_vk
|
||||||
|
{
|
||||||
|
grub_uint32_t res1;
|
||||||
|
grub_uint16_t sig;
|
||||||
|
grub_uint16_t namesize;
|
||||||
|
grub_uint32_t datasize;
|
||||||
|
grub_uint32_t dataoffset;
|
||||||
|
grub_uint32_t datatype;
|
||||||
|
grub_uint16_t flag;
|
||||||
|
grub_uint16_t res2;
|
||||||
|
}reg_vk;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
@@ -491,9 +562,28 @@ typedef struct plugin_entry
|
|||||||
const char *key;
|
const char *key;
|
||||||
ventoy_plugin_entry_pf entryfunc;
|
ventoy_plugin_entry_pf entryfunc;
|
||||||
ventoy_plugin_check_pf checkfunc;
|
ventoy_plugin_check_pf checkfunc;
|
||||||
|
int flag;
|
||||||
}plugin_entry;
|
}plugin_entry;
|
||||||
|
|
||||||
|
typedef struct replace_fs_dir
|
||||||
|
{
|
||||||
|
grub_device_t dev;
|
||||||
|
grub_fs_t fs;
|
||||||
|
char fullpath[512];
|
||||||
|
char initrd[512];
|
||||||
|
int curpos;
|
||||||
|
int dircnt;
|
||||||
|
int filecnt;
|
||||||
|
}replace_fs_dir;
|
||||||
|
|
||||||
|
typedef struct chk_case_fs_dir
|
||||||
|
{
|
||||||
|
grub_device_t dev;
|
||||||
|
grub_fs_t fs;
|
||||||
|
}chk_case_fs_dir;
|
||||||
|
|
||||||
|
int ventoy_strcmp(const char *pattern, const char *str);
|
||||||
|
int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n);
|
||||||
void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param);
|
void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param);
|
||||||
grub_err_t ventoy_cmd_isolinux_initrd_collect(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_isolinux_initrd_collect(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_grub_initrd_collect(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_grub_initrd_collect(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
@@ -507,6 +597,7 @@ grub_err_t ventoy_cmd_linux_locate_initrd(grub_extcmd_context_t ctxt, int argc,
|
|||||||
grub_err_t ventoy_cmd_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_valid_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_valid_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_append_ext_sector(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_skip_svd(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_skip_svd(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_cpio_busybox_64(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_cpio_busybox_64(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
@@ -518,10 +609,16 @@ int ventoy_is_dir_exist(const char *fmt, ...);
|
|||||||
int ventoy_fill_data(grub_uint32_t buflen, char *buffer);
|
int ventoy_fill_data(grub_uint32_t buflen, char *buffer);
|
||||||
grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_is_pe64(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_dump_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_dump_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_sel_wimboot(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_set_wim_prompt(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_ssize_t ventoy_load_file_with_prompt(grub_file_t file, void *buf, grub_ssize_t size);
|
||||||
|
int ventoy_need_prompt_load_file(void);
|
||||||
|
|
||||||
VTOY_JSON *vtoy_json_find_item
|
VTOY_JSON *vtoy_json_find_item
|
||||||
(
|
(
|
||||||
@@ -731,11 +828,21 @@ typedef struct file_fullpath
|
|||||||
char path[256];
|
char path[256];
|
||||||
}file_fullpath;
|
}file_fullpath;
|
||||||
|
|
||||||
|
typedef struct theme_list
|
||||||
|
{
|
||||||
|
file_fullpath theme;
|
||||||
|
struct theme_list *next;
|
||||||
|
}theme_list;
|
||||||
|
|
||||||
|
#define auto_install_type_file 0
|
||||||
|
#define auto_install_type_parent 1
|
||||||
typedef struct install_template
|
typedef struct install_template
|
||||||
{
|
{
|
||||||
|
int type;
|
||||||
int pathlen;
|
int pathlen;
|
||||||
char isopath[256];
|
char isopath[256];
|
||||||
|
|
||||||
|
int timeout;
|
||||||
int autosel;
|
int autosel;
|
||||||
int cursel;
|
int cursel;
|
||||||
int templatenum;
|
int templatenum;
|
||||||
@@ -767,6 +874,7 @@ typedef struct persistence_config
|
|||||||
int pathlen;
|
int pathlen;
|
||||||
char isopath[256];
|
char isopath[256];
|
||||||
|
|
||||||
|
int timeout;
|
||||||
int autosel;
|
int autosel;
|
||||||
int cursel;
|
int cursel;
|
||||||
int backendnum;
|
int backendnum;
|
||||||
@@ -788,6 +896,20 @@ typedef struct menu_alias
|
|||||||
struct menu_alias *next;
|
struct menu_alias *next;
|
||||||
}menu_alias;
|
}menu_alias;
|
||||||
|
|
||||||
|
#define vtoy_tip_image_file 0
|
||||||
|
#define vtoy_tip_directory 1
|
||||||
|
typedef struct menu_tip
|
||||||
|
{
|
||||||
|
int type;
|
||||||
|
int pathlen;
|
||||||
|
char isopath[256];
|
||||||
|
char tip1[1024];
|
||||||
|
char tip2[1024];
|
||||||
|
|
||||||
|
struct menu_tip *next;
|
||||||
|
}menu_tip;
|
||||||
|
|
||||||
|
|
||||||
#define vtoy_class_image_file 0
|
#define vtoy_class_image_file 0
|
||||||
#define vtoy_class_directory 1
|
#define vtoy_class_directory 1
|
||||||
|
|
||||||
@@ -795,6 +917,7 @@ typedef struct menu_class
|
|||||||
{
|
{
|
||||||
int type;
|
int type;
|
||||||
int patlen;
|
int patlen;
|
||||||
|
int parent;
|
||||||
char pattern[256];
|
char pattern[256];
|
||||||
char class[64];
|
char class[64];
|
||||||
|
|
||||||
@@ -818,6 +941,7 @@ typedef struct custom_boot
|
|||||||
typedef struct conf_replace
|
typedef struct conf_replace
|
||||||
{
|
{
|
||||||
int pathlen;
|
int pathlen;
|
||||||
|
int img;
|
||||||
char isopath[256];
|
char isopath[256];
|
||||||
char orgconf[256];
|
char orgconf[256];
|
||||||
char newconf[256];
|
char newconf[256];
|
||||||
@@ -825,8 +949,11 @@ typedef struct conf_replace
|
|||||||
struct conf_replace *next;
|
struct conf_replace *next;
|
||||||
}conf_replace;
|
}conf_replace;
|
||||||
|
|
||||||
|
#define injection_type_file 0
|
||||||
|
#define injection_type_parent 1
|
||||||
typedef struct injection_config
|
typedef struct injection_config
|
||||||
{
|
{
|
||||||
|
int type;
|
||||||
int pathlen;
|
int pathlen;
|
||||||
char isopath[256];
|
char isopath[256];
|
||||||
char archive[256];
|
char archive[256];
|
||||||
@@ -863,8 +990,12 @@ typedef struct vtoy_password
|
|||||||
grub_uint8_t md5[16];
|
grub_uint8_t md5[16];
|
||||||
}vtoy_password;
|
}vtoy_password;
|
||||||
|
|
||||||
|
#define vtoy_menu_pwd_file 0
|
||||||
|
#define vtoy_menu_pwd_parent 1
|
||||||
|
|
||||||
typedef struct menu_password
|
typedef struct menu_password
|
||||||
{
|
{
|
||||||
|
int type;
|
||||||
int pathlen;
|
int pathlen;
|
||||||
char isopath[256];
|
char isopath[256];
|
||||||
|
|
||||||
@@ -875,9 +1006,12 @@ typedef struct menu_password
|
|||||||
|
|
||||||
extern int g_ventoy_menu_esc;
|
extern int g_ventoy_menu_esc;
|
||||||
extern int g_ventoy_suppress_esc;
|
extern int g_ventoy_suppress_esc;
|
||||||
|
extern int g_ventoy_suppress_esc_default;
|
||||||
extern int g_ventoy_last_entry;
|
extern int g_ventoy_last_entry;
|
||||||
extern int g_ventoy_memdisk_mode;
|
extern int g_ventoy_memdisk_mode;
|
||||||
extern int g_ventoy_iso_raw;
|
extern int g_ventoy_iso_raw;
|
||||||
|
extern int g_ventoy_grub2_mode;
|
||||||
|
extern int g_ventoy_wimboot_mode;
|
||||||
extern int g_ventoy_iso_uefi_drv;
|
extern int g_ventoy_iso_uefi_drv;
|
||||||
extern int g_ventoy_case_insensitive;
|
extern int g_ventoy_case_insensitive;
|
||||||
extern grub_uint8_t g_ventoy_chain_type;
|
extern grub_uint8_t g_ventoy_chain_type;
|
||||||
@@ -895,6 +1029,8 @@ extern grub_uint8_t *g_conf_replace_new_buf;
|
|||||||
extern int g_conf_replace_new_len;
|
extern int g_conf_replace_new_len;
|
||||||
extern int g_conf_replace_new_len_align;
|
extern int g_conf_replace_new_len_align;
|
||||||
extern grub_uint64_t g_ventoy_disk_size;
|
extern grub_uint64_t g_ventoy_disk_size;
|
||||||
|
extern grub_uint64_t g_ventoy_disk_part_size[2];
|
||||||
|
extern grub_uint32_t g_ventoy_plat_data;
|
||||||
|
|
||||||
#define ventoy_unix_fill_virt(new_data, new_len) \
|
#define ventoy_unix_fill_virt(new_data, new_len) \
|
||||||
{ \
|
{ \
|
||||||
@@ -912,19 +1048,26 @@ extern grub_uint64_t g_ventoy_disk_size;
|
|||||||
chain->virt_img_size_in_bytes += data_secs * 2048; \
|
chain->virt_img_size_in_bytes += data_secs * 2048; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ventoy_syscall0(name) grub_##name()
|
||||||
|
#define ventoy_syscall1(name, a) grub_##name(a)
|
||||||
|
|
||||||
|
void ventoy_str_tolower(char *str);
|
||||||
|
void ventoy_str_toupper(char *str);
|
||||||
char * ventoy_get_line(char *start);
|
char * ventoy_get_line(char *start);
|
||||||
int ventoy_cmp_img(img_info *img1, img_info *img2);
|
int ventoy_cmp_img(img_info *img1, img_info *img2);
|
||||||
void ventoy_swap_img(img_info *img1, img_info *img2);
|
void ventoy_swap_img(img_info *img1, img_info *img2);
|
||||||
char * ventoy_plugin_get_cur_install_template(const char *isopath);
|
char * ventoy_plugin_get_cur_install_template(const char *isopath);
|
||||||
install_template * ventoy_plugin_find_install_template(const char *isopath);
|
install_template * ventoy_plugin_find_install_template(const char *isopath);
|
||||||
persistence_config * ventoy_plugin_find_persistent(const char *isopath);
|
persistence_config * ventoy_plugin_find_persistent(const char *isopath);
|
||||||
|
grub_uint64_t ventoy_get_vtoy_partsize(int part);
|
||||||
void ventoy_plugin_dump_injection(void);
|
void ventoy_plugin_dump_injection(void);
|
||||||
void ventoy_plugin_dump_auto_install(void);
|
void ventoy_plugin_dump_auto_install(void);
|
||||||
int ventoy_fill_windows_rtdata(void *buf, char *isopath);
|
int ventoy_fill_windows_rtdata(void *buf, char *isopath);
|
||||||
int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list);
|
int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list);
|
||||||
const char * ventoy_plugin_get_injection(const char *isopath);
|
const char * ventoy_plugin_get_injection(const char *isopath);
|
||||||
const char * ventoy_plugin_get_menu_alias(int type, const char *isopath);
|
const char * ventoy_plugin_get_menu_alias(int type, const char *isopath);
|
||||||
const char * ventoy_plugin_get_menu_class(int type, const char *name);
|
const menu_tip * ventoy_plugin_get_menu_tip(int type, const char *isopath);
|
||||||
|
const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path);
|
||||||
int ventoy_plugin_check_memdisk(const char *isopath);
|
int ventoy_plugin_check_memdisk(const char *isopath);
|
||||||
int ventoy_plugin_get_image_list_index(int type, const char *name);
|
int ventoy_plugin_get_image_list_index(int type, const char *name);
|
||||||
conf_replace * ventoy_plugin_find_conf_replace(const char *iso);
|
conf_replace * ventoy_plugin_find_conf_replace(const char *iso);
|
||||||
@@ -933,6 +1076,7 @@ int ventoy_plugin_load_dud(dud *node, const char *isopart);
|
|||||||
int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
||||||
int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
||||||
void ventoy_plugin_dump_persistence(void);
|
void ventoy_plugin_dump_persistence(void);
|
||||||
|
grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_check_password(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_check_password(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_linux_get_main_initrd_index(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_linux_get_main_initrd_index(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
@@ -948,6 +1092,7 @@ grub_err_t ventoy_cmd_unix_fill_image_desc(grub_extcmd_context_t ctxt, int argc,
|
|||||||
grub_err_t ventoy_cmd_unix_gzip_newko(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_unix_gzip_newko(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_unix_freebsd_ver(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_unix_freebsd_ver(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_parse_freenas_ver(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_parse_freenas_ver(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
int ventoy_check_device_result(int ret);
|
int ventoy_check_device_result(int ret);
|
||||||
int ventoy_check_device(grub_device_t dev);
|
int ventoy_check_device(grub_device_t dev);
|
||||||
void ventoy_debug_dump_guid(const char *prefix, grub_uint8_t *guid);
|
void ventoy_debug_dump_guid(const char *prefix, grub_uint8_t *guid);
|
||||||
@@ -956,11 +1101,32 @@ grub_err_t ventoy_cmd_patch_vhdboot(grub_extcmd_context_t ctxt, int argc, char *
|
|||||||
grub_err_t ventoy_cmd_raw_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_raw_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
int ventoy_check_password(const vtoy_password *pwd, int retry);
|
int ventoy_check_password(const vtoy_password *pwd, int retry);
|
||||||
int ventoy_gzip_compress(void *mem_in, int mem_in_len, void *mem_out, int mem_out_len);
|
|
||||||
grub_uint64_t ventoy_get_part1_size(ventoy_gpt_info *gpt);
|
|
||||||
int ventoy_plugin_add_custom_boot(const char *vcfgpath);
|
int ventoy_plugin_add_custom_boot(const char *vcfgpath);
|
||||||
const char * ventoy_plugin_get_custom_boot(const char *isopath);
|
const char * ventoy_plugin_get_custom_boot(const char *isopath);
|
||||||
grub_err_t ventoy_cmd_dump_custom_boot(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_dump_custom_boot(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
int ventoy_gzip_compress(void *mem_in, int mem_in_len, void *mem_out, int mem_out_len);
|
||||||
|
int ventoy_load_part_table(const char *diskname);
|
||||||
|
int ventoy_env_init(void);
|
||||||
|
int ventoy_register_all_cmd(void);
|
||||||
|
int ventoy_unregister_all_cmd(void);
|
||||||
|
int ventoy_chain_file_size(const char *path);
|
||||||
|
int ventoy_chain_file_read(const char *path, int offset, int len, void *buf);
|
||||||
|
|
||||||
|
#define VTOY_CMD_CHECK(a) if (33554432 != g_ventoy_disk_part_size[a]) ventoy_syscall0(exit)
|
||||||
|
|
||||||
|
#define vtoy_theme_random_boot_second 0
|
||||||
|
#define vtoy_theme_random_boot_day 1
|
||||||
|
#define vtoy_theme_random_boot_month 2
|
||||||
|
|
||||||
|
#define ventoy_env_export(env, name) \
|
||||||
|
{\
|
||||||
|
grub_env_set((env), (name));\
|
||||||
|
grub_env_export(env);\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ret_goto_end(a) ret = a; goto end;
|
||||||
|
|
||||||
|
extern ventoy_grub_param *g_grub_param;
|
||||||
|
|
||||||
#endif /* __VENTOY_DEF_H__ */
|
#endif /* __VENTOY_DEF_H__ */
|
||||||
|
|
||||||
|
|||||||
@@ -152,6 +152,23 @@ static int vtoy_json_parse_string
|
|||||||
return JSON_FAILED;
|
return JSON_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (*(pcPos - 1) == '\\')
|
||||||
|
{
|
||||||
|
for (pcPos++; *pcPos; pcPos++)
|
||||||
|
{
|
||||||
|
if (*pcPos == '"' && *(pcPos - 1) != '\\')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*pcPos == 0 || pcPos < pcTmp)
|
||||||
|
{
|
||||||
|
json_debug("Invalid quotes string %s.", pcData);
|
||||||
|
return JSON_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
*ppcEnd = pcPos + 1;
|
*ppcEnd = pcPos + 1;
|
||||||
uiLen = (grub_uint32_t)(unsigned long)(pcPos - pcTmp);
|
uiLen = (grub_uint32_t)(unsigned long)(pcPos - pcTmp);
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,9 @@
|
|||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
#define VTOY_APPEND_EXT_SIZE 4096
|
||||||
|
static int g_append_ext_sector = 0;
|
||||||
|
|
||||||
char * ventoy_get_line(char *start)
|
char * ventoy_get_line(char *start)
|
||||||
{
|
{
|
||||||
if (start == NULL)
|
if (start == NULL)
|
||||||
@@ -333,7 +336,9 @@ end:
|
|||||||
static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
int len = 0;
|
||||||
int dollar = 0;
|
int dollar = 0;
|
||||||
|
int quotation = 0;
|
||||||
grub_file_t file = NULL;
|
grub_file_t file = NULL;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
char *start = NULL;
|
char *start = NULL;
|
||||||
@@ -382,6 +387,12 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
|||||||
start++;
|
start++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (*start == '"')
|
||||||
|
{
|
||||||
|
quotation = 1;
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
|
||||||
while (*start)
|
while (*start)
|
||||||
{
|
{
|
||||||
img = grub_zalloc(sizeof(initrd_info));
|
img = grub_zalloc(sizeof(initrd_info));
|
||||||
@@ -400,6 +411,16 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (quotation)
|
||||||
|
{
|
||||||
|
len = (int)grub_strlen(img->name);
|
||||||
|
if (len > 2 && img->name[len - 1] == '"')
|
||||||
|
{
|
||||||
|
img->name[len - 1] = 0;
|
||||||
|
}
|
||||||
|
debug("Remove quotation <%s>\n", img->name);
|
||||||
|
}
|
||||||
|
|
||||||
if (dollar == 1 || ventoy_find_initrd_by_name(g_initrd_img_list, img->name))
|
if (dollar == 1 || ventoy_find_initrd_by_name(g_initrd_img_list, img->name))
|
||||||
{
|
{
|
||||||
grub_free(img);
|
grub_free(img);
|
||||||
@@ -640,6 +661,11 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_count(void)
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_append_ext_sector > 0)
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -653,6 +679,11 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_size(void)
|
|||||||
{
|
{
|
||||||
size += sizeof(ventoy_virt_chunk) + g_conf_replace_new_len_align;
|
size += sizeof(ventoy_virt_chunk) + g_conf_replace_new_len_align;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_append_ext_sector > 0)
|
||||||
|
{
|
||||||
|
size += sizeof(ventoy_virt_chunk) + VTOY_APPEND_EXT_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
@@ -660,6 +691,7 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_size(void)
|
|||||||
static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_head *chain)
|
static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_head *chain)
|
||||||
{
|
{
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
int virtid = 0;
|
||||||
initrd_info *node;
|
initrd_info *node;
|
||||||
grub_uint64_t sector;
|
grub_uint64_t sector;
|
||||||
grub_uint32_t offset;
|
grub_uint32_t offset;
|
||||||
@@ -707,6 +739,29 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
|
|||||||
offset += g_ventoy_cpio_size;
|
offset += g_ventoy_cpio_size;
|
||||||
sector += cpio_secs + initrd_secs;
|
sector += cpio_secs + initrd_secs;
|
||||||
cur++;
|
cur++;
|
||||||
|
virtid++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lenovo EasyStartup need an addional sector for boundary check */
|
||||||
|
if (g_append_ext_sector > 0)
|
||||||
|
{
|
||||||
|
cpio_secs = VTOY_APPEND_EXT_SIZE / 2048;
|
||||||
|
|
||||||
|
cur->mem_sector_start = sector;
|
||||||
|
cur->mem_sector_end = cur->mem_sector_start + cpio_secs;
|
||||||
|
cur->mem_sector_offset = offset;
|
||||||
|
cur->remap_sector_start = 0;
|
||||||
|
cur->remap_sector_end = 0;
|
||||||
|
cur->org_sector_start = 0;
|
||||||
|
|
||||||
|
grub_memset(override + offset, 0, VTOY_APPEND_EXT_SIZE);
|
||||||
|
|
||||||
|
chain->virt_img_size_in_bytes += VTOY_APPEND_EXT_SIZE;
|
||||||
|
|
||||||
|
offset += VTOY_APPEND_EXT_SIZE;
|
||||||
|
sector += cpio_secs;
|
||||||
|
cur++;
|
||||||
|
virtid++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_conf_replace_offset > 0)
|
if (g_conf_replace_offset > 0)
|
||||||
@@ -724,9 +779,15 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
|
|||||||
|
|
||||||
chain->virt_img_size_in_bytes += g_conf_replace_new_len_align;
|
chain->virt_img_size_in_bytes += g_conf_replace_new_len_align;
|
||||||
|
|
||||||
|
if (g_grub_param->img_replace.magic == GRUB_IMG_REPLACE_MAGIC)
|
||||||
|
{
|
||||||
|
g_grub_param->img_replace.new_file_virtual_id = virtid;
|
||||||
|
}
|
||||||
|
|
||||||
offset += g_conf_replace_new_len_align;
|
offset += g_conf_replace_new_len_align;
|
||||||
sector += cpio_secs;
|
sector += cpio_secs;
|
||||||
cur++;
|
cur++;
|
||||||
|
virtid++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -926,6 +987,12 @@ static grub_err_t ventoy_linux_locate_initrd(int filt, int *filtcnt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* skip hdt.img */
|
||||||
|
if (file->size <= VTOY_SIZE_1MB && grub_strcmp(node->name, "/boot/hdt.img") == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (grub_strcmp(file->fs->name, "iso9660") == 0)
|
if (grub_strcmp(file->fs->name, "iso9660") == 0)
|
||||||
{
|
{
|
||||||
node->iso_type = 0;
|
node->iso_type = 0;
|
||||||
@@ -1101,6 +1168,24 @@ grub_err_t ventoy_cmd_skip_svd(grub_extcmd_context_t ctxt, int argc, char **args
|
|||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grub_err_t ventoy_cmd_append_ext_sector(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
(void)args;
|
||||||
|
|
||||||
|
if (args[0][0] == '1')
|
||||||
|
{
|
||||||
|
g_append_ext_sector = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_append_ext_sector = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args)
|
grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -1124,6 +1209,7 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
grub_uint32_t injection_size = 0;
|
grub_uint32_t injection_size = 0;
|
||||||
grub_uint32_t dud_size = 0;
|
grub_uint32_t dud_size = 0;
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
|
grub_file_t archfile;
|
||||||
grub_file_t tmpfile;
|
grub_file_t tmpfile;
|
||||||
ventoy_img_chunk_list chunk_list;
|
ventoy_img_chunk_list chunk_list;
|
||||||
|
|
||||||
@@ -1142,12 +1228,21 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
|
|
||||||
img_chunk_size = g_img_chunk_list.cur_chunk * sizeof(ventoy_img_chunk);
|
img_chunk_size = g_img_chunk_list.cur_chunk * sizeof(ventoy_img_chunk);
|
||||||
|
|
||||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
|
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s/%s", args[0], VTOY_COMM_CPIO);
|
||||||
if (!file)
|
if (!file)
|
||||||
{
|
{
|
||||||
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't open file %s\n", args[0]);
|
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't open file %s/%s\n", args[0], VTOY_COMM_CPIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
archfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s/%s", args[0], VTOY_ARCH_CPIO);
|
||||||
|
if (!archfile)
|
||||||
|
{
|
||||||
|
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't open file %s/%s\n", args[0], VTOY_ARCH_CPIO);
|
||||||
|
grub_file_close(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("load %s %s success\n", VTOY_COMM_CPIO, VTOY_ARCH_CPIO);
|
||||||
|
|
||||||
if (g_ventoy_cpio_buf)
|
if (g_ventoy_cpio_buf)
|
||||||
{
|
{
|
||||||
grub_free(g_ventoy_cpio_buf);
|
grub_free(g_ventoy_cpio_buf);
|
||||||
@@ -1234,22 +1329,29 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
debug("dud not configed %s\n", args[1]);
|
debug("dud not configed %s\n", args[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_ventoy_cpio_buf = grub_malloc(file->size + 40960 + template_size +
|
g_ventoy_cpio_buf = grub_malloc(file->size + archfile->size + 40960 + template_size +
|
||||||
persistent_size + injection_size + dud_size + img_chunk_size);
|
persistent_size + injection_size + dud_size + img_chunk_size);
|
||||||
if (NULL == g_ventoy_cpio_buf)
|
if (NULL == g_ventoy_cpio_buf)
|
||||||
{
|
{
|
||||||
grub_file_close(file);
|
grub_file_close(file);
|
||||||
|
grub_file_close(archfile);
|
||||||
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't alloc memory %llu\n", file->size);
|
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't alloc memory %llu\n", file->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_file_read(file, g_ventoy_cpio_buf, file->size);
|
grub_file_read(file, g_ventoy_cpio_buf, file->size);
|
||||||
|
|
||||||
buf = (grub_uint8_t *)(g_ventoy_cpio_buf + file->size - 4);
|
buf = (grub_uint8_t *)(g_ventoy_cpio_buf + file->size - 4);
|
||||||
while (*((grub_uint32_t *)buf) != 0x37303730)
|
while (*((grub_uint32_t *)buf) != 0x37303730)
|
||||||
{
|
{
|
||||||
buf -= 4;
|
buf -= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grub_file_read(archfile, buf, archfile->size);
|
||||||
|
buf += (archfile->size - 4);
|
||||||
|
while (*((grub_uint32_t *)buf) != 0x37303730)
|
||||||
|
{
|
||||||
|
buf -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
/* get initrd head len */
|
/* get initrd head len */
|
||||||
initrd_head_len = ventoy_cpio_newc_fill_head(buf, 0, NULL, "initrd000.xx");
|
initrd_head_len = ventoy_cpio_newc_fill_head(buf, 0, NULL, "initrd000.xx");
|
||||||
|
|
||||||
@@ -1313,6 +1415,7 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
ventoy_cpio_newc_fill_head(g_ventoy_initrd_head, 0, NULL, "initrd000.xx");
|
ventoy_cpio_newc_fill_head(g_ventoy_initrd_head, 0, NULL, "initrd000.xx");
|
||||||
|
|
||||||
grub_file_close(file);
|
grub_file_close(file);
|
||||||
|
grub_file_close(archfile);
|
||||||
|
|
||||||
if (grub_strcmp(args[3], "busybox=64") == 0)
|
if (grub_strcmp(args[3], "busybox=64") == 0)
|
||||||
{
|
{
|
||||||
@@ -1324,6 +1427,11 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
debug("cpio busybox proc %s\n", args[3]);
|
debug("cpio busybox proc %s\n", args[3]);
|
||||||
ventoy_cpio_busybox64((cpio_newc_header *)g_ventoy_cpio_buf, "a64");
|
ventoy_cpio_busybox64((cpio_newc_header *)g_ventoy_cpio_buf, "a64");
|
||||||
}
|
}
|
||||||
|
else if (grub_strcmp(args[3], "busybox=m64") == 0)
|
||||||
|
{
|
||||||
|
debug("cpio busybox proc %s\n", args[3]);
|
||||||
|
ventoy_cpio_busybox64((cpio_newc_header *)g_ventoy_cpio_buf, "m64");
|
||||||
|
}
|
||||||
|
|
||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
@@ -1418,9 +1526,9 @@ grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **
|
|||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
|
grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
|
int len = 0;
|
||||||
int ventoy_compatible = 0;
|
int ventoy_compatible = 0;
|
||||||
grub_uint32_t size = 0;
|
grub_uint32_t size = 0;
|
||||||
grub_uint64_t isosize = 0;
|
grub_uint64_t isosize = 0;
|
||||||
@@ -1460,23 +1568,31 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
|
|||||||
|
|
||||||
isosize = file->size;
|
isosize = file->size;
|
||||||
|
|
||||||
boot_catlog = ventoy_get_iso_boot_catlog(file);
|
len = (int)grub_strlen(args[0]);
|
||||||
if (boot_catlog)
|
if (len >= 4 && 0 == grub_strcasecmp(args[0] + len - 4, ".img"))
|
||||||
{
|
{
|
||||||
if (ventoy_is_efi_os() && (!ventoy_has_efi_eltorito(file, boot_catlog)))
|
debug("boot catlog %u for img file\n", boot_catlog);
|
||||||
{
|
|
||||||
grub_env_set("LoadIsoEfiDriver", "on");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ventoy_is_efi_os())
|
boot_catlog = ventoy_get_iso_boot_catlog(file);
|
||||||
|
if (boot_catlog)
|
||||||
{
|
{
|
||||||
grub_env_set("LoadIsoEfiDriver", "on");
|
if (ventoy_is_efi_os() && (!ventoy_has_efi_eltorito(file, boot_catlog)))
|
||||||
|
{
|
||||||
|
grub_env_set("LoadIsoEfiDriver", "on");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return grub_error(GRUB_ERR_BAD_ARGUMENT, "File %s is not bootable", args[0]);
|
if (ventoy_is_efi_os())
|
||||||
|
{
|
||||||
|
grub_env_set("LoadIsoEfiDriver", "on");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return grub_error(GRUB_ERR_BAD_ARGUMENT, "File %s is not bootable", args[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -33,6 +33,8 @@
|
|||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
#include <grub/net.h>
|
#include <grub/net.h>
|
||||||
#include <grub/time.h>
|
#include <grub/time.h>
|
||||||
|
#include <grub/elf.h>
|
||||||
|
#include <grub/elfload.h>
|
||||||
#include <grub/ventoy.h>
|
#include <grub/ventoy.h>
|
||||||
#include "ventoy_def.h"
|
#include "ventoy_def.h"
|
||||||
|
|
||||||
@@ -383,6 +385,174 @@ grub_err_t ventoy_cmd_unix_freebsd_ver(grub_extcmd_context_t ctxt, int argc, cha
|
|||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grub_err_t ventoy_cmd_unix_freebsd_ver_elf(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
int k;
|
||||||
|
grub_elf_t elf = NULL;
|
||||||
|
grub_off_t offset = 0;
|
||||||
|
grub_uint32_t len = 0;
|
||||||
|
char *str = NULL;
|
||||||
|
char *data = NULL;
|
||||||
|
void *hdr = NULL;
|
||||||
|
char ver[64] = {0};
|
||||||
|
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
(void)args;
|
||||||
|
|
||||||
|
if (argc != 3)
|
||||||
|
{
|
||||||
|
debug("Invalid argc %d\n", argc);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = grub_zalloc(8192);
|
||||||
|
if (!data)
|
||||||
|
{
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
elf = grub_elf_open(args[0], GRUB_FILE_TYPE_LINUX_INITRD);
|
||||||
|
if (!elf)
|
||||||
|
{
|
||||||
|
debug("Failed to open file %s\n", args[0]);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[1][0] == '6')
|
||||||
|
{
|
||||||
|
Elf64_Ehdr *e = &(elf->ehdr.ehdr64);
|
||||||
|
Elf64_Shdr *h;
|
||||||
|
Elf64_Shdr *s;
|
||||||
|
Elf64_Shdr *t;
|
||||||
|
Elf64_Half i;
|
||||||
|
|
||||||
|
h = hdr = grub_zalloc(e->e_shnum * e->e_shentsize);
|
||||||
|
if (!h)
|
||||||
|
{
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("read section header %u %u %u\n", e->e_shnum, e->e_shentsize, e->e_shstrndx);
|
||||||
|
grub_file_seek(elf->file, e->e_shoff);
|
||||||
|
grub_file_read(elf->file, h, e->e_shnum * e->e_shentsize);
|
||||||
|
|
||||||
|
s = (Elf64_Shdr *)((char *)h + e->e_shstrndx * e->e_shentsize);
|
||||||
|
str = grub_malloc(s->sh_size + 1);
|
||||||
|
if (!str)
|
||||||
|
{
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
str[s->sh_size] = 0;
|
||||||
|
|
||||||
|
debug("read string table %u %u\n", (grub_uint32_t)s->sh_offset, (grub_uint32_t)s->sh_size);
|
||||||
|
grub_file_seek(elf->file, s->sh_offset);
|
||||||
|
grub_file_read(elf->file, str, s->sh_size);
|
||||||
|
|
||||||
|
for (t = h, i = 0; i < e->e_shnum; i++)
|
||||||
|
{
|
||||||
|
if (grub_strcmp(str + t->sh_name, ".data") == 0)
|
||||||
|
{
|
||||||
|
offset = t->sh_offset;
|
||||||
|
len = t->sh_size;
|
||||||
|
debug("find .data section at %u %u\n", (grub_uint32_t)offset, len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
t = (Elf64_Shdr *)((char *)t + e->e_shentsize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Elf32_Ehdr *e = &(elf->ehdr.ehdr32);
|
||||||
|
Elf32_Shdr *h;
|
||||||
|
Elf32_Shdr *s;
|
||||||
|
Elf32_Shdr *t;
|
||||||
|
Elf32_Half i;
|
||||||
|
|
||||||
|
h = hdr = grub_zalloc(e->e_shnum * e->e_shentsize);
|
||||||
|
if (!h)
|
||||||
|
{
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("read section header %u %u %u\n", e->e_shnum, e->e_shentsize, e->e_shstrndx);
|
||||||
|
grub_file_seek(elf->file, e->e_shoff);
|
||||||
|
grub_file_read(elf->file, h, e->e_shnum * e->e_shentsize);
|
||||||
|
|
||||||
|
s = (Elf32_Shdr *)((char *)h + e->e_shstrndx * e->e_shentsize);
|
||||||
|
str = grub_malloc(s->sh_size + 1);
|
||||||
|
if (!str)
|
||||||
|
{
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
str[s->sh_size] = 0;
|
||||||
|
|
||||||
|
debug("read string table %u %u\n", (grub_uint32_t)s->sh_offset, (grub_uint32_t)s->sh_size);
|
||||||
|
grub_file_seek(elf->file, s->sh_offset);
|
||||||
|
grub_file_read(elf->file, str, s->sh_size);
|
||||||
|
|
||||||
|
for (t = h, i = 0; i < e->e_shnum; i++)
|
||||||
|
{
|
||||||
|
if (grub_strcmp(str + t->sh_name, ".data") == 0)
|
||||||
|
{
|
||||||
|
offset = t->sh_offset;
|
||||||
|
len = t->sh_size;
|
||||||
|
debug("find .data section at %u %u\n", (grub_uint32_t)offset, len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
t = (Elf32_Shdr *)((char *)t + e->e_shentsize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (offset == 0 || len == 0)
|
||||||
|
{
|
||||||
|
debug(".data section not found %s\n", args[0]);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_file_seek(elf->file, offset + len - 8192);
|
||||||
|
grub_file_read(elf->file, data, 8192);
|
||||||
|
|
||||||
|
for (j = 0; j < 8192 - 12; j++)
|
||||||
|
{
|
||||||
|
if (grub_strncmp(data + j, "@(#)FreeBSD ", 12) == 0)
|
||||||
|
{
|
||||||
|
for (k = j + 12; k < 8192; k++)
|
||||||
|
{
|
||||||
|
if (0 == grub_isdigit(data[k]) && data[k] != '.')
|
||||||
|
{
|
||||||
|
data[k] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_snprintf(ver, sizeof(ver), "%s", data + j + 12);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ver[0])
|
||||||
|
{
|
||||||
|
k = (int)grub_strtoul(ver, NULL, 10);
|
||||||
|
debug("freebsd version:<%s> <%d.x>\n", ver, k);
|
||||||
|
grub_snprintf(ver, sizeof(ver), "%d.x", k);
|
||||||
|
ventoy_set_env(args[2], ver);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("freebsd version:<%s>\n", "NOT FOUND");
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
grub_check_free(str);
|
||||||
|
grub_check_free(hdr);
|
||||||
|
grub_check_free(data);
|
||||||
|
check_free(elf, grub_elf_close);
|
||||||
|
|
||||||
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, char **args)
|
grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
grub_uint32_t i;
|
grub_uint32_t i;
|
||||||
@@ -550,7 +720,7 @@ grub_err_t ventoy_cmd_unix_fill_image_desc(grub_extcmd_context_t ctxt, int argc,
|
|||||||
|
|
||||||
desc = (ventoy_image_desc *)(byte + i);
|
desc = (ventoy_image_desc *)(byte + i);
|
||||||
desc->disk_size = g_ventoy_disk_size;
|
desc->disk_size = g_ventoy_disk_size;
|
||||||
desc->part1_size = ventoy_get_part1_size(g_ventoy_part_info);
|
desc->part1_size = g_ventoy_disk_part_size[0];
|
||||||
grub_memcpy(desc->disk_uuid, g_ventoy_part_info->MBR.BootCode + 0x180, 16);
|
grub_memcpy(desc->disk_uuid, g_ventoy_part_info->MBR.BootCode + 0x180, 16);
|
||||||
grub_memcpy(desc->disk_signature, g_ventoy_part_info->MBR.BootCode + 0x1B8, 4);
|
grub_memcpy(desc->disk_signature, g_ventoy_part_info->MBR.BootCode + 0x1B8, 4);
|
||||||
|
|
||||||
|
|||||||
@@ -44,14 +44,12 @@
|
|||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
static int g_vhdboot_bcd_offset = 0;
|
|
||||||
static int g_vhdboot_bcd_len = 0;
|
|
||||||
static int g_vhdboot_isolen = 0;
|
static int g_vhdboot_isolen = 0;
|
||||||
static char *g_vhdboot_totbuf = NULL;
|
static char *g_vhdboot_totbuf = NULL;
|
||||||
static char *g_vhdboot_isobuf = NULL;
|
static char *g_vhdboot_isobuf = NULL;
|
||||||
static grub_uint64_t g_img_trim_head_secnum = 0;
|
static grub_uint64_t g_img_trim_head_secnum = 0;
|
||||||
|
|
||||||
static int ventoy_vhd_find_bcd(int *bcdoffset, int *bcdlen)
|
static int ventoy_vhd_find_bcd(int *bcdoffset, int *bcdlen, const char *path)
|
||||||
{
|
{
|
||||||
grub_uint32_t offset;
|
grub_uint32_t offset;
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
@@ -61,10 +59,9 @@ static int ventoy_vhd_find_bcd(int *bcdoffset, int *bcdlen)
|
|||||||
|
|
||||||
grub_script_execute_sourcecode(cmdbuf);
|
grub_script_execute_sourcecode(cmdbuf);
|
||||||
|
|
||||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", "(vhdiso)/boot/bcd");
|
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(vhdiso)%s", path);
|
||||||
if (!file)
|
if (!file)
|
||||||
{
|
{
|
||||||
grub_printf("Failed to open bcd file in the image file\n");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,13 +80,15 @@ static int ventoy_vhd_find_bcd(int *bcdoffset, int *bcdlen)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ventoy_vhd_patch_path(char *vhdpath, ventoy_patch_vhd *patch1, ventoy_patch_vhd *patch2)
|
static int ventoy_vhd_patch_path(char *vhdpath, ventoy_patch_vhd *patch1, ventoy_patch_vhd *patch2,
|
||||||
|
int bcdoffset, int bcdlen)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
char *pos;
|
char *pos;
|
||||||
grub_size_t pathlen;
|
grub_size_t pathlen;
|
||||||
const char *plat;
|
const char *plat;
|
||||||
|
char *newpath = NULL;
|
||||||
grub_uint16_t *unicode_path;
|
grub_uint16_t *unicode_path;
|
||||||
const grub_uint8_t winloadexe[] =
|
const grub_uint8_t winloadexe[] =
|
||||||
{
|
{
|
||||||
@@ -97,6 +96,11 @@ static int ventoy_vhd_patch_path(char *vhdpath, ventoy_patch_vhd *patch1, ventoy
|
|||||||
0x65, 0x00, 0x78, 0x00, 0x65, 0x00
|
0x65, 0x00, 0x78, 0x00, 0x65, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
|
while ((*vhdpath) != '/')
|
||||||
|
{
|
||||||
|
vhdpath++;
|
||||||
|
}
|
||||||
|
|
||||||
pathlen = sizeof(grub_uint16_t) * (grub_strlen(vhdpath) + 1);
|
pathlen = sizeof(grub_uint16_t) * (grub_strlen(vhdpath) + 1);
|
||||||
debug("unicode path for <%s> len:%d\n", vhdpath, (int)pathlen);
|
debug("unicode path for <%s> len:%d\n", vhdpath, (int)pathlen);
|
||||||
|
|
||||||
@@ -110,10 +114,10 @@ static int ventoy_vhd_patch_path(char *vhdpath, ventoy_patch_vhd *patch1, ventoy
|
|||||||
|
|
||||||
if (plat && (plat[0] == 'e')) /* UEFI */
|
if (plat && (plat[0] == 'e')) /* UEFI */
|
||||||
{
|
{
|
||||||
pos = g_vhdboot_isobuf + g_vhdboot_bcd_offset;
|
pos = g_vhdboot_isobuf + bcdoffset;
|
||||||
|
|
||||||
/* winload.exe ==> winload.efi */
|
/* winload.exe ==> winload.efi */
|
||||||
for (i = 0; i + (int)sizeof(winloadexe) < g_vhdboot_bcd_len; i++)
|
for (i = 0; i + (int)sizeof(winloadexe) < bcdlen; i++)
|
||||||
{
|
{
|
||||||
if (*((grub_uint32_t *)(pos + i)) == 0x00690077 &&
|
if (*((grub_uint32_t *)(pos + i)) == 0x00690077 &&
|
||||||
grub_memcmp(pos + i, winloadexe, sizeof(winloadexe)) == 0)
|
grub_memcmp(pos + i, winloadexe, sizeof(winloadexe)) == 0)
|
||||||
@@ -127,7 +131,8 @@ static int ventoy_vhd_patch_path(char *vhdpath, ventoy_patch_vhd *patch1, ventoy
|
|||||||
debug("winload patch %d times\n", cnt);
|
debug("winload patch %d times\n", cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (pos = vhdpath; *pos; pos++)
|
newpath = grub_strdup(vhdpath);
|
||||||
|
for (pos = newpath; *pos; pos++)
|
||||||
{
|
{
|
||||||
if (*pos == '/')
|
if (*pos == '/')
|
||||||
{
|
{
|
||||||
@@ -135,40 +140,159 @@ static int ventoy_vhd_patch_path(char *vhdpath, ventoy_patch_vhd *patch1, ventoy
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_utf8_to_utf16(unicode_path, pathlen, (grub_uint8_t *)vhdpath, -1, NULL);
|
grub_utf8_to_utf16(unicode_path, pathlen, (grub_uint8_t *)newpath, -1, NULL);
|
||||||
grub_memcpy(patch1->vhd_file_path, unicode_path, pathlen);
|
grub_memcpy(patch1->vhd_file_path, unicode_path, pathlen);
|
||||||
grub_memcpy(patch2->vhd_file_path, unicode_path, pathlen);
|
grub_memcpy(patch2->vhd_file_path, unicode_path, pathlen);
|
||||||
|
|
||||||
|
grub_free(newpath);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ventoy_vhd_patch_disk(ventoy_patch_vhd *patch1, ventoy_patch_vhd *patch2)
|
static int ventoy_vhd_read_parttbl(const char *filename, ventoy_gpt_info *gpt, int *index)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
int ret = 1;
|
||||||
|
grub_uint64_t start;
|
||||||
|
grub_file_t file = NULL;
|
||||||
|
grub_disk_t disk = NULL;
|
||||||
|
grub_uint8_t zeroguid[16] = {0};
|
||||||
|
|
||||||
|
file = grub_file_open(filename, VENTOY_FILE_TYPE);
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
disk = grub_disk_open(file->device->disk->name);
|
||||||
|
if (!disk)
|
||||||
|
{
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_disk_read(disk, 0, 0, sizeof(ventoy_gpt_info), gpt);
|
||||||
|
|
||||||
|
start = file->device->disk->partition->start;
|
||||||
|
|
||||||
|
if (grub_memcmp(gpt->Head.Signature, "EFI PART", 8) == 0)
|
||||||
|
{
|
||||||
|
debug("GPT part start: %llu\n", (ulonglong)start);
|
||||||
|
for (i = 0; i < 128; i++)
|
||||||
|
{
|
||||||
|
if (grub_memcmp(gpt->PartTbl[i].PartGuid, zeroguid, 16))
|
||||||
|
{
|
||||||
|
if (start == gpt->PartTbl[i].StartLBA)
|
||||||
|
{
|
||||||
|
*index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("MBR part start: %llu\n", (ulonglong)start);
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if ((grub_uint32_t)start == gpt->MBR.PartTbl[i].StartSectorId)
|
||||||
|
{
|
||||||
|
*index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
end:
|
||||||
|
check_free(file, grub_file_close);
|
||||||
|
check_free(disk, grub_disk_close);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ventoy_vhd_patch_disk(const char *vhdpath, ventoy_patch_vhd *patch1, ventoy_patch_vhd *patch2)
|
||||||
|
{
|
||||||
|
int partIndex = 0;
|
||||||
|
grub_uint64_t offset = 0;
|
||||||
char efipart[16] = {0};
|
char efipart[16] = {0};
|
||||||
|
ventoy_gpt_info *gpt = NULL;
|
||||||
|
|
||||||
grub_memcpy(efipart, g_ventoy_part_info->Head.Signature, sizeof(g_ventoy_part_info->Head.Signature));
|
if (vhdpath[0] == '/')
|
||||||
|
{
|
||||||
|
gpt = g_ventoy_part_info;
|
||||||
|
partIndex = 0;
|
||||||
|
debug("This is Ventoy ISO partIndex %d %s\n", partIndex, vhdpath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gpt = grub_zalloc(sizeof(ventoy_gpt_info));
|
||||||
|
ventoy_vhd_read_parttbl(vhdpath, gpt, &partIndex);
|
||||||
|
debug("This is HDD partIndex %d %s\n", partIndex, vhdpath);
|
||||||
|
}
|
||||||
|
|
||||||
debug("part1 type: 0x%x <%s>\n", g_ventoy_part_info->MBR.PartTbl[0].FsFlag, efipart);
|
grub_memcpy(efipart, gpt->Head.Signature, sizeof(gpt->Head.Signature));
|
||||||
|
|
||||||
|
grub_memset(patch1, 0, OFFSET_OF(ventoy_patch_vhd, vhd_file_path));
|
||||||
|
grub_memset(patch2, 0, OFFSET_OF(ventoy_patch_vhd, vhd_file_path));
|
||||||
|
|
||||||
if (grub_strncmp(efipart, "EFI PART", 8) == 0)
|
if (grub_strncmp(efipart, "EFI PART", 8) == 0)
|
||||||
{
|
{
|
||||||
ventoy_debug_dump_guid("GPT disk GUID: ", g_ventoy_part_info->Head.DiskGuid);
|
ventoy_debug_dump_guid("GPT disk GUID: ", gpt->Head.DiskGuid);
|
||||||
ventoy_debug_dump_guid("GPT part GUID: ", g_ventoy_part_info->PartTbl[0].PartGuid);
|
ventoy_debug_dump_guid("GPT partIndex GUID: ", gpt->PartTbl[partIndex].PartGuid);
|
||||||
|
|
||||||
grub_memcpy(patch1->disk_signature_or_guid, g_ventoy_part_info->Head.DiskGuid, 16);
|
grub_memcpy(patch1->disk_signature_or_guid, gpt->Head.DiskGuid, 16);
|
||||||
grub_memcpy(patch1->part_offset_or_guid, g_ventoy_part_info->PartTbl[0].PartGuid, 16);
|
grub_memcpy(patch1->part_offset_or_guid, gpt->PartTbl[partIndex].PartGuid, 16);
|
||||||
grub_memcpy(patch2->disk_signature_or_guid, g_ventoy_part_info->Head.DiskGuid, 16);
|
grub_memcpy(patch2->disk_signature_or_guid, gpt->Head.DiskGuid, 16);
|
||||||
grub_memcpy(patch2->part_offset_or_guid, g_ventoy_part_info->PartTbl[0].PartGuid, 16);
|
grub_memcpy(patch2->part_offset_or_guid, gpt->PartTbl[partIndex].PartGuid, 16);
|
||||||
|
|
||||||
patch1->part_type = patch2->part_type = 0;
|
patch1->part_type = patch2->part_type = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
debug("MBR disk signature: %02x%02x%02x%02x\n",
|
offset = gpt->MBR.PartTbl[partIndex].StartSectorId;
|
||||||
g_ventoy_part_info->MBR.BootCode[0x1b8 + 0], g_ventoy_part_info->MBR.BootCode[0x1b8 + 1],
|
offset *= 512;
|
||||||
g_ventoy_part_info->MBR.BootCode[0x1b8 + 2], g_ventoy_part_info->MBR.BootCode[0x1b8 + 3]);
|
|
||||||
grub_memcpy(patch1->disk_signature_or_guid, g_ventoy_part_info->MBR.BootCode + 0x1b8, 4);
|
debug("MBR disk signature: %02x%02x%02x%02x Part(%d) offset:%llu\n",
|
||||||
grub_memcpy(patch2->disk_signature_or_guid, g_ventoy_part_info->MBR.BootCode + 0x1b8, 4);
|
gpt->MBR.BootCode[0x1b8 + 0], gpt->MBR.BootCode[0x1b8 + 1],
|
||||||
|
gpt->MBR.BootCode[0x1b8 + 2], gpt->MBR.BootCode[0x1b8 + 3],
|
||||||
|
partIndex + 1, offset);
|
||||||
|
|
||||||
|
grub_memcpy(patch1->part_offset_or_guid, &offset, 8);
|
||||||
|
grub_memcpy(patch2->part_offset_or_guid, &offset, 8);
|
||||||
|
|
||||||
|
grub_memcpy(patch1->disk_signature_or_guid, gpt->MBR.BootCode + 0x1b8, 4);
|
||||||
|
grub_memcpy(patch2->disk_signature_or_guid, gpt->MBR.BootCode + 0x1b8, 4);
|
||||||
|
|
||||||
|
patch1->part_type = patch2->part_type = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gpt != g_ventoy_part_info)
|
||||||
|
{
|
||||||
|
grub_free(gpt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ventoy_find_vhdpatch_offset(int bcdoffset, int bcdlen, int *offset)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int cnt = 0;
|
||||||
|
grub_uint8_t *buf = (grub_uint8_t *)(g_vhdboot_isobuf + bcdoffset);
|
||||||
|
grub_uint8_t magic[16] = {
|
||||||
|
0x5C, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i = 0; i < bcdlen - 16 && cnt < 2; i++)
|
||||||
|
{
|
||||||
|
if (*(grub_uint32_t *)(buf + i) == 0x0058005C)
|
||||||
|
{
|
||||||
|
if (grub_memcmp(magic, buf + i, 16) == 0)
|
||||||
|
{
|
||||||
|
*offset++ = i - (int)OFFSET_OF(ventoy_patch_vhd, vhd_file_path);
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -177,6 +301,8 @@ static int ventoy_vhd_patch_disk(ventoy_patch_vhd *patch1, ventoy_patch_vhd *pat
|
|||||||
grub_err_t ventoy_cmd_patch_vhdboot(grub_extcmd_context_t ctxt, int argc, char **args)
|
grub_err_t ventoy_cmd_patch_vhdboot(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
int bcdoffset, bcdlen;
|
||||||
|
int patchoffset[2];
|
||||||
ventoy_patch_vhd *patch1;
|
ventoy_patch_vhd *patch1;
|
||||||
ventoy_patch_vhd *patch2;
|
ventoy_patch_vhd *patch2;
|
||||||
char envbuf[64];
|
char envbuf[64];
|
||||||
@@ -194,18 +320,39 @@ grub_err_t ventoy_cmd_patch_vhdboot(grub_extcmd_context_t ctxt, int argc, char *
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ventoy_vhd_find_bcd(&g_vhdboot_bcd_offset, &g_vhdboot_bcd_len);
|
rc = ventoy_vhd_find_bcd(&bcdoffset, &bcdlen, "/boot/bcd");
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
debug("failed to get bcd location %d\n", rc);
|
debug("failed to get bcd location %d\n", rc);
|
||||||
return 0;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ventoy_find_vhdpatch_offset(bcdoffset, bcdlen, patchoffset);
|
||||||
|
patch1 = (ventoy_patch_vhd *)(g_vhdboot_isobuf + bcdoffset + patchoffset[0]);
|
||||||
|
patch2 = (ventoy_patch_vhd *)(g_vhdboot_isobuf + bcdoffset + patchoffset[1]);
|
||||||
|
|
||||||
|
debug("Find /boot/bcd (%d %d) now patch it (offset: 0x%x 0x%x) ...\n",
|
||||||
|
bcdoffset, bcdlen, patchoffset[0], patchoffset[1]);
|
||||||
|
ventoy_vhd_patch_disk(args[0], patch1, patch2);
|
||||||
|
ventoy_vhd_patch_path(args[0], patch1, patch2, bcdoffset, bcdlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
patch1 = (ventoy_patch_vhd *)(g_vhdboot_isobuf + g_vhdboot_bcd_offset + 0x495a);
|
rc = ventoy_vhd_find_bcd(&bcdoffset, &bcdlen, "/boot/BCD");
|
||||||
patch2 = (ventoy_patch_vhd *)(g_vhdboot_isobuf + g_vhdboot_bcd_offset + 0x50aa);
|
if (rc)
|
||||||
|
{
|
||||||
ventoy_vhd_patch_disk(patch1, patch2);
|
debug("No file /boot/BCD \n");
|
||||||
ventoy_vhd_patch_path(args[0], patch1, patch2);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ventoy_find_vhdpatch_offset(bcdoffset, bcdlen, patchoffset);
|
||||||
|
patch1 = (ventoy_patch_vhd *)(g_vhdboot_isobuf + bcdoffset + patchoffset[0]);
|
||||||
|
patch2 = (ventoy_patch_vhd *)(g_vhdboot_isobuf + bcdoffset + patchoffset[1]);
|
||||||
|
|
||||||
|
debug("Find /boot/BCD (%d %d) now patch it (offset: 0x%x 0x%x) ...\n",
|
||||||
|
bcdoffset, bcdlen, patchoffset[0], patchoffset[1]);
|
||||||
|
ventoy_vhd_patch_disk(args[0], patch1, patch2);
|
||||||
|
ventoy_vhd_patch_path(args[0], patch1, patch2, bcdoffset, bcdlen);
|
||||||
|
}
|
||||||
|
|
||||||
/* set buffer and size */
|
/* set buffer and size */
|
||||||
#ifdef GRUB_MACHINE_EFI
|
#ifdef GRUB_MACHINE_EFI
|
||||||
@@ -220,7 +367,7 @@ grub_err_t ventoy_cmd_patch_vhdboot(grub_extcmd_context_t ctxt, int argc, char *
|
|||||||
grub_env_set("vtoy_vhd_buf_size", envbuf);
|
grub_env_set("vtoy_vhd_buf_size", envbuf);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_err_t ventoy_cmd_load_vhdboot(grub_extcmd_context_t ctxt, int argc, char **args)
|
grub_err_t ventoy_cmd_load_vhdboot(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
@@ -396,7 +543,7 @@ grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char *
|
|||||||
}
|
}
|
||||||
|
|
||||||
grub_env_set(args[1], type);
|
grub_env_set(args[1], type);
|
||||||
debug("<%s> vtoy type: <%s> ", args[0], type);
|
debug("<%s> vtoy type: <%s> offset:%d\n", args[0], type, offset);
|
||||||
|
|
||||||
if (offset >= 0)
|
if (offset >= 0)
|
||||||
{
|
{
|
||||||
@@ -451,6 +598,14 @@ grub_err_t ventoy_cmd_get_vtoy_type(grub_extcmd_context_t ctxt, int argc, char *
|
|||||||
altboot = 1;
|
altboot = 1;
|
||||||
grub_env_set(args[3], "1");
|
grub_env_set(args[3], "1");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("offset data=0x%x\n", data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("BootCode: 0x%x\n", gpt->MBR.BootCode[92]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -314,6 +314,91 @@ static int ventoy_is_pe64(grub_uint8_t *buffer)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grub_err_t ventoy_cmd_is_pe64(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
int ret = 1;
|
||||||
|
grub_file_t file;
|
||||||
|
grub_uint8_t buf[512];
|
||||||
|
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
|
||||||
|
file = grub_file_open(args[0], VENTOY_FILE_TYPE);
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_memset(buf, 0, 512);
|
||||||
|
grub_file_read(file, buf, 512);
|
||||||
|
if (ventoy_is_pe64(buf))
|
||||||
|
{
|
||||||
|
debug("%s is PE64\n", args[0]);
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("%s is PE32\n", args[0]);
|
||||||
|
}
|
||||||
|
grub_file_close(file);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_err_t ventoy_cmd_sel_wimboot(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
char *buf = NULL;
|
||||||
|
char configfile[128];
|
||||||
|
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
(void)args;
|
||||||
|
|
||||||
|
debug("select wimboot argc:%d\n", argc);
|
||||||
|
|
||||||
|
buf = (char *)grub_malloc(8192);
|
||||||
|
if (!buf)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = (int)grub_snprintf(buf, 8192,
|
||||||
|
"menuentry \"Windows Setup (32-bit)\" {\n"
|
||||||
|
" set vtoy_wimboot_sel=32\n"
|
||||||
|
"}\n"
|
||||||
|
"menuentry \"Windows Setup (64-bit)\" {\n"
|
||||||
|
" set vtoy_wimboot_sel=64\n"
|
||||||
|
"}\n"
|
||||||
|
);
|
||||||
|
buf[size] = 0;
|
||||||
|
|
||||||
|
g_ventoy_menu_esc = 1;
|
||||||
|
g_ventoy_suppress_esc = 1;
|
||||||
|
g_ventoy_suppress_esc_default = 1;
|
||||||
|
|
||||||
|
grub_snprintf(configfile, sizeof(configfile), "configfile mem:0x%llx:size:%d", (ulonglong)(ulong)buf, size);
|
||||||
|
grub_script_execute_sourcecode(configfile);
|
||||||
|
|
||||||
|
g_ventoy_menu_esc = 0;
|
||||||
|
g_ventoy_suppress_esc = 0;
|
||||||
|
|
||||||
|
grub_free(buf);
|
||||||
|
|
||||||
|
if (g_ventoy_last_entry == 0)
|
||||||
|
{
|
||||||
|
debug("last entry=%d %s=32\n", g_ventoy_last_entry, args[0]);
|
||||||
|
grub_env_set(args[0], "32");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("last entry=%d %s=64\n", g_ventoy_last_entry, args[0]);
|
||||||
|
grub_env_set(args[0], "64");
|
||||||
|
}
|
||||||
|
|
||||||
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char **args)
|
grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
wim_patch *next = NULL;
|
wim_patch *next = NULL;
|
||||||
@@ -464,6 +549,8 @@ static int ventoy_read_resource(grub_file_t fp, wim_header *wimhdr, wim_resource
|
|||||||
chunk_num = (head->raw_size + WIM_CHUNK_LEN - 1) / WIM_CHUNK_LEN;
|
chunk_num = (head->raw_size + WIM_CHUNK_LEN - 1) / WIM_CHUNK_LEN;
|
||||||
cur_offset = (chunk_num - 1) * 4;
|
cur_offset = (chunk_num - 1) * 4;
|
||||||
chunk_offset = (grub_uint32_t *)buffer_compress;
|
chunk_offset = (grub_uint32_t *)buffer_compress;
|
||||||
|
|
||||||
|
//debug("%llu %llu chunk_num=%lu", (ulonglong)head->size_in_wim, (ulonglong)head->raw_size, chunk_num);
|
||||||
|
|
||||||
cur_dst = buffer_decompress;
|
cur_dst = buffer_decompress;
|
||||||
|
|
||||||
@@ -516,9 +603,11 @@ static int ventoy_read_resource(grub_file_t fp, wim_header *wimhdr, wim_resource
|
|||||||
decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, head->size_in_wim - cur_offset, cur_dst);
|
decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, head->size_in_wim - cur_offset, cur_dst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_dst += decompress_len;
|
cur_dst += decompress_len;
|
||||||
total_decompress += decompress_len;
|
total_decompress += decompress_len;
|
||||||
|
|
||||||
|
//debug("last chunk_size:%u decompresslen:%d tot:%d\n", last_chunk_size, decompress_len, total_decompress);
|
||||||
|
|
||||||
if (cur_dst != buffer_decompress + head->raw_size)
|
if (cur_dst != buffer_decompress + head->raw_size)
|
||||||
{
|
{
|
||||||
@@ -570,30 +659,6 @@ static wim_directory_entry * search_full_wim_dirent
|
|||||||
return search;
|
return search;
|
||||||
}
|
}
|
||||||
|
|
||||||
static wim_directory_entry * search_replace_wim_dirent(void *meta_data, wim_directory_entry *dir)
|
|
||||||
{
|
|
||||||
wim_directory_entry *wim_dirent = NULL;
|
|
||||||
const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL };
|
|
||||||
//const char *native_path[] = { "Windows", "System32", "native.exe", NULL };
|
|
||||||
|
|
||||||
wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
|
|
||||||
debug("search winpeshl.exe %p\n", wim_dirent);
|
|
||||||
if (wim_dirent)
|
|
||||||
{
|
|
||||||
return wim_dirent;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
wim_dirent = search_full_wim_dirent(meta_data, dir, native_path);
|
|
||||||
debug("search native.exe %p\n", wim_dirent);
|
|
||||||
if (wim_dirent)
|
|
||||||
{
|
|
||||||
return wim_dirent;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static wim_lookup_entry * ventoy_find_look_entry(wim_header *header, wim_lookup_entry *lookup, wim_hash *hash)
|
static wim_lookup_entry * ventoy_find_look_entry(wim_header *header, wim_lookup_entry *lookup, wim_hash *hash)
|
||||||
@@ -611,6 +676,245 @@ static wim_lookup_entry * ventoy_find_look_entry(wim_header *header, wim_lookup_
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int parse_registry_setup_cmdline
|
||||||
|
(
|
||||||
|
grub_file_t file,
|
||||||
|
wim_header *head,
|
||||||
|
wim_lookup_entry *lookup,
|
||||||
|
void *meta_data,
|
||||||
|
wim_directory_entry *dir,
|
||||||
|
char *buf,
|
||||||
|
grub_uint32_t buflen
|
||||||
|
)
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
int ret = 0;
|
||||||
|
grub_uint32_t i = 0;
|
||||||
|
grub_uint32_t reglen = 0;
|
||||||
|
wim_hash zerohash;
|
||||||
|
reg_vk *regvk = NULL;
|
||||||
|
wim_lookup_entry *look = NULL;
|
||||||
|
wim_directory_entry *wim_dirent = NULL;
|
||||||
|
char *decompress_data = NULL;
|
||||||
|
const char *reg_path[] = { "Windows", "System32", "config", "SYSTEM", NULL };
|
||||||
|
|
||||||
|
wim_dirent = search_full_wim_dirent(meta_data, dir, reg_path);
|
||||||
|
debug("search reg SYSTEM %p\n", wim_dirent);
|
||||||
|
if (!wim_dirent)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_memset(&zerohash, 0, sizeof(zerohash));
|
||||||
|
if (grub_memcmp(&zerohash, wim_dirent->hash.sha1, sizeof(wim_hash)) == 0)
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
look = ventoy_find_look_entry(head, lookup, &wim_dirent->hash);
|
||||||
|
if (!look)
|
||||||
|
{
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
reglen = (grub_uint32_t)look->resource.raw_size;
|
||||||
|
debug("find system lookup entry_id:%ld raw_size:%u\n",
|
||||||
|
((long)look - (long)lookup) / sizeof(wim_lookup_entry), reglen);
|
||||||
|
|
||||||
|
if (0 != ventoy_read_resource(file, head, &(look->resource), (void **)&(decompress_data)))
|
||||||
|
{
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_strncmp(decompress_data + 0x1000, "hbin", 4))
|
||||||
|
{
|
||||||
|
ret_goto_end(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0x1000; i + sizeof(reg_vk) < reglen; i += 8)
|
||||||
|
{
|
||||||
|
regvk = (reg_vk *)(decompress_data + i);
|
||||||
|
if (regvk->sig == 0x6B76 && regvk->namesize == 7 &&
|
||||||
|
regvk->datatype == 1 && regvk->flag == 1)
|
||||||
|
{
|
||||||
|
if (grub_strncasecmp((char *)(regvk + 1), "cmdline", 7) == 0)
|
||||||
|
{
|
||||||
|
debug("find registry cmdline i:%u offset:(0x%x)%u size:(0x%x)%u\n",
|
||||||
|
i, regvk->dataoffset, regvk->dataoffset, regvk->datasize, regvk->datasize);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i + sizeof(reg_vk) >= reglen || regvk == NULL)
|
||||||
|
{
|
||||||
|
ret_goto_end(6);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (regvk->datasize == 0 || (regvk->datasize & 0x80000000) > 0 ||
|
||||||
|
regvk->dataoffset == 0 || regvk->dataoffset == 0xFFFFFFFF)
|
||||||
|
{
|
||||||
|
ret_goto_end(7);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (regvk->datasize / 2 >= buflen)
|
||||||
|
{
|
||||||
|
ret_goto_end(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("start offset is 0x%x(%u)\n", 0x1000 + regvk->dataoffset + 4, 0x1000 + regvk->dataoffset + 4);
|
||||||
|
|
||||||
|
for (i = 0; i < regvk->datasize; i+=2)
|
||||||
|
{
|
||||||
|
c = (char)(*(grub_uint16_t *)(decompress_data + 0x1000 + regvk->dataoffset + 4 + i));
|
||||||
|
*buf++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
end:
|
||||||
|
grub_check_free(decompress_data);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parse_custom_setup_path(char *cmdline, const char **path, char *exefile)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int len = 0;
|
||||||
|
char *pos1 = NULL;
|
||||||
|
char *pos2 = NULL;
|
||||||
|
|
||||||
|
if ((cmdline[0] == 'x' || cmdline[0] == 'X') && cmdline[1] == ':')
|
||||||
|
{
|
||||||
|
pos1 = pos2 = cmdline + 3;
|
||||||
|
|
||||||
|
while (i < VTOY_MAX_DIR_DEPTH && *pos2)
|
||||||
|
{
|
||||||
|
while (*pos2 && *pos2 != '\\' && *pos2 != '/')
|
||||||
|
{
|
||||||
|
pos2++;
|
||||||
|
}
|
||||||
|
|
||||||
|
path[i++] = pos1;
|
||||||
|
|
||||||
|
if (*pos2 == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pos2 = 0;
|
||||||
|
pos1 = pos2 + 1;
|
||||||
|
pos2 = pos1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == 0 || i >= VTOY_MAX_DIR_DEPTH)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
path[i++] = "Windows";
|
||||||
|
path[i++] = "System32";
|
||||||
|
path[i++] = cmdline;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos1 = (char *)path[i - 1];
|
||||||
|
while (*pos1 != ' ' && *pos1 != '\t' && *pos1)
|
||||||
|
{
|
||||||
|
pos1++;
|
||||||
|
}
|
||||||
|
*pos1 = 0;
|
||||||
|
|
||||||
|
len = (int)grub_strlen(path[i - 1]);
|
||||||
|
if (len < 4 || grub_strcasecmp(path[i - 1] + len - 4, ".exe") != 0)
|
||||||
|
{
|
||||||
|
grub_snprintf(exefile, 256, "%s.exe", path[i - 1]);
|
||||||
|
path[i - 1] = exefile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
debug("custom setup: %d <%s>\n", i, path[i - 1]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static wim_directory_entry * search_replace_wim_dirent
|
||||||
|
(
|
||||||
|
grub_file_t file,
|
||||||
|
wim_header *head,
|
||||||
|
wim_lookup_entry *lookup,
|
||||||
|
void *meta_data,
|
||||||
|
wim_directory_entry *dir
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char exefile[256] = {0};
|
||||||
|
char cmdline[256] = {0};
|
||||||
|
wim_directory_entry *wim_dirent = NULL;
|
||||||
|
wim_directory_entry *pecmd_dirent = NULL;
|
||||||
|
const char *peset_path[] = { "Windows", "System32", "peset.exe", NULL };
|
||||||
|
const char *pecmd_path[] = { "Windows", "System32", "pecmd.exe", NULL };
|
||||||
|
const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL };
|
||||||
|
const char *custom_path[VTOY_MAX_DIR_DEPTH + 1] = { NULL };
|
||||||
|
|
||||||
|
pecmd_dirent = search_full_wim_dirent(meta_data, dir, pecmd_path);
|
||||||
|
debug("search pecmd.exe %p\n", pecmd_dirent);
|
||||||
|
|
||||||
|
if (pecmd_dirent)
|
||||||
|
{
|
||||||
|
ret = parse_registry_setup_cmdline(file, head, lookup, meta_data, dir, cmdline, sizeof(cmdline) - 1);
|
||||||
|
if (0 == ret)
|
||||||
|
{
|
||||||
|
debug("registry setup cmdline:<%s>\n", cmdline);
|
||||||
|
|
||||||
|
if (grub_strncasecmp(cmdline, "PECMD", 5) == 0)
|
||||||
|
{
|
||||||
|
wim_dirent = pecmd_dirent;
|
||||||
|
}
|
||||||
|
else if (grub_strncasecmp(cmdline, "PESET", 5) == 0)
|
||||||
|
{
|
||||||
|
wim_dirent = search_full_wim_dirent(meta_data, dir, peset_path);
|
||||||
|
debug("search peset.exe %p\n", wim_dirent);
|
||||||
|
}
|
||||||
|
else if (grub_strncasecmp(cmdline, "WINPESHL", 8) == 0)
|
||||||
|
{
|
||||||
|
wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
|
||||||
|
debug("search winpeshl.exe %p\n", wim_dirent);
|
||||||
|
}
|
||||||
|
else if (0 == parse_custom_setup_path(cmdline, custom_path, exefile))
|
||||||
|
{
|
||||||
|
wim_dirent = search_full_wim_dirent(meta_data, dir, custom_path);
|
||||||
|
debug("search custom path %p\n", wim_dirent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wim_dirent)
|
||||||
|
{
|
||||||
|
return wim_dirent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("registry setup cmdline failed : %d\n", ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wim_dirent = pecmd_dirent;
|
||||||
|
if (wim_dirent)
|
||||||
|
{
|
||||||
|
return wim_dirent;
|
||||||
|
}
|
||||||
|
|
||||||
|
wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
|
||||||
|
debug("search winpeshl.exe %p\n", wim_dirent);
|
||||||
|
if (wim_dirent)
|
||||||
|
{
|
||||||
|
return wim_dirent;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static wim_lookup_entry * ventoy_find_meta_entry(wim_header *header, wim_lookup_entry *lookup)
|
static wim_lookup_entry * ventoy_find_meta_entry(wim_header *header, wim_lookup_entry *lookup)
|
||||||
{
|
{
|
||||||
grub_uint32_t i = 0;
|
grub_uint32_t i = 0;
|
||||||
@@ -636,6 +940,42 @@ static wim_lookup_entry * ventoy_find_meta_entry(wim_header *header, wim_lookup_
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_uint64_t ventoy_get_stream_len(wim_directory_entry *dir)
|
||||||
|
{
|
||||||
|
grub_uint16_t i;
|
||||||
|
grub_uint64_t offset = 0;
|
||||||
|
wim_stream_entry *stream = (wim_stream_entry *)((char *)dir + dir->len);
|
||||||
|
|
||||||
|
for (i = 0; i < dir->streams; i++)
|
||||||
|
{
|
||||||
|
offset += stream->len;
|
||||||
|
stream = (wim_stream_entry *)((char *)stream + stream->len);
|
||||||
|
}
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ventoy_update_stream_hash(wim_patch *patch, wim_directory_entry *dir)
|
||||||
|
{
|
||||||
|
grub_uint16_t i;
|
||||||
|
grub_uint64_t offset = 0;
|
||||||
|
wim_stream_entry *stream = (wim_stream_entry *)((char *)dir + dir->len);
|
||||||
|
|
||||||
|
for (i = 0; i < dir->streams; i++)
|
||||||
|
{
|
||||||
|
if (grub_memcmp(stream->hash.sha1, patch->old_hash.sha1, sizeof(wim_hash)) == 0)
|
||||||
|
{
|
||||||
|
debug("find target stream %u, name_len:%u upadte hash\n", i, stream->name_len);
|
||||||
|
grub_memcpy(stream->hash.sha1, &(patch->wim_data.bin_hash), sizeof(wim_hash));
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += stream->len;
|
||||||
|
stream = (wim_stream_entry *)((char *)stream + stream->len);
|
||||||
|
}
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directory_entry *dir)
|
static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directory_entry *dir)
|
||||||
{
|
{
|
||||||
if ((meta_data == NULL) || (dir == NULL))
|
if ((meta_data == NULL) || (dir == NULL))
|
||||||
@@ -660,8 +1000,16 @@ static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directo
|
|||||||
{
|
{
|
||||||
ventoy_update_all_hash(patch, meta_data, (wim_directory_entry *)((char *)meta_data + dir->subdir));
|
ventoy_update_all_hash(patch, meta_data, (wim_directory_entry *)((char *)meta_data + dir->subdir));
|
||||||
}
|
}
|
||||||
|
|
||||||
dir = (wim_directory_entry *)((char *)dir + dir->len);
|
if (dir->streams)
|
||||||
|
{
|
||||||
|
ventoy_update_stream_hash(patch, dir);
|
||||||
|
dir = (wim_directory_entry *)((char *)dir + dir->len + ventoy_get_stream_len(dir));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dir = (wim_directory_entry *)((char *)dir + dir->len);
|
||||||
|
}
|
||||||
} while (dir->len >= sizeof(wim_directory_entry));
|
} while (dir->len >= sizeof(wim_directory_entry));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -702,6 +1050,7 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath)
|
|||||||
{
|
{
|
||||||
char *pos = NULL;
|
char *pos = NULL;
|
||||||
char *script = NULL;
|
char *script = NULL;
|
||||||
|
const char *env = NULL;
|
||||||
ventoy_windows_data *data = (ventoy_windows_data *)buf;
|
ventoy_windows_data *data = (ventoy_windows_data *)buf;
|
||||||
|
|
||||||
grub_memset(data, 0, sizeof(ventoy_windows_data));
|
grub_memset(data, 0, sizeof(ventoy_windows_data));
|
||||||
@@ -740,7 +1089,13 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath)
|
|||||||
{
|
{
|
||||||
debug("injection archive not configed %s\n", pos);
|
debug("injection archive not configed %s\n", pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
env = grub_env_get("VTOY_WIN11_BYPASS_CHECK");
|
||||||
|
if (env && env[0] == '1' && env[1] == 0)
|
||||||
|
{
|
||||||
|
data->windows11_bypass_check = 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -776,7 +1131,14 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath)
|
|||||||
grub_crypto_hash(GRUB_MD_SHA1, wim_data->bin_hash.sha1, wim_data->jump_bin_data, wim_data->bin_raw_len);
|
grub_crypto_hash(GRUB_MD_SHA1, wim_data->bin_hash.sha1, wim_data->jump_bin_data, wim_data->bin_raw_len);
|
||||||
|
|
||||||
security = (wim_security_header *)wim_data->new_meta_data;
|
security = (wim_security_header *)wim_data->new_meta_data;
|
||||||
rootdir = (wim_directory_entry *)(wim_data->new_meta_data + ((security->len + 7) & 0xFFFFFFF8U));
|
if (security->len > 0)
|
||||||
|
{
|
||||||
|
rootdir = (wim_directory_entry *)(wim_data->new_meta_data + ((security->len + 7) & 0xFFFFFFF8U));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rootdir = (wim_directory_entry *)(wim_data->new_meta_data + 8);
|
||||||
|
}
|
||||||
|
|
||||||
/* update all winpeshl.exe dirent entry's hash */
|
/* update all winpeshl.exe dirent entry's hash */
|
||||||
ventoy_update_all_hash(node, wim_data->new_meta_data, rootdir);
|
ventoy_update_all_hash(node, wim_data->new_meta_data, rootdir);
|
||||||
@@ -809,6 +1171,7 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath)
|
|||||||
static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
|
static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
grub_uint16_t i;
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
grub_uint32_t exe_len;
|
grub_uint32_t exe_len;
|
||||||
grub_uint8_t *exe_data = NULL;
|
grub_uint8_t *exe_data = NULL;
|
||||||
@@ -817,6 +1180,7 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
|
|||||||
wim_security_header *security = NULL;
|
wim_security_header *security = NULL;
|
||||||
wim_directory_entry *rootdir = NULL;
|
wim_directory_entry *rootdir = NULL;
|
||||||
wim_directory_entry *search = NULL;
|
wim_directory_entry *search = NULL;
|
||||||
|
wim_stream_entry *stream = NULL;
|
||||||
wim_header *head = &(patch->wim_data.wim_header);
|
wim_header *head = &(patch->wim_data.wim_header);
|
||||||
wim_tail *wim_data = &patch->wim_data;
|
wim_tail *wim_data = &patch->wim_data;
|
||||||
|
|
||||||
@@ -860,10 +1224,25 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
security = (wim_security_header *)decompress_data;
|
security = (wim_security_header *)decompress_data;
|
||||||
rootdir = (wim_directory_entry *)(decompress_data + ((security->len + 7) & 0xFFFFFFF8U));
|
if (security->len > 0)
|
||||||
|
{
|
||||||
|
rootdir = (wim_directory_entry *)(decompress_data + ((security->len + 7) & 0xFFFFFFF8U));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rootdir = (wim_directory_entry *)(decompress_data + 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
debug("read lookup offset:%llu size:%llu\n", (ulonglong)head->lookup.offset, (ulonglong)head->lookup.raw_size);
|
||||||
|
lookup = grub_malloc(head->lookup.raw_size);
|
||||||
|
grub_file_seek(file, head->lookup.offset);
|
||||||
|
grub_file_read(file, lookup, head->lookup.raw_size);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* search winpeshl.exe dirent entry */
|
/* search winpeshl.exe dirent entry */
|
||||||
search = search_replace_wim_dirent(decompress_data, rootdir);
|
search = search_replace_wim_dirent(file, head, lookup, decompress_data, rootdir);
|
||||||
if (!search)
|
if (!search)
|
||||||
{
|
{
|
||||||
debug("Failed to find replace file %p\n", search);
|
debug("Failed to find replace file %p\n", search);
|
||||||
@@ -872,14 +1251,30 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
debug("find replace file at %p\n", search);
|
debug("find replace file at %p\n", search);
|
||||||
|
|
||||||
|
grub_memset(&patch->old_hash, 0, sizeof(wim_hash));
|
||||||
|
if (grub_memcmp(&patch->old_hash, search->hash.sha1, sizeof(wim_hash)) == 0)
|
||||||
|
{
|
||||||
|
debug("search hash all 0, now do deep search\n");
|
||||||
|
stream = (wim_stream_entry *)((char *)search + search->len);
|
||||||
|
for (i = 0; i < search->streams; i++)
|
||||||
|
{
|
||||||
|
if (stream->name_len == 0)
|
||||||
|
{
|
||||||
|
grub_memcpy(&patch->old_hash, stream->hash.sha1, sizeof(wim_hash));
|
||||||
|
debug("new search hash: %02x %02x %02x %02x %02x %02x %02x %02x\n",
|
||||||
|
ventoy_varg_8(patch->old_hash.sha1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
stream = (wim_stream_entry *)((char *)stream + stream->len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_memcpy(&patch->old_hash, search->hash.sha1, sizeof(wim_hash));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
grub_memcpy(&patch->old_hash, search->hash.sha1, sizeof(wim_hash));
|
|
||||||
|
|
||||||
debug("read lookup offset:%llu size:%llu\n", (ulonglong)head->lookup.offset, (ulonglong)head->lookup.raw_size);
|
|
||||||
lookup = grub_malloc(head->lookup.raw_size);
|
|
||||||
grub_file_seek(file, head->lookup.offset);
|
|
||||||
grub_file_read(file, lookup, head->lookup.raw_size);
|
|
||||||
|
|
||||||
/* find and extact winpeshl.exe */
|
/* find and extact winpeshl.exe */
|
||||||
patch->replace_look = ventoy_find_look_entry(head, lookup, &patch->old_hash);
|
patch->replace_look = ventoy_find_look_entry(head, lookup, &patch->old_hash);
|
||||||
if (patch->replace_look)
|
if (patch->replace_look)
|
||||||
@@ -900,8 +1295,8 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
debug("failed to find lookup entry for replace file 0x%02x 0x%02x\n",
|
debug("failed to find lookup entry for replace file %02x %02x %02x %02x\n",
|
||||||
patch->old_hash.sha1[0], patch->old_hash.sha1[1]);
|
ventoy_varg_4(patch->old_hash.sha1));
|
||||||
}
|
}
|
||||||
|
|
||||||
wim_data->wim_raw_size = (grub_uint32_t)file->size;
|
wim_data->wim_raw_size = (grub_uint32_t)file->size;
|
||||||
@@ -1054,7 +1449,48 @@ static void ventoy_windows_fill_override_data_iso9660( grub_uint64_t isosize,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, void *override)
|
static int ventoy_windows_fill_udf_short_ad(grub_file_t isofile, grub_uint32_t curpos,
|
||||||
|
wim_tail *wim_data, grub_uint32_t new_wim_size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
grub_uint32_t total = 0;
|
||||||
|
grub_uint32_t left_size = 0;
|
||||||
|
ventoy_udf_override *udf = NULL;
|
||||||
|
ventoy_udf_override tmp[4];
|
||||||
|
|
||||||
|
grub_memset(tmp, 0, sizeof(tmp));
|
||||||
|
grub_file_seek(isofile, wim_data->override_offset);
|
||||||
|
grub_file_read(isofile, tmp, sizeof(tmp));
|
||||||
|
|
||||||
|
left_size = new_wim_size;
|
||||||
|
udf = (ventoy_udf_override *)wim_data->override_data;
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
total += tmp[i].length;
|
||||||
|
if (total >= wim_data->wim_raw_size)
|
||||||
|
{
|
||||||
|
udf->length = left_size;
|
||||||
|
udf->position = curpos;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
udf->length = tmp[i].length;
|
||||||
|
udf->position = curpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
left_size -= tmp[i].length;
|
||||||
|
curpos += udf->length / 2048;
|
||||||
|
udf++;
|
||||||
|
wim_data->override_len += sizeof(ventoy_udf_override);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("######## Too many udf ad ######\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ventoy_windows_fill_override_data_udf(grub_file_t isofile, void *override)
|
||||||
{
|
{
|
||||||
grub_uint32_t data32;
|
grub_uint32_t data32;
|
||||||
grub_uint64_t data64;
|
grub_uint64_t data64;
|
||||||
@@ -1065,9 +1501,8 @@ static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, voi
|
|||||||
ventoy_override_chunk *cur;
|
ventoy_override_chunk *cur;
|
||||||
wim_patch *node = NULL;
|
wim_patch *node = NULL;
|
||||||
wim_tail *wim_data = NULL;
|
wim_tail *wim_data = NULL;
|
||||||
ventoy_udf_override *udf = NULL;
|
|
||||||
|
|
||||||
sector = (isosize + 2047) / 2048;
|
sector = (isofile->size + 2047) / 2048;
|
||||||
|
|
||||||
cur = (ventoy_override_chunk *)override;
|
cur = (ventoy_override_chunk *)override;
|
||||||
|
|
||||||
@@ -1077,7 +1512,7 @@ static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, voi
|
|||||||
cur++;
|
cur++;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("ventoy_windows_fill_override_data_udf %lu\n", (ulong)isosize);
|
debug("ventoy_windows_fill_override_data_udf %lu\n", (ulong)isofile->size);
|
||||||
|
|
||||||
for (node = g_wim_patch_head; node; node = node->next)
|
for (node = g_wim_patch_head; node; node = node->next)
|
||||||
{
|
{
|
||||||
@@ -1118,13 +1553,11 @@ static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, voi
|
|||||||
data64 = new_wim_size;
|
data64 = new_wim_size;
|
||||||
grub_memcpy(cur->override_data, &(data64), 8);
|
grub_memcpy(cur->override_data, &(data64), 8);
|
||||||
|
|
||||||
udf = (ventoy_udf_override *)wim_data->override_data;
|
/* override 3: position and length in extend data */
|
||||||
udf->length = new_wim_size;
|
ventoy_windows_fill_udf_short_ad(isofile, (grub_uint32_t)sector - udf_start_block, wim_data, new_wim_size);
|
||||||
udf->position = (grub_uint32_t)sector - udf_start_block;
|
|
||||||
|
|
||||||
sector += (new_wim_size / 2048);
|
sector += (new_wim_size / 2048);
|
||||||
|
|
||||||
/* override 3: position and length in extend data */
|
|
||||||
cur++;
|
cur++;
|
||||||
cur->img_offset = wim_data->override_offset;
|
cur->img_offset = wim_data->override_offset;
|
||||||
cur->override_size = wim_data->override_len;
|
cur->override_size = wim_data->override_len;
|
||||||
@@ -1301,6 +1734,54 @@ end:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
grub_uint32_t size = 0;
|
||||||
|
const char *addr = NULL;
|
||||||
|
ventoy_chain_head *chain = NULL;
|
||||||
|
ventoy_os_param *param = NULL;
|
||||||
|
char envbuf[64];
|
||||||
|
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
(void)args;
|
||||||
|
|
||||||
|
addr = grub_env_get("vtoy_chain_mem_addr");
|
||||||
|
if (!addr)
|
||||||
|
{
|
||||||
|
debug("Failed to find vtoy_chain_mem_addr\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
chain = (ventoy_chain_head *)(void *)grub_strtoul(addr, NULL, 16);
|
||||||
|
|
||||||
|
if (grub_memcmp(&g_ventoy_guid, &chain->os_param.guid, 16) != 0)
|
||||||
|
{
|
||||||
|
debug("os_param.guid not match\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = sizeof(ventoy_os_param) + sizeof(ventoy_windows_data);
|
||||||
|
param = (ventoy_os_param *)grub_zalloc(size);
|
||||||
|
if (!param)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_memcpy(param, &chain->os_param, sizeof(ventoy_os_param));
|
||||||
|
ventoy_fill_windows_rtdata(param + 1, param->vtoy_img_path);
|
||||||
|
|
||||||
|
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)param);
|
||||||
|
grub_env_set("vtoy_wimboot_mem_addr", envbuf);
|
||||||
|
debug("vtoy_wimboot_mem_addr: %s\n", envbuf);
|
||||||
|
|
||||||
|
grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
|
||||||
|
grub_env_set("vtoy_wimboot_mem_size", envbuf);
|
||||||
|
debug("vtoy_wimboot_mem_size: %s\n", envbuf);
|
||||||
|
|
||||||
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
|
grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
int unknown_image = 0;
|
int unknown_image = 0;
|
||||||
@@ -1470,7 +1951,7 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ventoy_windows_fill_override_data_udf(isosize, (char *)chain + chain->override_chunk_offset);
|
ventoy_windows_fill_override_data_udf(file, (char *)chain + chain->override_chunk_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* part 5: virt chunk */
|
/* part 5: virt chunk */
|
||||||
@@ -1733,3 +2214,29 @@ grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char
|
|||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ventoy_chain_file_size(const char *path)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
grub_file_t file;
|
||||||
|
|
||||||
|
file = grub_file_open(path, VENTOY_FILE_TYPE);
|
||||||
|
size = (int)(file->size);
|
||||||
|
|
||||||
|
grub_file_close(file);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ventoy_chain_file_read(const char *path, int offset, int len, void *buf)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
grub_file_t file;
|
||||||
|
|
||||||
|
file = grub_file_open(path, VENTOY_FILE_TYPE);
|
||||||
|
grub_file_seek(file, offset);
|
||||||
|
size = grub_file_read(file, buf, len);
|
||||||
|
grub_file_close(file);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
56
GRUB2/MOD_SRC/grub-2.04/include/grub/cache.h
Normal file
56
GRUB2/MOD_SRC/grub-2.04/include/grub/cache.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/* cache.h - Flush the processor's cache. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2004,2007 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_CACHE_H
|
||||||
|
#define GRUB_CACHE_H 1
|
||||||
|
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
#include <grub/types.h>
|
||||||
|
|
||||||
|
#if defined (__i386__) || defined (__x86_64__)
|
||||||
|
static inline void
|
||||||
|
grub_arch_sync_caches (void *address __attribute__ ((unused)),
|
||||||
|
grub_size_t len __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void EXPORT_FUNC(grub_arch_sync_caches) (void *address, grub_size_t len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef GRUB_MACHINE_EMU
|
||||||
|
#if defined (__aarch64__) || defined (__ia64__) || defined (__powerpc__) || \
|
||||||
|
defined (__sparc__)
|
||||||
|
|
||||||
|
#elif defined (__i386__) || defined (__x86_64__)
|
||||||
|
static inline void
|
||||||
|
grub_arch_sync_dma_caches (volatile void *address __attribute__ ((unused)),
|
||||||
|
grub_size_t len __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#elif defined(__mips__) && (_MIPS_SIM != _ABI64)
|
||||||
|
void EXPORT_FUNC(grub_arch_sync_dma_caches) (volatile void *address, grub_size_t len);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __arm__
|
||||||
|
void
|
||||||
|
grub_arm_cache_enable (void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ! GRUB_CACHE_HEADER */
|
||||||
309
GRUB2/MOD_SRC/grub-2.04/include/grub/dl.h
Normal file
309
GRUB2/MOD_SRC/grub-2.04/include/grub/dl.h
Normal file
@@ -0,0 +1,309 @@
|
|||||||
|
/* dl.h - types and prototypes for loadable module support */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2002,2004,2005,2007,2008,2009 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_DL_H
|
||||||
|
#define GRUB_DL_H 1
|
||||||
|
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
#ifndef ASM_FILE
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/elf.h>
|
||||||
|
#include <grub/list.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros GRUB_MOD_INIT and GRUB_MOD_FINI are also used by build rules
|
||||||
|
* to collect module names, so we define them only when they are not
|
||||||
|
* defined already.
|
||||||
|
*/
|
||||||
|
#ifndef ASM_FILE
|
||||||
|
|
||||||
|
#ifndef GRUB_MOD_INIT
|
||||||
|
|
||||||
|
#if !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_KERNEL)
|
||||||
|
|
||||||
|
#define GRUB_MOD_INIT(name) \
|
||||||
|
static void grub_mod_init (grub_dl_t mod __attribute__ ((unused))) __attribute__ ((used)); \
|
||||||
|
static void \
|
||||||
|
grub_mod_init (grub_dl_t mod __attribute__ ((unused)))
|
||||||
|
|
||||||
|
#define GRUB_MOD_FINI(name) \
|
||||||
|
static void grub_mod_fini (void) __attribute__ ((used)); \
|
||||||
|
static void \
|
||||||
|
grub_mod_fini (void)
|
||||||
|
|
||||||
|
#elif defined (GRUB_KERNEL)
|
||||||
|
|
||||||
|
#define GRUB_MOD_INIT(name) \
|
||||||
|
static void grub_mod_init (grub_dl_t mod __attribute__ ((unused))) __attribute__ ((used)); \
|
||||||
|
void \
|
||||||
|
grub_##name##_init (void) { grub_mod_init (0); } \
|
||||||
|
static void \
|
||||||
|
grub_mod_init (grub_dl_t mod __attribute__ ((unused)))
|
||||||
|
|
||||||
|
#define GRUB_MOD_FINI(name) \
|
||||||
|
static void grub_mod_fini (void) __attribute__ ((used)); \
|
||||||
|
void \
|
||||||
|
grub_##name##_fini (void) { grub_mod_fini (); } \
|
||||||
|
static void \
|
||||||
|
grub_mod_fini (void)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define GRUB_MOD_INIT(name) \
|
||||||
|
static void grub_mod_init (grub_dl_t mod __attribute__ ((unused))) __attribute__ ((used)); \
|
||||||
|
void grub_##name##_init (void); \
|
||||||
|
void \
|
||||||
|
grub_##name##_init (void) { grub_mod_init (0); } \
|
||||||
|
static void \
|
||||||
|
grub_mod_init (grub_dl_t mod __attribute__ ((unused)))
|
||||||
|
|
||||||
|
#define GRUB_MOD_FINI(name) \
|
||||||
|
static void grub_mod_fini (void) __attribute__ ((used)); \
|
||||||
|
void grub_##name##_fini (void); \
|
||||||
|
void \
|
||||||
|
grub_##name##_fini (void) { grub_mod_fini (); } \
|
||||||
|
static void \
|
||||||
|
grub_mod_fini (void)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ASM_FILE
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define GRUB_MOD_SECTION(x) "_" #x ", _" #x ""
|
||||||
|
#else
|
||||||
|
#define GRUB_MOD_SECTION(x) "." #x
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define GRUB_MOD_SECTION(x) _ ## x , _ ##x
|
||||||
|
#else
|
||||||
|
#define GRUB_MOD_SECTION(x) . ## x
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Me, Vladimir Serbinenko, hereby I add this module check as per new
|
||||||
|
GNU module policy. Note that this license check is informative only.
|
||||||
|
Modules have to be licensed under GPLv3 or GPLv3+ (optionally
|
||||||
|
multi-licensed under other licences as well) independently of the
|
||||||
|
presence of this check and solely by linking (module loading in GRUB
|
||||||
|
constitutes linking) and GRUB core being licensed under GPLv3+.
|
||||||
|
Be sure to understand your license obligations.
|
||||||
|
*/
|
||||||
|
#ifndef ASM_FILE
|
||||||
|
#if GNUC_PREREQ (3,2)
|
||||||
|
#define ATTRIBUTE_USED __used__
|
||||||
|
#else
|
||||||
|
#define ATTRIBUTE_USED __unused__
|
||||||
|
#endif
|
||||||
|
#define GRUB_MOD_LICENSE(license) \
|
||||||
|
static char grub_module_license[] __attribute__ ((section (GRUB_MOD_SECTION (module_license)), ATTRIBUTE_USED)) = "LICENSE=" license;
|
||||||
|
#define GRUB_MOD_DEP(name) \
|
||||||
|
static const char grub_module_depend_##name[] \
|
||||||
|
__attribute__((section(GRUB_MOD_SECTION(moddeps)), ATTRIBUTE_USED)) = #name
|
||||||
|
#define GRUB_MOD_NAME(name) \
|
||||||
|
static const char grub_module_name_##name[] \
|
||||||
|
__attribute__((section(GRUB_MOD_SECTION(modname)), __used__)) = #name
|
||||||
|
#else
|
||||||
|
#ifdef __APPLE__
|
||||||
|
.macro GRUB_MOD_LICENSE
|
||||||
|
.section GRUB_MOD_SECTION(module_license)
|
||||||
|
.ascii "LICENSE="
|
||||||
|
.ascii $0
|
||||||
|
.byte 0
|
||||||
|
.endm
|
||||||
|
#else
|
||||||
|
.macro GRUB_MOD_LICENSE license
|
||||||
|
.section GRUB_MOD_SECTION(module_license), "a"
|
||||||
|
.ascii "LICENSE="
|
||||||
|
.ascii "\license"
|
||||||
|
.byte 0
|
||||||
|
.endm
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Under GPL license obligations you have to distribute your module
|
||||||
|
under GPLv3(+). However, you can also distribute the same code under
|
||||||
|
another license as long as GPLv3(+) version is provided.
|
||||||
|
*/
|
||||||
|
#define GRUB_MOD_DUAL_LICENSE(x)
|
||||||
|
|
||||||
|
#ifndef ASM_FILE
|
||||||
|
|
||||||
|
struct grub_dl_segment
|
||||||
|
{
|
||||||
|
struct grub_dl_segment *next;
|
||||||
|
void *addr;
|
||||||
|
grub_size_t size;
|
||||||
|
unsigned section;
|
||||||
|
};
|
||||||
|
typedef struct grub_dl_segment *grub_dl_segment_t;
|
||||||
|
|
||||||
|
struct grub_dl;
|
||||||
|
|
||||||
|
struct grub_dl_dep
|
||||||
|
{
|
||||||
|
struct grub_dl_dep *next;
|
||||||
|
struct grub_dl *mod;
|
||||||
|
};
|
||||||
|
typedef struct grub_dl_dep *grub_dl_dep_t;
|
||||||
|
|
||||||
|
#ifndef GRUB_UTIL
|
||||||
|
struct grub_dl
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
int ref_count;
|
||||||
|
int persistent;
|
||||||
|
grub_dl_dep_t dep;
|
||||||
|
grub_dl_segment_t segment;
|
||||||
|
Elf_Sym *symtab;
|
||||||
|
grub_size_t symsize;
|
||||||
|
void (*init) (struct grub_dl *mod);
|
||||||
|
void (*fini) (void);
|
||||||
|
#if !defined (__i386__) && !defined (__x86_64__)
|
||||||
|
void *got;
|
||||||
|
void *gotptr;
|
||||||
|
void *tramp;
|
||||||
|
void *trampptr;
|
||||||
|
#endif
|
||||||
|
#if defined(__mips__) && (_MIPS_SIM != _ABI64)
|
||||||
|
grub_uint32_t *reginfo;
|
||||||
|
#endif
|
||||||
|
void *base;
|
||||||
|
grub_size_t sz;
|
||||||
|
struct grub_dl *next;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
typedef struct grub_dl *grub_dl_t;
|
||||||
|
|
||||||
|
grub_dl_t grub_dl_load_file (const char *filename);
|
||||||
|
grub_dl_t EXPORT_FUNC(grub_dl_load) (const char *name);
|
||||||
|
grub_dl_t grub_dl_load_core (void *addr, grub_size_t size);
|
||||||
|
grub_dl_t EXPORT_FUNC(grub_dl_load_core_noinit) (void *addr, grub_size_t size);
|
||||||
|
int EXPORT_FUNC(grub_dl_unload) (grub_dl_t mod);
|
||||||
|
void grub_dl_unload_unneeded (void);
|
||||||
|
int EXPORT_FUNC(grub_dl_ref) (grub_dl_t mod);
|
||||||
|
int EXPORT_FUNC(grub_dl_unref) (grub_dl_t mod);
|
||||||
|
extern grub_dl_t EXPORT_VAR(grub_dl_head);
|
||||||
|
|
||||||
|
#ifndef GRUB_UTIL
|
||||||
|
|
||||||
|
#define FOR_DL_MODULES(var) FOR_LIST_ELEMENTS ((var), (grub_dl_head))
|
||||||
|
|
||||||
|
#ifdef GRUB_MACHINE_EMU
|
||||||
|
void *
|
||||||
|
grub_osdep_dl_memalign (grub_size_t align, grub_size_t size);
|
||||||
|
void
|
||||||
|
grub_dl_osdep_dl_free (void *ptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_dl_init (grub_dl_t mod)
|
||||||
|
{
|
||||||
|
if (mod->init)
|
||||||
|
(mod->init) (mod);
|
||||||
|
|
||||||
|
mod->next = grub_dl_head;
|
||||||
|
grub_dl_head = mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline grub_dl_t
|
||||||
|
grub_dl_get (const char *name)
|
||||||
|
{
|
||||||
|
grub_dl_t l;
|
||||||
|
|
||||||
|
FOR_DL_MODULES(l)
|
||||||
|
if (grub_strcmp (name, l->name) == 0)
|
||||||
|
return l;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_dl_set_persistent (grub_dl_t mod)
|
||||||
|
{
|
||||||
|
mod->persistent = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_dl_is_persistent (grub_dl_t mod)
|
||||||
|
{
|
||||||
|
return mod->persistent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
grub_err_t grub_dl_register_symbol (const char *name, void *addr,
|
||||||
|
int isfunc, grub_dl_t mod);
|
||||||
|
|
||||||
|
grub_err_t grub_arch_dl_check_header (void *ehdr);
|
||||||
|
#ifndef GRUB_UTIL
|
||||||
|
grub_err_t
|
||||||
|
grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr,
|
||||||
|
Elf_Shdr *s, grub_dl_segment_t seg);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__mips__) && (_MIPS_SIM != _ABI64)
|
||||||
|
#define GRUB_LINKER_HAVE_INIT 1
|
||||||
|
void grub_arch_dl_init_linker (void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GRUB_IA64_DL_TRAMP_ALIGN 16
|
||||||
|
#define GRUB_IA64_DL_GOT_ALIGN 16
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_ia64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
|
||||||
|
grub_size_t *got);
|
||||||
|
grub_err_t
|
||||||
|
grub_arm64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
|
||||||
|
grub_size_t *got);
|
||||||
|
|
||||||
|
#if defined (__ia64__)
|
||||||
|
#define GRUB_ARCH_DL_TRAMP_ALIGN GRUB_IA64_DL_TRAMP_ALIGN
|
||||||
|
#define GRUB_ARCH_DL_GOT_ALIGN GRUB_IA64_DL_GOT_ALIGN
|
||||||
|
#define grub_arch_dl_get_tramp_got_size grub_ia64_dl_get_tramp_got_size
|
||||||
|
#elif defined (__aarch64__)
|
||||||
|
#define grub_arch_dl_get_tramp_got_size grub_arm64_dl_get_tramp_got_size
|
||||||
|
#else
|
||||||
|
grub_err_t
|
||||||
|
grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
|
||||||
|
grub_size_t *got);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__powerpc__) || (defined (__mips__) && (_MIPS_SIM != _ABI64)) || defined (__arm__) || \
|
||||||
|
(defined(__riscv) && (__riscv_xlen == 32))
|
||||||
|
#define GRUB_ARCH_DL_TRAMP_ALIGN 4
|
||||||
|
#define GRUB_ARCH_DL_GOT_ALIGN 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__aarch64__) || defined (__sparc__) || (defined (__mips__) && (_MIPS_SIM == _ABI64)) || \
|
||||||
|
(defined(__riscv) && (__riscv_xlen == 64))
|
||||||
|
#define GRUB_ARCH_DL_TRAMP_ALIGN 8
|
||||||
|
#define GRUB_ARCH_DL_GOT_ALIGN 8
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ! GRUB_DL_H */
|
||||||
1761
GRUB2/MOD_SRC/grub-2.04/include/grub/efi/api.h
Normal file
1761
GRUB2/MOD_SRC/grub-2.04/include/grub/efi/api.h
Normal file
File diff suppressed because it is too large
Load Diff
@@ -87,6 +87,7 @@ EXPORT_FUNC (grub_efi_compare_device_paths) (const grub_efi_device_path_t *dp1,
|
|||||||
const grub_efi_device_path_t *dp2);
|
const grub_efi_device_path_t *dp2);
|
||||||
|
|
||||||
void * EXPORT_FUNC (grub_efi_allocate_iso_buf) (grub_uint64_t size);
|
void * EXPORT_FUNC (grub_efi_allocate_iso_buf) (grub_uint64_t size);
|
||||||
|
void * EXPORT_FUNC (grub_efi_allocate_chain_buf) (grub_uint64_t size);
|
||||||
|
|
||||||
|
|
||||||
extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd,
|
extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd,
|
||||||
|
|||||||
339
GRUB2/MOD_SRC/grub-2.04/include/grub/efi/pe32.h
Normal file
339
GRUB2/MOD_SRC/grub-2.04/include/grub/efi/pe32.h
Normal file
@@ -0,0 +1,339 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2006,2007,2008,2009 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_EFI_PE32_HEADER
|
||||||
|
#define GRUB_EFI_PE32_HEADER 1
|
||||||
|
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/efi/memory.h>
|
||||||
|
|
||||||
|
/* The MSDOS compatibility stub. This was copied from the output of
|
||||||
|
objcopy, and it is not necessary to care about what this means. */
|
||||||
|
#define GRUB_PE32_MSDOS_STUB \
|
||||||
|
{ \
|
||||||
|
0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, \
|
||||||
|
0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, \
|
||||||
|
0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
|
||||||
|
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, \
|
||||||
|
0x0e, 0x1f, 0xba, 0x0e, 0x00, 0xb4, 0x09, 0xcd, \
|
||||||
|
0x21, 0xb8, 0x01, 0x4c, 0xcd, 0x21, 0x54, 0x68, \
|
||||||
|
0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, \
|
||||||
|
0x61, 0x6d, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, \
|
||||||
|
0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, \
|
||||||
|
0x20, 0x69, 0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20, \
|
||||||
|
0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x0d, 0x0d, 0x0a, \
|
||||||
|
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GRUB_PE32_MSDOS_STUB_SIZE 0x80
|
||||||
|
|
||||||
|
#define GRUB_PE32_MAGIC 0x5a4d
|
||||||
|
|
||||||
|
/* According to the spec, the minimal alignment is 512 bytes...
|
||||||
|
But some examples (such as EFI drivers in the Intel
|
||||||
|
Sample Implementation) use 32 bytes (0x20) instead, and it seems
|
||||||
|
to be working.
|
||||||
|
|
||||||
|
However, there is firmware showing up in the field now with
|
||||||
|
page alignment constraints to guarantee that page protection
|
||||||
|
bits take effect. Because currently existing GRUB code can not
|
||||||
|
properly distinguish between in-memory and in-file layout, let's
|
||||||
|
bump all alignment to GRUB_EFI_PAGE_SIZE. */
|
||||||
|
#define GRUB_PE32_SECTION_ALIGNMENT GRUB_EFI_PAGE_SIZE
|
||||||
|
#define GRUB_PE32_FILE_ALIGNMENT GRUB_PE32_SECTION_ALIGNMENT
|
||||||
|
|
||||||
|
struct grub_pe32_coff_header
|
||||||
|
{
|
||||||
|
grub_uint16_t machine;
|
||||||
|
grub_uint16_t num_sections;
|
||||||
|
grub_uint32_t time;
|
||||||
|
grub_uint32_t symtab_offset;
|
||||||
|
grub_uint32_t num_symbols;
|
||||||
|
grub_uint16_t optional_header_size;
|
||||||
|
grub_uint16_t characteristics;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GRUB_PE32_MACHINE_I386 0x14c
|
||||||
|
#define GRUB_PE32_MACHINE_MIPS 0x166
|
||||||
|
#define GRUB_PE32_MACHINE_IA64 0x200
|
||||||
|
#define GRUB_PE32_MACHINE_X86_64 0x8664
|
||||||
|
#define GRUB_PE32_MACHINE_ARMTHUMB_MIXED 0x01c2
|
||||||
|
#define GRUB_PE32_MACHINE_ARM64 0xAA64
|
||||||
|
#define GRUB_PE32_MACHINE_RISCV32 0x5032
|
||||||
|
#define GRUB_PE32_MACHINE_RISCV64 0x5064
|
||||||
|
|
||||||
|
#define GRUB_PE32_RELOCS_STRIPPED 0x0001
|
||||||
|
#define GRUB_PE32_EXECUTABLE_IMAGE 0x0002
|
||||||
|
#define GRUB_PE32_LINE_NUMS_STRIPPED 0x0004
|
||||||
|
#define GRUB_PE32_LOCAL_SYMS_STRIPPED 0x0008
|
||||||
|
#define GRUB_PE32_AGGRESSIVE_WS_TRIM 0x0010
|
||||||
|
#define GRUB_PE32_LARGE_ADDRESS_AWARE 0x0020
|
||||||
|
#define GRUB_PE32_16BIT_MACHINE 0x0040
|
||||||
|
#define GRUB_PE32_BYTES_REVERSED_LO 0x0080
|
||||||
|
#define GRUB_PE32_32BIT_MACHINE 0x0100
|
||||||
|
#define GRUB_PE32_DEBUG_STRIPPED 0x0200
|
||||||
|
#define GRUB_PE32_REMOVABLE_RUN_FROM_SWAP 0x0400
|
||||||
|
#define GRUB_PE32_SYSTEM 0x1000
|
||||||
|
#define GRUB_PE32_DLL 0x2000
|
||||||
|
#define GRUB_PE32_UP_SYSTEM_ONLY 0x4000
|
||||||
|
#define GRUB_PE32_BYTES_REVERSED_HI 0x8000
|
||||||
|
|
||||||
|
struct grub_pe32_data_directory
|
||||||
|
{
|
||||||
|
grub_uint32_t rva;
|
||||||
|
grub_uint32_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct grub_pe32_optional_header
|
||||||
|
{
|
||||||
|
grub_uint16_t magic;
|
||||||
|
grub_uint8_t major_linker_version;
|
||||||
|
grub_uint8_t minor_linker_version;
|
||||||
|
grub_uint32_t code_size;
|
||||||
|
grub_uint32_t data_size;
|
||||||
|
grub_uint32_t bss_size;
|
||||||
|
grub_uint32_t entry_addr;
|
||||||
|
grub_uint32_t code_base;
|
||||||
|
|
||||||
|
grub_uint32_t data_base;
|
||||||
|
grub_uint32_t image_base;
|
||||||
|
|
||||||
|
grub_uint32_t section_alignment;
|
||||||
|
grub_uint32_t file_alignment;
|
||||||
|
grub_uint16_t major_os_version;
|
||||||
|
grub_uint16_t minor_os_version;
|
||||||
|
grub_uint16_t major_image_version;
|
||||||
|
grub_uint16_t minor_image_version;
|
||||||
|
grub_uint16_t major_subsystem_version;
|
||||||
|
grub_uint16_t minor_subsystem_version;
|
||||||
|
grub_uint32_t reserved;
|
||||||
|
grub_uint32_t image_size;
|
||||||
|
grub_uint32_t header_size;
|
||||||
|
grub_uint32_t checksum;
|
||||||
|
grub_uint16_t subsystem;
|
||||||
|
grub_uint16_t dll_characteristics;
|
||||||
|
|
||||||
|
grub_uint32_t stack_reserve_size;
|
||||||
|
grub_uint32_t stack_commit_size;
|
||||||
|
grub_uint32_t heap_reserve_size;
|
||||||
|
grub_uint32_t heap_commit_size;
|
||||||
|
|
||||||
|
grub_uint32_t loader_flags;
|
||||||
|
grub_uint32_t num_data_directories;
|
||||||
|
|
||||||
|
/* Data directories. */
|
||||||
|
struct grub_pe32_data_directory export_table;
|
||||||
|
struct grub_pe32_data_directory import_table;
|
||||||
|
struct grub_pe32_data_directory resource_table;
|
||||||
|
struct grub_pe32_data_directory exception_table;
|
||||||
|
struct grub_pe32_data_directory certificate_table;
|
||||||
|
struct grub_pe32_data_directory base_relocation_table;
|
||||||
|
struct grub_pe32_data_directory debug;
|
||||||
|
struct grub_pe32_data_directory architecture;
|
||||||
|
struct grub_pe32_data_directory global_ptr;
|
||||||
|
struct grub_pe32_data_directory tls_table;
|
||||||
|
struct grub_pe32_data_directory load_config_table;
|
||||||
|
struct grub_pe32_data_directory bound_import;
|
||||||
|
struct grub_pe32_data_directory iat;
|
||||||
|
struct grub_pe32_data_directory delay_import_descriptor;
|
||||||
|
struct grub_pe32_data_directory com_runtime_header;
|
||||||
|
struct grub_pe32_data_directory reserved_entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct grub_pe64_optional_header
|
||||||
|
{
|
||||||
|
grub_uint16_t magic;
|
||||||
|
grub_uint8_t major_linker_version;
|
||||||
|
grub_uint8_t minor_linker_version;
|
||||||
|
grub_uint32_t code_size;
|
||||||
|
grub_uint32_t data_size;
|
||||||
|
grub_uint32_t bss_size;
|
||||||
|
grub_uint32_t entry_addr;
|
||||||
|
grub_uint32_t code_base;
|
||||||
|
|
||||||
|
grub_uint64_t image_base;
|
||||||
|
|
||||||
|
grub_uint32_t section_alignment;
|
||||||
|
grub_uint32_t file_alignment;
|
||||||
|
grub_uint16_t major_os_version;
|
||||||
|
grub_uint16_t minor_os_version;
|
||||||
|
grub_uint16_t major_image_version;
|
||||||
|
grub_uint16_t minor_image_version;
|
||||||
|
grub_uint16_t major_subsystem_version;
|
||||||
|
grub_uint16_t minor_subsystem_version;
|
||||||
|
grub_uint32_t reserved;
|
||||||
|
grub_uint32_t image_size;
|
||||||
|
grub_uint32_t header_size;
|
||||||
|
grub_uint32_t checksum;
|
||||||
|
grub_uint16_t subsystem;
|
||||||
|
grub_uint16_t dll_characteristics;
|
||||||
|
|
||||||
|
grub_uint64_t stack_reserve_size;
|
||||||
|
grub_uint64_t stack_commit_size;
|
||||||
|
grub_uint64_t heap_reserve_size;
|
||||||
|
grub_uint64_t heap_commit_size;
|
||||||
|
|
||||||
|
grub_uint32_t loader_flags;
|
||||||
|
grub_uint32_t num_data_directories;
|
||||||
|
|
||||||
|
/* Data directories. */
|
||||||
|
struct grub_pe32_data_directory export_table;
|
||||||
|
struct grub_pe32_data_directory import_table;
|
||||||
|
struct grub_pe32_data_directory resource_table;
|
||||||
|
struct grub_pe32_data_directory exception_table;
|
||||||
|
struct grub_pe32_data_directory certificate_table;
|
||||||
|
struct grub_pe32_data_directory base_relocation_table;
|
||||||
|
struct grub_pe32_data_directory debug;
|
||||||
|
struct grub_pe32_data_directory architecture;
|
||||||
|
struct grub_pe32_data_directory global_ptr;
|
||||||
|
struct grub_pe32_data_directory tls_table;
|
||||||
|
struct grub_pe32_data_directory load_config_table;
|
||||||
|
struct grub_pe32_data_directory bound_import;
|
||||||
|
struct grub_pe32_data_directory iat;
|
||||||
|
struct grub_pe32_data_directory delay_import_descriptor;
|
||||||
|
struct grub_pe32_data_directory com_runtime_header;
|
||||||
|
struct grub_pe32_data_directory reserved_entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GRUB_PE32_PE32_MAGIC 0x10b
|
||||||
|
#define GRUB_PE32_PE64_MAGIC 0x20b
|
||||||
|
|
||||||
|
#define GRUB_PE32_SUBSYSTEM_EFI_APPLICATION 10
|
||||||
|
|
||||||
|
#define GRUB_PE32_NUM_DATA_DIRECTORIES 16
|
||||||
|
|
||||||
|
struct grub_pe32_section_table
|
||||||
|
{
|
||||||
|
char name[8];
|
||||||
|
grub_uint32_t virtual_size;
|
||||||
|
grub_uint32_t virtual_address;
|
||||||
|
grub_uint32_t raw_data_size;
|
||||||
|
grub_uint32_t raw_data_offset;
|
||||||
|
grub_uint32_t relocations_offset;
|
||||||
|
grub_uint32_t line_numbers_offset;
|
||||||
|
grub_uint16_t num_relocations;
|
||||||
|
grub_uint16_t num_line_numbers;
|
||||||
|
grub_uint32_t characteristics;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GRUB_PE32_SCN_CNT_CODE 0x00000020
|
||||||
|
#define GRUB_PE32_SCN_CNT_INITIALIZED_DATA 0x00000040
|
||||||
|
#define GRUB_PE32_SCN_MEM_DISCARDABLE 0x02000000
|
||||||
|
#define GRUB_PE32_SCN_MEM_EXECUTE 0x20000000
|
||||||
|
#define GRUB_PE32_SCN_MEM_READ 0x40000000
|
||||||
|
#define GRUB_PE32_SCN_MEM_WRITE 0x80000000
|
||||||
|
|
||||||
|
#define GRUB_PE32_SCN_ALIGN_1BYTES 0x00100000
|
||||||
|
#define GRUB_PE32_SCN_ALIGN_2BYTES 0x00200000
|
||||||
|
#define GRUB_PE32_SCN_ALIGN_4BYTES 0x00300000
|
||||||
|
#define GRUB_PE32_SCN_ALIGN_8BYTES 0x00400000
|
||||||
|
#define GRUB_PE32_SCN_ALIGN_16BYTES 0x00500000
|
||||||
|
#define GRUB_PE32_SCN_ALIGN_32BYTES 0x00600000
|
||||||
|
#define GRUB_PE32_SCN_ALIGN_64BYTES 0x00700000
|
||||||
|
|
||||||
|
#define GRUB_PE32_SCN_ALIGN_SHIFT 20
|
||||||
|
#define GRUB_PE32_SCN_ALIGN_MASK 7
|
||||||
|
|
||||||
|
#define GRUB_PE32_SIGNATURE_SIZE 4
|
||||||
|
|
||||||
|
struct grub_pe32_header
|
||||||
|
{
|
||||||
|
/* This should be filled in with GRUB_PE32_MSDOS_STUB. */
|
||||||
|
grub_uint8_t msdos_stub[GRUB_PE32_MSDOS_STUB_SIZE];
|
||||||
|
|
||||||
|
/* This is always PE\0\0. */
|
||||||
|
char signature[GRUB_PE32_SIGNATURE_SIZE];
|
||||||
|
|
||||||
|
/* The COFF file header. */
|
||||||
|
struct grub_pe32_coff_header coff_header;
|
||||||
|
|
||||||
|
#if GRUB_TARGET_SIZEOF_VOID_P == 8
|
||||||
|
/* The Optional header. */
|
||||||
|
struct grub_pe64_optional_header optional_header;
|
||||||
|
#else
|
||||||
|
/* The Optional header. */
|
||||||
|
struct grub_pe32_optional_header optional_header;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
struct grub_pe32_fixup_block
|
||||||
|
{
|
||||||
|
grub_uint32_t page_rva;
|
||||||
|
grub_uint32_t block_size;
|
||||||
|
grub_uint16_t entries[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GRUB_PE32_FIXUP_ENTRY(type, offset) (((type) << 12) | (offset))
|
||||||
|
|
||||||
|
#define GRUB_PE32_REL_BASED_ABSOLUTE 0
|
||||||
|
#define GRUB_PE32_REL_BASED_HIGH 1
|
||||||
|
#define GRUB_PE32_REL_BASED_LOW 2
|
||||||
|
#define GRUB_PE32_REL_BASED_HIGHLOW 3
|
||||||
|
#define GRUB_PE32_REL_BASED_HIGHADJ 4
|
||||||
|
#define GRUB_PE32_REL_BASED_MIPS_JMPADDR 5
|
||||||
|
#define GRUB_PE32_REL_BASED_MIPS_LOW 6
|
||||||
|
#define GRUB_PE32_REL_BASED_MIPS_HIGH 4
|
||||||
|
#define GRUB_PE32_REL_BASED_MIPS_HIGHER 7
|
||||||
|
#define GRUB_PE32_REL_BASED_MIPS_HIGHEST 8
|
||||||
|
#define GRUB_PE32_REL_BASED_ARM_MOV32A 5
|
||||||
|
#define GRUB_PE32_REL_BASED_RISCV_HI20 5
|
||||||
|
#define GRUB_PE32_REL_BASED_SECTION 6
|
||||||
|
#define GRUB_PE32_REL_BASED_REL 7
|
||||||
|
#define GRUB_PE32_REL_BASED_ARM_MOV32T 7
|
||||||
|
#define GRUB_PE32_REL_BASED_RISCV_LOW12I 7
|
||||||
|
#define GRUB_PE32_REL_BASED_RISCV_LOW12S 8
|
||||||
|
#define GRUB_PE32_REL_BASED_IA64_IMM64 9
|
||||||
|
#define GRUB_PE32_REL_BASED_DIR64 10
|
||||||
|
#define GRUB_PE32_REL_BASED_HIGH3ADJ 11
|
||||||
|
|
||||||
|
struct grub_pe32_symbol
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
char short_name[8];
|
||||||
|
grub_uint32_t long_name[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
grub_uint32_t value;
|
||||||
|
grub_uint16_t section;
|
||||||
|
grub_uint16_t type;
|
||||||
|
grub_uint8_t storage_class;
|
||||||
|
grub_uint8_t num_aux;
|
||||||
|
} GRUB_PACKED;
|
||||||
|
|
||||||
|
#define GRUB_PE32_SYM_CLASS_EXTERNAL 2
|
||||||
|
#define GRUB_PE32_SYM_CLASS_STATIC 3
|
||||||
|
#define GRUB_PE32_SYM_CLASS_FILE 0x67
|
||||||
|
|
||||||
|
#define GRUB_PE32_DT_FUNCTION 0x20
|
||||||
|
|
||||||
|
struct grub_pe32_reloc
|
||||||
|
{
|
||||||
|
grub_uint32_t offset;
|
||||||
|
grub_uint32_t symtab_index;
|
||||||
|
grub_uint16_t type;
|
||||||
|
} GRUB_PACKED;
|
||||||
|
|
||||||
|
#define GRUB_PE32_REL_I386_DIR32 0x6
|
||||||
|
#define GRUB_PE32_REL_I386_REL32 0x14
|
||||||
|
|
||||||
|
#endif /* ! GRUB_EFI_PE32_HEADER */
|
||||||
10
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/asm.h
Normal file
10
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/asm.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef GRUB_MIPS64_ASM_HEADER
|
||||||
|
#define GRUB_MIPS64_ASM_HEADER 1
|
||||||
|
|
||||||
|
#define GRUB_ASM_T4 $a4
|
||||||
|
#define GRUB_ASM_T5 $a5
|
||||||
|
#define GRUB_ASM_SZREG 8
|
||||||
|
#define GRUB_ASM_REG_S sd
|
||||||
|
#define GRUB_ASM_REG_L ld
|
||||||
|
|
||||||
|
#endif
|
||||||
25
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/efi/loader.h
Normal file
25
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/efi/loader.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2002,2003,2004,2006,2007,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_LOADER_MACHINE_HEADER
|
||||||
|
#define GRUB_LOADER_MACHINE_HEADER 1
|
||||||
|
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
|
||||||
|
#endif /* ! GRUB_LOADER_MACHINE_HEADER */
|
||||||
303
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/efi/loongson.h
Normal file
303
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/efi/loongson.h
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_EFI_LOONGSON_HEADER
|
||||||
|
#define GRUB_EFI_LOONGSON_HEADER 1
|
||||||
|
|
||||||
|
#include <grub/types.h>
|
||||||
|
|
||||||
|
#include <grub/efi/api.h>
|
||||||
|
|
||||||
|
#define GRUB_EFI_LOONGSON_SMBIOS_TABLE_GUID \
|
||||||
|
{ 0x4660f721, 0x2ec5, 0x416a, \
|
||||||
|
{ 0x89, 0x9a, 0x43, 0x18, 0x02, 0x50, 0xa0, 0xc9 } \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GRUB_EFI_LOONGSON_MMAP_MAX 128
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GRUB_EFI_LOONGSON_SYSTEM_RAM_LOW = 1,
|
||||||
|
GRUB_EFI_LOONGSON_SYSTEM_RAM_HIGH,
|
||||||
|
GRUB_EFI_LOONGSON_MEMORY_RESERVED,
|
||||||
|
GRUB_EFI_LOONGSON_PCI_IO,
|
||||||
|
GRUB_EFI_LOONGSON_PCI_MEM,
|
||||||
|
GRUB_EFI_LOONGSON_CFG_REG,
|
||||||
|
GRUB_EFI_LOONGSON_VIDEO_ROM,
|
||||||
|
GRUB_EFI_LOONGSON_ADAPTER_ROM,
|
||||||
|
GRUB_EFI_LOONGSON_ACPI_TABLE,
|
||||||
|
GRUB_EFI_LOONGSON_SMBIOS_TABLE,
|
||||||
|
GRUB_EFI_LOONGSON_UMA_VIDEO_RAM,
|
||||||
|
GRUB_EFI_LOONGSON_VUMA_VIDEO_RAM,
|
||||||
|
GRUB_EFI_LOONGSON_SYSTEM_RAM_LOW_DMA,
|
||||||
|
GRUB_EFI_LOONGSON_SYSTEM_RAM_HIGH_DMA,
|
||||||
|
GRUB_EFI_LOONGSON_ACPI_NVS,
|
||||||
|
GRUB_EFI_LOONGSON_MAX_MEMORY_TYPE
|
||||||
|
}
|
||||||
|
grub_efi_loongson_memory_type;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint16_t vers; /* version */
|
||||||
|
grub_uint32_t nr_map; /* number of memory_maps */
|
||||||
|
grub_uint32_t mem_freq; /* memory frequence */
|
||||||
|
struct mem_map {
|
||||||
|
grub_uint32_t node_id; /* node_id which memory attached to */
|
||||||
|
grub_uint32_t mem_type; /* system memory, pci memory, pci io, etc. */
|
||||||
|
grub_uint64_t mem_start; /* memory map start address */
|
||||||
|
grub_uint32_t mem_size; /* each memory_map size, not the total size */
|
||||||
|
} map[GRUB_EFI_LOONGSON_MMAP_MAX];
|
||||||
|
} GRUB_PACKED
|
||||||
|
grub_efi_loongson_memory_map;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Capability and feature descriptor structure for MIPS CPU
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint16_t vers; /* version */
|
||||||
|
grub_uint32_t processor_id; /* PRID, e.g. 6305, 6306 */
|
||||||
|
grub_uint32_t cputype; /* Loongson_3A/3B, etc. */
|
||||||
|
grub_uint32_t total_node; /* num of total numa nodes */
|
||||||
|
grub_uint16_t cpu_startup_core_id; /* Boot core id */
|
||||||
|
grub_uint16_t reserved_cores_mask;
|
||||||
|
grub_uint32_t cpu_clock_freq; /* cpu_clock */
|
||||||
|
grub_uint32_t nr_cpus;
|
||||||
|
} GRUB_PACKED
|
||||||
|
grub_efi_loongson_cpu_info;
|
||||||
|
|
||||||
|
#define GRUB_EFI_LOONGSON_MAX_UARTS 64
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint32_t iotype; /* see include/linux/serial_core.h */
|
||||||
|
grub_uint32_t uartclk;
|
||||||
|
grub_uint32_t int_offset;
|
||||||
|
grub_uint64_t uart_base;
|
||||||
|
} GRUB_PACKED
|
||||||
|
grub_efi_loongson_uart_device;
|
||||||
|
|
||||||
|
#define GRUB_EFI_LOONGSON_MAX_SENSORS 64
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[32]; /* a formal name */
|
||||||
|
char label[64]; /* a flexible description */
|
||||||
|
grub_uint32_t type; /* SENSOR_* */
|
||||||
|
grub_uint32_t id; /* instance id of a sensor-class */
|
||||||
|
grub_uint32_t fan_policy;
|
||||||
|
grub_uint32_t fan_percent; /* only for constant speed policy */
|
||||||
|
grub_uint64_t base_addr; /* base address of device registers */
|
||||||
|
} GRUB_PACKED
|
||||||
|
grub_efi_loongson_sensor_device;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint16_t vers; /* version */
|
||||||
|
grub_uint32_t ccnuma_smp; /* 0: no numa; 1: has numa */
|
||||||
|
grub_uint32_t sing_double_channel; /* 1:single; 2:double */
|
||||||
|
grub_uint32_t nr_uarts;
|
||||||
|
grub_efi_loongson_uart_device uarts[GRUB_EFI_LOONGSON_MAX_UARTS];
|
||||||
|
grub_uint32_t nr_sensors;
|
||||||
|
grub_efi_loongson_sensor_device sensors[GRUB_EFI_LOONGSON_MAX_SENSORS];
|
||||||
|
char has_ec;
|
||||||
|
char ec_name[32];
|
||||||
|
grub_uint64_t ec_base_addr;
|
||||||
|
char has_tcm;
|
||||||
|
char tcm_name[32];
|
||||||
|
grub_uint64_t tcm_base_addr;
|
||||||
|
grub_uint64_t workarounds; /* see workarounds.h */
|
||||||
|
} GRUB_PACKED
|
||||||
|
grub_efi_loongson_system_info;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint16_t vers;
|
||||||
|
grub_uint16_t size;
|
||||||
|
grub_uint16_t rtr_bus;
|
||||||
|
grub_uint16_t rtr_devfn;
|
||||||
|
grub_uint32_t vendor;
|
||||||
|
grub_uint32_t device;
|
||||||
|
grub_uint32_t PIC_type; /* conform use HT or PCI to route to CPU-PIC */
|
||||||
|
grub_uint64_t ht_int_bit; /* 3A: 1<<24; 3B: 1<<16 */
|
||||||
|
grub_uint64_t ht_enable; /* irqs used in this PIC */
|
||||||
|
grub_uint32_t node_id; /* node id: 0x0-0; 0x1-1; 0x10-2; 0x11-3 */
|
||||||
|
grub_uint64_t pci_mem_start_addr;
|
||||||
|
grub_uint64_t pci_mem_end_addr;
|
||||||
|
grub_uint64_t pci_io_start_addr;
|
||||||
|
grub_uint64_t pci_io_end_addr;
|
||||||
|
grub_uint64_t pci_config_addr;
|
||||||
|
grub_uint32_t dma_mask_bits;
|
||||||
|
} GRUB_PACKED
|
||||||
|
grub_efi_loongson_irq_src_routing_table;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint16_t vers; /* version */
|
||||||
|
grub_uint16_t size;
|
||||||
|
grub_uint8_t flag;
|
||||||
|
char description[64];
|
||||||
|
} GRUB_PACKED
|
||||||
|
grub_efi_loongson_interface_info;
|
||||||
|
|
||||||
|
#define GRUB_EFI_LOONGSON_MAX_RESOURCE_NUMBER 128
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint64_t start; /* resource start address */
|
||||||
|
grub_uint64_t end; /* resource end address */
|
||||||
|
char name[64];
|
||||||
|
grub_uint32_t flags;
|
||||||
|
}
|
||||||
|
grub_efi_loongson_resource;
|
||||||
|
|
||||||
|
/* arch specific additions */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
}
|
||||||
|
grub_efi_loongson_archdev_data;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[64]; /* hold the device name */
|
||||||
|
grub_uint32_t num_resources; /* number of device_resource */
|
||||||
|
/* for each device's resource */
|
||||||
|
grub_efi_loongson_resource resource[GRUB_EFI_LOONGSON_MAX_RESOURCE_NUMBER];
|
||||||
|
/* arch specific additions */
|
||||||
|
grub_efi_loongson_archdev_data archdata;
|
||||||
|
}
|
||||||
|
grub_efi_loongson_board_devices;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint16_t vers; /* version */
|
||||||
|
char special_name[64]; /* special_atribute_name */
|
||||||
|
grub_uint32_t loongson_special_type; /* type of special device */
|
||||||
|
/* for each device's resource */
|
||||||
|
grub_efi_loongson_resource resource[GRUB_EFI_LOONGSON_MAX_RESOURCE_NUMBER];
|
||||||
|
}
|
||||||
|
grub_efi_loongson_special_attribute;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint64_t memory_offset; /* efi_loongson_memory_map struct offset */
|
||||||
|
grub_uint64_t cpu_offset; /* efi_loongson_cpuinfo struct offset */
|
||||||
|
grub_uint64_t system_offset; /* efi_loongson_system_info struct offset */
|
||||||
|
grub_uint64_t irq_offset; /* efi_loongson_irq_src_routing_table struct offset */
|
||||||
|
grub_uint64_t interface_offset; /* interface_info struct offset */
|
||||||
|
grub_uint64_t special_offset; /* efi_loongson_special_attribute struct offset */
|
||||||
|
grub_uint64_t boarddev_table_offset; /* efi_loongson_board_devices offset */
|
||||||
|
}
|
||||||
|
grub_efi_loongson_params;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint16_t vers; /* version */
|
||||||
|
grub_uint64_t vga_bios; /* vga_bios address */
|
||||||
|
grub_efi_loongson_params lp;
|
||||||
|
}
|
||||||
|
grub_efi_loongson_smbios_table;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint64_t reset_cold;
|
||||||
|
grub_uint64_t reset_warm;
|
||||||
|
grub_uint64_t reset_type;
|
||||||
|
grub_uint64_t shutdown;
|
||||||
|
grub_uint64_t do_suspend; /* NULL if not support */
|
||||||
|
}
|
||||||
|
grub_efi_loongson_reset_system;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_uint64_t mps; /* MPS table */
|
||||||
|
grub_uint64_t acpi; /* ACPI table (IA64 ext 0.71) */
|
||||||
|
grub_uint64_t acpi20; /* ACPI table (ACPI 2.0) */
|
||||||
|
grub_efi_loongson_smbios_table smbios; /* SM BIOS table */
|
||||||
|
grub_uint64_t sal_systab; /* SAL system table */
|
||||||
|
grub_uint64_t boot_info; /* boot info table */
|
||||||
|
}
|
||||||
|
grub_efi_loongson;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grub_efi_loongson efi;
|
||||||
|
grub_efi_loongson_reset_system reset_system;
|
||||||
|
}
|
||||||
|
grub_efi_loongson_boot_params;
|
||||||
|
|
||||||
|
extern grub_uint64_t grub_efi_loongson_reset_system_addr;
|
||||||
|
|
||||||
|
extern void grub_efi_loongson_reset_cold (void);
|
||||||
|
extern void grub_efi_loongson_reset_warm (void);
|
||||||
|
extern void grub_efi_loongson_reset_shutdown (void);
|
||||||
|
extern void grub_efi_loongson_reset_suspend (void);
|
||||||
|
|
||||||
|
void grub_efi_loongson_init (void);
|
||||||
|
void grub_efi_loongson_fini (void);
|
||||||
|
void grub_efi_loongson_alloc_boot_params (void);
|
||||||
|
void grub_efi_loongson_free_boot_params (void);
|
||||||
|
void * grub_efi_loongson_get_smbios_table (void);
|
||||||
|
|
||||||
|
int EXPORT_FUNC(grub_efi_is_loongson) (void);
|
||||||
|
|
||||||
|
grub_uint8_t
|
||||||
|
EXPORT_FUNC(grub_efi_loongson_calculatesum8) (const grub_uint8_t *Buffer, grub_efi_uintn_t Length);
|
||||||
|
|
||||||
|
grub_uint8_t
|
||||||
|
EXPORT_FUNC(grub_efi_loongson_grub_calculatechecksum8) (const grub_uint8_t *Buffer, grub_efi_uintn_t Length);
|
||||||
|
|
||||||
|
|
||||||
|
void *
|
||||||
|
EXPORT_FUNC(grub_efi_loongson_get_boot_params) (void);
|
||||||
|
|
||||||
|
typedef struct _extention_list_hdr{
|
||||||
|
grub_uint64_t signature;
|
||||||
|
grub_uint32_t length;
|
||||||
|
grub_uint8_t revision;
|
||||||
|
grub_uint8_t checksum;
|
||||||
|
struct _extention_list_hdr *next;
|
||||||
|
}GRUB_PACKED
|
||||||
|
ext_list;
|
||||||
|
|
||||||
|
typedef struct bootparamsinterface {
|
||||||
|
grub_uint64_t signature; //{'B', 'P', 'I', '_', '0', '_', '1'}
|
||||||
|
grub_efi_system_table_t *systemtable;
|
||||||
|
ext_list *extlist;
|
||||||
|
}GRUB_PACKED
|
||||||
|
bootparamsinterface;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ext_list header; // {'M', 'E', 'M'}
|
||||||
|
grub_uint8_t mapcount;
|
||||||
|
struct GRUB_PACKED memmap {
|
||||||
|
grub_uint32_t memtype;
|
||||||
|
grub_uint64_t memstart;
|
||||||
|
grub_uint64_t memsize;
|
||||||
|
} map[GRUB_EFI_LOONGSON_MMAP_MAX];
|
||||||
|
}GRUB_PACKED
|
||||||
|
mem_map;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ext_list header; // {VBIOS}
|
||||||
|
grub_uint64_t vbiosaddr;
|
||||||
|
}GRUB_PACKED
|
||||||
|
vbios;
|
||||||
|
|
||||||
|
grub_uint32_t
|
||||||
|
EXPORT_FUNC (grub_efi_loongson_memmap_sort) (struct memmap array[], grub_uint32_t length, mem_map * bpmem, grub_uint32_t index, grub_uint32_t memtype);
|
||||||
|
#endif /* ! GRUB_EFI_LOONGSON_HEADER */
|
||||||
7
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/efi/memory.h
Normal file
7
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/efi/memory.h
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#ifndef GRUB_MEMORY_CPU_HEADER
|
||||||
|
#include <grub/efi/memory.h>
|
||||||
|
|
||||||
|
//#define GRUB_EFI_MAX_USABLE_ADDRESS 0x980000000fffffffUL
|
||||||
|
#define GRUB_EFI_MAX_USABLE_ADDRESS 0x98000000ffffffffUL
|
||||||
|
|
||||||
|
#endif /* ! GRUB_MEMORY_CPU_HEADER */
|
||||||
62
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/io.h
Normal file
62
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/io.h
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_IO_H
|
||||||
|
#define GRUB_IO_H 1
|
||||||
|
|
||||||
|
#include <grub/types.h>
|
||||||
|
|
||||||
|
typedef grub_addr_t grub_port_t;
|
||||||
|
|
||||||
|
static __inline unsigned char
|
||||||
|
grub_inb (grub_port_t port)
|
||||||
|
{
|
||||||
|
return *(volatile grub_uint8_t *) port;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline unsigned short int
|
||||||
|
grub_inw (grub_port_t port)
|
||||||
|
{
|
||||||
|
return *(volatile grub_uint16_t *) port;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline unsigned int
|
||||||
|
grub_inl (grub_port_t port)
|
||||||
|
{
|
||||||
|
return *(volatile grub_uint32_t *) port;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
grub_outb (unsigned char value, grub_port_t port)
|
||||||
|
{
|
||||||
|
*(volatile grub_uint8_t *) port = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
grub_outw (unsigned short int value, grub_port_t port)
|
||||||
|
{
|
||||||
|
*(volatile grub_uint16_t *) port = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
grub_outl (unsigned int value, grub_port_t port)
|
||||||
|
{
|
||||||
|
*(volatile grub_uint32_t *) port = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _SYS_IO_H */
|
||||||
24
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/kernel.h
Normal file
24
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/kernel.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2005,2006,2007,2008,2009,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_KERNEL_CPU_HEADER
|
||||||
|
#define GRUB_KERNEL_CPU_HEADER 1
|
||||||
|
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
|
||||||
|
#endif /* ! GRUB_KERNEL_MACHINE_HEADER */
|
||||||
57
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/memory.h
Normal file
57
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/memory.h
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_MEMORY_CPU_HEADER
|
||||||
|
#define GRUB_MEMORY_CPU_HEADER 1
|
||||||
|
|
||||||
|
#ifndef ASM_FILE
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ASM_FILE
|
||||||
|
|
||||||
|
typedef grub_addr_t grub_phys_addr_t;
|
||||||
|
|
||||||
|
static inline grub_phys_addr_t
|
||||||
|
grub_vtop (void *a)
|
||||||
|
{
|
||||||
|
if (-1 == ((grub_int64_t) a >> 32))
|
||||||
|
return ((grub_phys_addr_t) a) & 0x1fffffffUL;
|
||||||
|
return ((grub_phys_addr_t) a) & 0xffffffffffffUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
grub_map_memory (grub_phys_addr_t a, grub_size_t size)
|
||||||
|
{
|
||||||
|
if ((a + size) < 0x20000000UL)
|
||||||
|
return (void *) (a | 0xffffffff80000000UL);
|
||||||
|
// return (void *) (a | 0x9800000000000000UL);
|
||||||
|
return (void *) ((a&0x8fffffff) | 0xffffffff00000000UL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_unmap_memory (void *a __attribute__ ((unused)),
|
||||||
|
grub_size_t size __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
30
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/mips.h
Normal file
30
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/mips.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2010,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_REGISTERS_CPU_HEADER
|
||||||
|
#define GRUB_REGISTERS_CPU_HEADER 1
|
||||||
|
|
||||||
|
#ifdef ASM_FILE
|
||||||
|
#define GRUB_CPU_REGISTER_WRAP(x) x
|
||||||
|
#else
|
||||||
|
#define GRUB_CPU_REGISTER_WRAP(x) #x
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GRUB_CPU_MIPS_COP0_TIMER_COUNT GRUB_CPU_REGISTER_WRAP($9)
|
||||||
|
|
||||||
|
#endif
|
||||||
38
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/relocator.h
Normal file
38
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/relocator.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_RELOCATOR_CPU_HEADER
|
||||||
|
#define GRUB_RELOCATOR_CPU_HEADER 1
|
||||||
|
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/relocator.h>
|
||||||
|
|
||||||
|
struct grub_relocator64_state
|
||||||
|
{
|
||||||
|
/* gpr[0] is ignored since it's hardwired to 0. */
|
||||||
|
grub_uint64_t gpr[32];
|
||||||
|
/* Register holding target $pc. */
|
||||||
|
int jumpreg;
|
||||||
|
};
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_relocator64_boot (struct grub_relocator *rel,
|
||||||
|
struct grub_relocator64_state state);
|
||||||
|
|
||||||
|
#endif /* ! GRUB_RELOCATOR_CPU_HEADER */
|
||||||
27
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/setjmp.h
Normal file
27
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/setjmp.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2002,2004,2006,2007,2009,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_SETJMP_CPU_HEADER
|
||||||
|
#define GRUB_SETJMP_CPU_HEADER 1
|
||||||
|
|
||||||
|
typedef grub_uint64_t grub_jmp_buf[12];
|
||||||
|
|
||||||
|
int grub_setjmp (grub_jmp_buf env) RETURNS_TWICE;
|
||||||
|
void grub_longjmp (grub_jmp_buf env, int val) __attribute__ ((noreturn));
|
||||||
|
|
||||||
|
#endif /* ! GRUB_SETJMP_CPU_HEADER */
|
||||||
39
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/time.h
Normal file
39
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/time.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2003,2004,2005,2007,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef KERNEL_CPU_TIME_HEADER
|
||||||
|
#define KERNEL_CPU_TIME_HEADER 1
|
||||||
|
|
||||||
|
#ifndef GRUB_UTIL
|
||||||
|
|
||||||
|
#define GRUB_TICKS_PER_SECOND (grub_arch_cpuclock / 2)
|
||||||
|
|
||||||
|
void grub_timer_init (grub_uint32_t cpuclock);
|
||||||
|
|
||||||
|
/* Return the real time in ticks. */
|
||||||
|
grub_uint64_t grub_get_rtc (void);
|
||||||
|
|
||||||
|
extern grub_uint32_t grub_arch_cpuclock;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_cpu_idle(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
38
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/types.h
Normal file
38
GRUB2/MOD_SRC/grub-2.04/include/grub/mips64/types.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2002,2006,2007,2009,2017 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_TYPES_CPU_HEADER
|
||||||
|
#define GRUB_TYPES_CPU_HEADER 1
|
||||||
|
|
||||||
|
/* The size of void *. */
|
||||||
|
#define GRUB_TARGET_SIZEOF_VOID_P 8
|
||||||
|
|
||||||
|
/* The size of long. */
|
||||||
|
#define GRUB_TARGET_SIZEOF_LONG 8
|
||||||
|
|
||||||
|
#ifdef GRUB_CPU_MIPS64EL
|
||||||
|
/* mips64EL is little-endian. */
|
||||||
|
#undef GRUB_TARGET_WORDS_BIGENDIAN
|
||||||
|
#elif defined (GRUB_CPU_MIPS64)
|
||||||
|
/* mips64 is big-endian. */
|
||||||
|
#define GRUB_TARGET_WORDS_BIGENDIAN
|
||||||
|
#elif !defined (GRUB_SYMBOL_GENERATOR)
|
||||||
|
#error Neither GRUB_CPU_MIPS64 nor GRUB_CPU_MIPS64EL is defined
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ! GRUB_TYPES_CPU_HEADER */
|
||||||
466
GRUB2/MOD_SRC/grub-2.04/include/grub/misc.h
Normal file
466
GRUB2/MOD_SRC/grub-2.04/include/grub/misc.h
Normal file
@@ -0,0 +1,466 @@
|
|||||||
|
/* misc.h - prototypes for misc functions */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2002,2003,2005,2006,2007,2008,2009,2010 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_MISC_HEADER
|
||||||
|
#define GRUB_MISC_HEADER 1
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/symbol.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/compiler.h>
|
||||||
|
|
||||||
|
#define ALIGN_UP(addr, align) \
|
||||||
|
((addr + (typeof (addr)) align - 1) & ~((typeof (addr)) align - 1))
|
||||||
|
#define ALIGN_UP_OVERHEAD(addr, align) ((-(addr)) & ((typeof (addr)) (align) - 1))
|
||||||
|
#define ALIGN_DOWN(addr, align) \
|
||||||
|
((addr) & ~((typeof (addr)) align - 1))
|
||||||
|
#define ARRAY_SIZE(array) (sizeof (array) / sizeof (array[0]))
|
||||||
|
#define COMPILE_TIME_ASSERT(cond) switch (0) { case 1: case !(cond): ; }
|
||||||
|
|
||||||
|
#define grub_dprintf(condition, ...) grub_real_dprintf(GRUB_FILE, __LINE__, condition, __VA_ARGS__)
|
||||||
|
|
||||||
|
void *EXPORT_FUNC(grub_memmove) (void *dest, const void *src, grub_size_t n);
|
||||||
|
char *EXPORT_FUNC(grub_strcpy) (char *dest, const char *src);
|
||||||
|
|
||||||
|
static inline char *
|
||||||
|
grub_strncpy (char *dest, const char *src, int c)
|
||||||
|
{
|
||||||
|
char *p = dest;
|
||||||
|
|
||||||
|
while ((*p++ = *src++) != '\0' && --c)
|
||||||
|
;
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline char *
|
||||||
|
grub_stpcpy (char *dest, const char *src)
|
||||||
|
{
|
||||||
|
char *d = dest;
|
||||||
|
const char *s = src;
|
||||||
|
|
||||||
|
do
|
||||||
|
*d++ = *s;
|
||||||
|
while (*s++ != '\0');
|
||||||
|
|
||||||
|
return d - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXX: If grub_memmove is too slow, we must implement grub_memcpy. */
|
||||||
|
static inline void *
|
||||||
|
grub_memcpy (void *dest, const void *src, grub_size_t n)
|
||||||
|
{
|
||||||
|
return grub_memmove (dest, src, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__x86_64__) && !defined (GRUB_UTIL)
|
||||||
|
#if defined (__MINGW32__) || defined (__CYGWIN__) || defined (__MINGW64__)
|
||||||
|
#define GRUB_ASM_ATTR __attribute__ ((sysv_abi))
|
||||||
|
#else
|
||||||
|
#define GRUB_ASM_ATTR
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int EXPORT_FUNC(grub_memcmp) (const void *s1, const void *s2, grub_size_t n);
|
||||||
|
int EXPORT_FUNC(grub_strcmp) (const char *s1, const char *s2);
|
||||||
|
int EXPORT_FUNC(grub_strncmp) (const char *s1, const char *s2, grub_size_t n);
|
||||||
|
|
||||||
|
char *EXPORT_FUNC(grub_strchr) (const char *s, int c);
|
||||||
|
char *EXPORT_FUNC(grub_strrchr) (const char *s, int c);
|
||||||
|
int EXPORT_FUNC(grub_strword) (const char *s, const char *w);
|
||||||
|
|
||||||
|
/* Copied from gnulib.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2005. */
|
||||||
|
static inline char *
|
||||||
|
grub_strstr (const char *haystack, const char *needle)
|
||||||
|
{
|
||||||
|
/* Be careful not to look at the entire extent of haystack or needle
|
||||||
|
until needed. This is useful because of these two cases:
|
||||||
|
- haystack may be very long, and a match of needle found early,
|
||||||
|
- needle may be very long, and not even a short initial segment of
|
||||||
|
needle may be found in haystack. */
|
||||||
|
if (*needle != '\0')
|
||||||
|
{
|
||||||
|
/* Speed up the following searches of needle by caching its first
|
||||||
|
character. */
|
||||||
|
char b = *needle++;
|
||||||
|
|
||||||
|
for (;; haystack++)
|
||||||
|
{
|
||||||
|
if (*haystack == '\0')
|
||||||
|
/* No match. */
|
||||||
|
return 0;
|
||||||
|
if (*haystack == b)
|
||||||
|
/* The first character matches. */
|
||||||
|
{
|
||||||
|
const char *rhaystack = haystack + 1;
|
||||||
|
const char *rneedle = needle;
|
||||||
|
|
||||||
|
for (;; rhaystack++, rneedle++)
|
||||||
|
{
|
||||||
|
if (*rneedle == '\0')
|
||||||
|
/* Found a match. */
|
||||||
|
return (char *) haystack;
|
||||||
|
if (*rhaystack == '\0')
|
||||||
|
/* No match. */
|
||||||
|
return 0;
|
||||||
|
if (*rhaystack != *rneedle)
|
||||||
|
/* Nothing in this round. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return (char *) haystack;
|
||||||
|
}
|
||||||
|
|
||||||
|
int EXPORT_FUNC(grub_isspace) (int c);
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_isprint (int c)
|
||||||
|
{
|
||||||
|
return (c >= ' ' && c <= '~');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_iscntrl (int c)
|
||||||
|
{
|
||||||
|
return (c >= 0x00 && c <= 0x1F) || c == 0x7F;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_isalpha (int c)
|
||||||
|
{
|
||||||
|
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_islower (int c)
|
||||||
|
{
|
||||||
|
return (c >= 'a' && c <= 'z');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_isupper (int c)
|
||||||
|
{
|
||||||
|
return (c >= 'A' && c <= 'Z');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_isgraph (int c)
|
||||||
|
{
|
||||||
|
return (c >= '!' && c <= '~');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_isdigit (int c)
|
||||||
|
{
|
||||||
|
return (c >= '0' && c <= '9');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_isxdigit (int c)
|
||||||
|
{
|
||||||
|
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_isalnum (int c)
|
||||||
|
{
|
||||||
|
return grub_isalpha (c) || grub_isdigit (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_tolower (int c)
|
||||||
|
{
|
||||||
|
if (c >= 'A' && c <= 'Z')
|
||||||
|
return c - 'A' + 'a';
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_toupper (int c)
|
||||||
|
{
|
||||||
|
if (c >= 'a' && c <= 'z')
|
||||||
|
return c - 'a' + 'A';
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_strcasecmp (const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
while (*s1 && *s2)
|
||||||
|
{
|
||||||
|
if (grub_tolower ((grub_uint8_t) *s1)
|
||||||
|
!= grub_tolower ((grub_uint8_t) *s2))
|
||||||
|
break;
|
||||||
|
|
||||||
|
s1++;
|
||||||
|
s2++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int) grub_tolower ((grub_uint8_t) *s1)
|
||||||
|
- (int) grub_tolower ((grub_uint8_t) *s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_strncasecmp (const char *s1, const char *s2, grub_size_t n)
|
||||||
|
{
|
||||||
|
if (n == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (*s1 && *s2 && --n)
|
||||||
|
{
|
||||||
|
if (grub_tolower (*s1) != grub_tolower (*s2))
|
||||||
|
break;
|
||||||
|
|
||||||
|
s1++;
|
||||||
|
s2++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int) grub_tolower ((grub_uint8_t) *s1)
|
||||||
|
- (int) grub_tolower ((grub_uint8_t) *s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long EXPORT_FUNC(grub_strtoul) (const char *str, char **end, int base);
|
||||||
|
unsigned long long EXPORT_FUNC(grub_strtoull) (const char *str, char **end, int base);
|
||||||
|
|
||||||
|
static inline long
|
||||||
|
grub_strtol (const char *str, char **end, int base)
|
||||||
|
{
|
||||||
|
int negative = 0;
|
||||||
|
unsigned long long magnitude;
|
||||||
|
|
||||||
|
while (*str && grub_isspace (*str))
|
||||||
|
str++;
|
||||||
|
|
||||||
|
if (*str == '-')
|
||||||
|
{
|
||||||
|
negative = 1;
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
magnitude = grub_strtoull (str, end, base);
|
||||||
|
if (negative)
|
||||||
|
{
|
||||||
|
if (magnitude > (unsigned long) GRUB_LONG_MAX + 1)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected"));
|
||||||
|
return GRUB_LONG_MIN;
|
||||||
|
}
|
||||||
|
return -((long) magnitude);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (magnitude > GRUB_LONG_MAX)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected"));
|
||||||
|
return GRUB_LONG_MAX;
|
||||||
|
}
|
||||||
|
return (long) magnitude;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *EXPORT_FUNC(grub_strdup) (const char *s) WARN_UNUSED_RESULT;
|
||||||
|
char *EXPORT_FUNC(grub_strndup) (const char *s, grub_size_t n) WARN_UNUSED_RESULT;
|
||||||
|
void *EXPORT_FUNC(grub_memset) (void *s, int c, grub_size_t n);
|
||||||
|
grub_size_t EXPORT_FUNC(grub_strlen) (const char *s) WARN_UNUSED_RESULT;
|
||||||
|
int EXPORT_FUNC(grub_printf) (const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 1, 2)));
|
||||||
|
int EXPORT_FUNC(grub_printf_) (const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 1, 2)));
|
||||||
|
|
||||||
|
/* Replace all `ch' characters of `input' with `with' and copy the
|
||||||
|
result into `output'; return EOS address of `output'. */
|
||||||
|
static inline char *
|
||||||
|
grub_strchrsub (char *output, const char *input, char ch, const char *with)
|
||||||
|
{
|
||||||
|
while (*input)
|
||||||
|
{
|
||||||
|
if (*input == ch)
|
||||||
|
{
|
||||||
|
grub_strcpy (output, with);
|
||||||
|
output += grub_strlen (with);
|
||||||
|
input++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*output++ = *input++;
|
||||||
|
}
|
||||||
|
*output = '\0';
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void (*EXPORT_VAR (grub_xputs)) (const char *str);
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_puts (const char *s)
|
||||||
|
{
|
||||||
|
const char nl[2] = "\n";
|
||||||
|
grub_xputs (s);
|
||||||
|
grub_xputs (nl);
|
||||||
|
|
||||||
|
return 1; /* Cannot fail. */
|
||||||
|
}
|
||||||
|
|
||||||
|
int EXPORT_FUNC(grub_puts_) (const char *s);
|
||||||
|
void EXPORT_FUNC(grub_real_dprintf) (const char *file,
|
||||||
|
const int line,
|
||||||
|
const char *condition,
|
||||||
|
const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 4, 5)));
|
||||||
|
int EXPORT_FUNC(grub_vprintf) (const char *fmt, va_list args);
|
||||||
|
int EXPORT_FUNC(grub_snprintf) (char *str, grub_size_t n, const char *fmt, ...)
|
||||||
|
__attribute__ ((format (GNU_PRINTF, 3, 4)));
|
||||||
|
int EXPORT_FUNC(grub_vsnprintf) (char *str, grub_size_t n, const char *fmt,
|
||||||
|
va_list args);
|
||||||
|
char *EXPORT_FUNC(grub_xasprintf) (const char *fmt, ...)
|
||||||
|
__attribute__ ((format (GNU_PRINTF, 1, 2))) WARN_UNUSED_RESULT;
|
||||||
|
char *EXPORT_FUNC(grub_xvasprintf) (const char *fmt, va_list args) WARN_UNUSED_RESULT;
|
||||||
|
void EXPORT_FUNC(grub_exit) (void) __attribute__ ((noreturn));
|
||||||
|
grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n,
|
||||||
|
grub_uint64_t d,
|
||||||
|
grub_uint64_t *r);
|
||||||
|
|
||||||
|
/* Must match softdiv group in gentpl.py. */
|
||||||
|
#if !defined(GRUB_MACHINE_EMU) && (defined(__arm__) || defined(__ia64__) || \
|
||||||
|
(defined(__riscv) && (__riscv_xlen == 32)))
|
||||||
|
#define GRUB_DIVISION_IN_SOFTWARE 1
|
||||||
|
#else
|
||||||
|
#define GRUB_DIVISION_IN_SOFTWARE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Some division functions need to be in kernel if compiler generates calls
|
||||||
|
to them. Otherwise we still need them for consistent tests but they go
|
||||||
|
into a separate module. */
|
||||||
|
#if GRUB_DIVISION_IN_SOFTWARE
|
||||||
|
#define EXPORT_FUNC_IF_SOFTDIV EXPORT_FUNC
|
||||||
|
#else
|
||||||
|
#define EXPORT_FUNC_IF_SOFTDIV(x) x
|
||||||
|
#endif
|
||||||
|
|
||||||
|
grub_int64_t
|
||||||
|
EXPORT_FUNC_IF_SOFTDIV(grub_divmod64s) (grub_int64_t n,
|
||||||
|
grub_int64_t d,
|
||||||
|
grub_int64_t *r);
|
||||||
|
|
||||||
|
grub_uint32_t
|
||||||
|
EXPORT_FUNC_IF_SOFTDIV (grub_divmod32) (grub_uint32_t n,
|
||||||
|
grub_uint32_t d,
|
||||||
|
grub_uint32_t *r);
|
||||||
|
|
||||||
|
grub_int32_t
|
||||||
|
EXPORT_FUNC_IF_SOFTDIV (grub_divmod32s) (grub_int32_t n,
|
||||||
|
grub_int32_t d,
|
||||||
|
grub_int32_t *r);
|
||||||
|
|
||||||
|
/* Inline functions. */
|
||||||
|
|
||||||
|
static inline char *
|
||||||
|
grub_memchr (const void *p, int c, grub_size_t len)
|
||||||
|
{
|
||||||
|
const char *s = (const char *) p;
|
||||||
|
const char *e = s + len;
|
||||||
|
|
||||||
|
for (; s < e; s++)
|
||||||
|
if (*s == c)
|
||||||
|
return (char *) s;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline unsigned int
|
||||||
|
grub_abs (int x)
|
||||||
|
{
|
||||||
|
if (x < 0)
|
||||||
|
return (unsigned int) (-x);
|
||||||
|
else
|
||||||
|
return (unsigned int) x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reboot the machine. */
|
||||||
|
#if defined (GRUB_MACHINE_EMU) || defined (GRUB_MACHINE_QEMU_MIPS) || \
|
||||||
|
defined (GRUB_MACHINE_EFI)
|
||||||
|
void EXPORT_FUNC(grub_reboot) (void) __attribute__ ((noreturn));
|
||||||
|
#else
|
||||||
|
void grub_reboot (void) __attribute__ ((noreturn));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__clang__) && !defined (GRUB_UTIL)
|
||||||
|
void __attribute__ ((noreturn)) EXPORT_FUNC (abort) (void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GRUB_MACHINE_PCBIOS
|
||||||
|
/* Halt the system, using APM if possible. If NO_APM is true, don't
|
||||||
|
* use APM even if it is available. */
|
||||||
|
void grub_halt (int no_apm) __attribute__ ((noreturn));
|
||||||
|
#elif (defined (__mips__) && (_MIPS_SIM != _ABI64)) && !defined (GRUB_MACHINE_EMU)
|
||||||
|
void EXPORT_FUNC (grub_halt) (void) __attribute__ ((noreturn));
|
||||||
|
#else
|
||||||
|
void grub_halt (void) __attribute__ ((noreturn));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GRUB_MACHINE_EMU
|
||||||
|
/* Flag to check if module loading is available. */
|
||||||
|
extern const int EXPORT_VAR(grub_no_modules);
|
||||||
|
#else
|
||||||
|
#define grub_no_modules 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_error_save (struct grub_error_saved *save)
|
||||||
|
{
|
||||||
|
grub_memcpy (save->errmsg, grub_errmsg, sizeof (save->errmsg));
|
||||||
|
save->grub_errno = grub_errno;
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_error_load (const struct grub_error_saved *save)
|
||||||
|
{
|
||||||
|
grub_memcpy (grub_errmsg, save->errmsg, sizeof (grub_errmsg));
|
||||||
|
grub_errno = save->grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if BOOT_TIME_STATS
|
||||||
|
struct grub_boot_time
|
||||||
|
{
|
||||||
|
struct grub_boot_time *next;
|
||||||
|
grub_uint64_t tp;
|
||||||
|
const char *file;
|
||||||
|
int line;
|
||||||
|
char *msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct grub_boot_time *EXPORT_VAR(grub_boot_time_head);
|
||||||
|
|
||||||
|
void EXPORT_FUNC(grub_real_boot_time) (const char *file,
|
||||||
|
const int line,
|
||||||
|
const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 3, 4)));
|
||||||
|
#define grub_boot_time(...) grub_real_boot_time(GRUB_FILE, __LINE__, __VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define grub_boot_time(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define grub_max(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
|
#define grub_min(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
|
||||||
|
#endif /* ! GRUB_MISC_HEADER */
|
||||||
141
GRUB2/MOD_SRC/grub-2.04/include/grub/partition.h
Normal file
141
GRUB2/MOD_SRC/grub-2.04/include/grub/partition.h
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 1999,2000,2001,2002,2004,2006,2007 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_PART_HEADER
|
||||||
|
#define GRUB_PART_HEADER 1
|
||||||
|
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/list.h>
|
||||||
|
|
||||||
|
struct grub_disk;
|
||||||
|
|
||||||
|
typedef struct grub_partition *grub_partition_t;
|
||||||
|
|
||||||
|
#ifdef GRUB_UTIL
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GRUB_EMBED_PCBIOS
|
||||||
|
} grub_embed_type_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef int (*grub_partition_iterate_hook_t) (struct grub_disk *disk,
|
||||||
|
const grub_partition_t partition,
|
||||||
|
void *data);
|
||||||
|
|
||||||
|
/* Partition map type. */
|
||||||
|
struct grub_partition_map
|
||||||
|
{
|
||||||
|
/* The next partition map type. */
|
||||||
|
struct grub_partition_map *next;
|
||||||
|
struct grub_partition_map **prev;
|
||||||
|
|
||||||
|
/* The name of the partition map type. */
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
/* Call HOOK with each partition, until HOOK returns non-zero. */
|
||||||
|
grub_err_t (*iterate) (struct grub_disk *disk,
|
||||||
|
grub_partition_iterate_hook_t hook, void *hook_data);
|
||||||
|
#ifdef GRUB_UTIL
|
||||||
|
/* Determine sectors available for embedding. */
|
||||||
|
grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
|
||||||
|
unsigned int max_nsectors,
|
||||||
|
grub_embed_type_t embed_type,
|
||||||
|
grub_disk_addr_t **sectors);
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
typedef struct grub_partition_map *grub_partition_map_t;
|
||||||
|
|
||||||
|
/* Partition description. */
|
||||||
|
struct grub_partition
|
||||||
|
{
|
||||||
|
/* The partition number. */
|
||||||
|
int number;
|
||||||
|
|
||||||
|
/* The start sector (relative to parent). */
|
||||||
|
grub_disk_addr_t start;
|
||||||
|
|
||||||
|
/* The length in sector units. */
|
||||||
|
grub_uint64_t len;
|
||||||
|
|
||||||
|
/* The offset of the partition table. */
|
||||||
|
grub_disk_addr_t offset;
|
||||||
|
|
||||||
|
/* The index of this partition in the partition table. */
|
||||||
|
int index;
|
||||||
|
|
||||||
|
/* Parent partition (physically contains this partition). */
|
||||||
|
struct grub_partition *parent;
|
||||||
|
|
||||||
|
/* The type partition map. */
|
||||||
|
grub_partition_map_t partmap;
|
||||||
|
|
||||||
|
/* The type of partition whne it's on MSDOS.
|
||||||
|
Used for embedding detection. */
|
||||||
|
grub_uint8_t msdostype;
|
||||||
|
|
||||||
|
/* The attrib field for GPT. Needed for priority detection. */
|
||||||
|
grub_uint64_t gpt_attrib;
|
||||||
|
};
|
||||||
|
|
||||||
|
grub_partition_t EXPORT_FUNC(grub_partition_probe) (struct grub_disk *disk,
|
||||||
|
const char *str);
|
||||||
|
int EXPORT_FUNC(grub_partition_iterate) (struct grub_disk *disk,
|
||||||
|
grub_partition_iterate_hook_t hook,
|
||||||
|
void *hook_data);
|
||||||
|
char *EXPORT_FUNC(grub_partition_get_name) (const grub_partition_t partition);
|
||||||
|
|
||||||
|
|
||||||
|
extern grub_partition_map_t EXPORT_VAR(grub_partition_map_list);
|
||||||
|
|
||||||
|
#ifndef GRUB_LST_GENERATOR
|
||||||
|
static inline void
|
||||||
|
grub_partition_map_register (grub_partition_map_t partmap)
|
||||||
|
{
|
||||||
|
grub_list_push (GRUB_AS_LIST_P (&grub_partition_map_list),
|
||||||
|
GRUB_AS_LIST (partmap));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_partition_map_unregister (grub_partition_map_t partmap)
|
||||||
|
{
|
||||||
|
grub_list_remove (GRUB_AS_LIST (partmap));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define FOR_PARTITION_MAPS(var) FOR_LIST_ELEMENTS((var), (grub_partition_map_list))
|
||||||
|
|
||||||
|
|
||||||
|
static inline grub_disk_addr_t
|
||||||
|
grub_partition_get_start (const grub_partition_t p)
|
||||||
|
{
|
||||||
|
grub_partition_t part;
|
||||||
|
grub_uint64_t part_start = 0;
|
||||||
|
|
||||||
|
for (part = p; part; part = part->parent)
|
||||||
|
part_start += part->start;
|
||||||
|
|
||||||
|
return part_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline grub_uint64_t
|
||||||
|
grub_partition_get_len (const grub_partition_t p)
|
||||||
|
{
|
||||||
|
return p->len;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ! GRUB_PART_HEADER */
|
||||||
205
GRUB2/MOD_SRC/grub-2.04/include/grub/serial.h
Normal file
205
GRUB2/MOD_SRC/grub-2.04/include/grub/serial.h
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
/* serial.h - serial device interface */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2010 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_SERIAL_HEADER
|
||||||
|
#define GRUB_SERIAL_HEADER 1
|
||||||
|
|
||||||
|
#include <grub/types.h>
|
||||||
|
#if (defined(__mips__) && _MIPS_SIM != _ABI64) || defined (__i386__) || defined (__x86_64__)
|
||||||
|
#include <grub/cpu/io.h>
|
||||||
|
#endif
|
||||||
|
#include <grub/usb.h>
|
||||||
|
#include <grub/list.h>
|
||||||
|
#include <grub/term.h>
|
||||||
|
#ifdef GRUB_MACHINE_IEEE1275
|
||||||
|
#include <grub/ieee1275/ieee1275.h>
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_ARC
|
||||||
|
#include <grub/arc/arc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct grub_serial_port;
|
||||||
|
struct grub_serial_config;
|
||||||
|
|
||||||
|
struct grub_serial_driver
|
||||||
|
{
|
||||||
|
grub_err_t (*configure) (struct grub_serial_port *port,
|
||||||
|
struct grub_serial_config *config);
|
||||||
|
int (*fetch) (struct grub_serial_port *port);
|
||||||
|
void (*put) (struct grub_serial_port *port, const int c);
|
||||||
|
void (*fini) (struct grub_serial_port *port);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The type of parity. */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GRUB_SERIAL_PARITY_NONE,
|
||||||
|
GRUB_SERIAL_PARITY_ODD,
|
||||||
|
GRUB_SERIAL_PARITY_EVEN,
|
||||||
|
} grub_serial_parity_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GRUB_SERIAL_STOP_BITS_1,
|
||||||
|
GRUB_SERIAL_STOP_BITS_1_5,
|
||||||
|
GRUB_SERIAL_STOP_BITS_2,
|
||||||
|
} grub_serial_stop_bits_t;
|
||||||
|
|
||||||
|
struct grub_serial_config
|
||||||
|
{
|
||||||
|
unsigned speed;
|
||||||
|
int word_len;
|
||||||
|
grub_serial_parity_t parity;
|
||||||
|
grub_serial_stop_bits_t stop_bits;
|
||||||
|
grub_uint64_t base_clock;
|
||||||
|
int rtscts;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct grub_serial_port
|
||||||
|
{
|
||||||
|
struct grub_serial_port *next;
|
||||||
|
struct grub_serial_port **prev;
|
||||||
|
char *name;
|
||||||
|
struct grub_serial_driver *driver;
|
||||||
|
struct grub_serial_config config;
|
||||||
|
int configured;
|
||||||
|
int broken;
|
||||||
|
|
||||||
|
/* This should be void *data but since serial is useful as an early console
|
||||||
|
when malloc isn't available it's a union.
|
||||||
|
*/
|
||||||
|
union
|
||||||
|
{
|
||||||
|
#if (defined(__mips__) && _MIPS_SIM != _ABI64) || defined (__i386__) || defined (__x86_64__)
|
||||||
|
grub_port_t port;
|
||||||
|
#endif
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
grub_usb_device_t usbdev;
|
||||||
|
int configno;
|
||||||
|
int interfno;
|
||||||
|
char buf[64];
|
||||||
|
int bufstart, bufend;
|
||||||
|
struct grub_usb_desc_endp *in_endp;
|
||||||
|
struct grub_usb_desc_endp *out_endp;
|
||||||
|
};
|
||||||
|
struct grub_escc_descriptor *escc_desc;
|
||||||
|
#ifdef GRUB_MACHINE_IEEE1275
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
grub_ieee1275_ihandle_t handle;
|
||||||
|
struct ofserial_hash_ent *elem;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_EFI
|
||||||
|
struct grub_efi_serial_io_interface *interface;
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_ARC
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
grub_arc_fileno_t handle;
|
||||||
|
int handle_valid;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
grub_term_output_t term_out;
|
||||||
|
grub_term_input_t term_in;
|
||||||
|
};
|
||||||
|
|
||||||
|
grub_err_t EXPORT_FUNC(grub_serial_register) (struct grub_serial_port *port);
|
||||||
|
|
||||||
|
void EXPORT_FUNC(grub_serial_unregister) (struct grub_serial_port *port);
|
||||||
|
|
||||||
|
/* Convenience functions to perform primitive operations on a port. */
|
||||||
|
static inline grub_err_t
|
||||||
|
grub_serial_port_configure (struct grub_serial_port *port,
|
||||||
|
struct grub_serial_config *config)
|
||||||
|
{
|
||||||
|
return port->driver->configure (port, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
grub_serial_port_fetch (struct grub_serial_port *port)
|
||||||
|
{
|
||||||
|
return port->driver->fetch (port);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_serial_port_put (struct grub_serial_port *port, const int c)
|
||||||
|
{
|
||||||
|
port->driver->put (port, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
grub_serial_port_fini (struct grub_serial_port *port)
|
||||||
|
{
|
||||||
|
port->driver->fini (port);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set default settings. */
|
||||||
|
static inline grub_err_t
|
||||||
|
grub_serial_config_defaults (struct grub_serial_port *port)
|
||||||
|
{
|
||||||
|
struct grub_serial_config config =
|
||||||
|
{
|
||||||
|
#ifdef GRUB_MACHINE_MIPS_LOONGSON
|
||||||
|
.speed = 115200,
|
||||||
|
/* On Loongson machines serial port has only 3 wires. */
|
||||||
|
.rtscts = 0,
|
||||||
|
#else
|
||||||
|
.speed = 9600,
|
||||||
|
.rtscts = 1,
|
||||||
|
#endif
|
||||||
|
.word_len = 8,
|
||||||
|
.parity = GRUB_SERIAL_PARITY_NONE,
|
||||||
|
.stop_bits = GRUB_SERIAL_STOP_BITS_1,
|
||||||
|
.base_clock = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
return port->driver->configure (port, &config);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (defined(__mips__) && _MIPS_SIM != _ABI64) || defined (__i386__) || defined (__x86_64__)
|
||||||
|
void grub_ns8250_init (void);
|
||||||
|
char *grub_serial_ns8250_add_port (grub_port_t port);
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_IEEE1275
|
||||||
|
void grub_ofserial_init (void);
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_EFI
|
||||||
|
void
|
||||||
|
grub_efiserial_init (void);
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_MACHINE_ARC
|
||||||
|
void
|
||||||
|
grub_arcserial_init (void);
|
||||||
|
const char *
|
||||||
|
grub_arcserial_add_port (const char *path);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct grub_serial_port *grub_serial_find (const char *name);
|
||||||
|
extern struct grub_serial_driver grub_ns8250_driver;
|
||||||
|
void EXPORT_FUNC(grub_serial_unregister_driver) (struct grub_serial_driver *driver);
|
||||||
|
|
||||||
|
#ifndef GRUB_MACHINE_EMU
|
||||||
|
extern void grub_serial_init (void);
|
||||||
|
extern void grub_serial_fini (void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
269
GRUB2/MOD_SRC/grub-2.04/include/grub/util/install.h
Normal file
269
GRUB2/MOD_SRC/grub-2.04/include/grub/util/install.h
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2013 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_UTIL_INSTALL_HEADER
|
||||||
|
#define GRUB_UTIL_INSTALL_HEADER 1
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <grub/device.h>
|
||||||
|
#include <grub/disk.h>
|
||||||
|
#include <grub/emu/hostfile.h>
|
||||||
|
|
||||||
|
#define GRUB_INSTALL_OPTIONS \
|
||||||
|
{ "modules", GRUB_INSTALL_OPTIONS_MODULES, N_("MODULES"), \
|
||||||
|
0, N_("pre-load specified modules MODULES"), 1 }, \
|
||||||
|
{ "dtb", GRUB_INSTALL_OPTIONS_DTB, N_("FILE"), \
|
||||||
|
0, N_("embed a specific DTB"), 1 }, \
|
||||||
|
{ "install-modules", GRUB_INSTALL_OPTIONS_INSTALL_MODULES, \
|
||||||
|
N_("MODULES"), 0, \
|
||||||
|
N_("install only MODULES and their dependencies [default=all]"), 1 }, \
|
||||||
|
{ "themes", GRUB_INSTALL_OPTIONS_INSTALL_THEMES, N_("THEMES"), \
|
||||||
|
0, N_("install THEMES [default=%s]"), 1 }, \
|
||||||
|
{ "fonts", GRUB_INSTALL_OPTIONS_INSTALL_FONTS, N_("FONTS"), \
|
||||||
|
0, N_("install FONTS [default=%s]"), 1 }, \
|
||||||
|
{ "locales", GRUB_INSTALL_OPTIONS_INSTALL_LOCALES, N_("LOCALES"),\
|
||||||
|
0, N_("install only LOCALES [default=all]"), 1 }, \
|
||||||
|
{ "compress", GRUB_INSTALL_OPTIONS_INSTALL_COMPRESS, \
|
||||||
|
"no|xz|gz|lzo", 0, \
|
||||||
|
N_("compress GRUB files [optional]"), 1 }, \
|
||||||
|
{"core-compress", GRUB_INSTALL_OPTIONS_INSTALL_CORE_COMPRESS, \
|
||||||
|
"xz|none|auto", \
|
||||||
|
0, N_("choose the compression to use for core image"), 2}, \
|
||||||
|
/* TRANSLATORS: platform here isn't identifier. It can be translated. */ \
|
||||||
|
{ "directory", 'd', N_("DIR"), 0, \
|
||||||
|
N_("use images and modules under DIR [default=%s/<platform>]"), 1 }, \
|
||||||
|
{ "override-directory", GRUB_INSTALL_OPTIONS_DIRECTORY2, \
|
||||||
|
N_("DIR"), OPTION_HIDDEN, \
|
||||||
|
N_("use images and modules under DIR [default=%s/<platform>]"), 1 }, \
|
||||||
|
{ "locale-directory", GRUB_INSTALL_OPTIONS_LOCALE_DIRECTORY, \
|
||||||
|
N_("DIR"), 0, \
|
||||||
|
N_("use translations under DIR [default=%s]"), 1 }, \
|
||||||
|
{ "themes-directory", GRUB_INSTALL_OPTIONS_THEMES_DIRECTORY, \
|
||||||
|
N_("DIR"), OPTION_HIDDEN, \
|
||||||
|
N_("use themes under DIR [default=%s]"), 1 }, \
|
||||||
|
{ "grub-mkimage", GRUB_INSTALL_OPTIONS_GRUB_MKIMAGE, \
|
||||||
|
"FILE", OPTION_HIDDEN, 0, 1 }, \
|
||||||
|
/* TRANSLATORS: "embed" is a verb (command description). "*/ \
|
||||||
|
{ "pubkey", 'k', N_("FILE"), 0, \
|
||||||
|
N_("embed FILE as public key for signature checking"), 0}, \
|
||||||
|
{ "verbose", 'v', 0, 0, \
|
||||||
|
N_("print verbose messages."), 1 }
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_install_parse (int key, char *arg);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_push_module (const char *val);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_pop_module (void);
|
||||||
|
|
||||||
|
char *
|
||||||
|
grub_install_help_filter (int key, const char *text,
|
||||||
|
void *input __attribute__ ((unused)));
|
||||||
|
|
||||||
|
enum grub_install_plat
|
||||||
|
{
|
||||||
|
GRUB_INSTALL_PLATFORM_I386_PC,
|
||||||
|
GRUB_INSTALL_PLATFORM_I386_EFI,
|
||||||
|
GRUB_INSTALL_PLATFORM_I386_QEMU,
|
||||||
|
GRUB_INSTALL_PLATFORM_I386_COREBOOT,
|
||||||
|
GRUB_INSTALL_PLATFORM_I386_MULTIBOOT,
|
||||||
|
GRUB_INSTALL_PLATFORM_I386_IEEE1275,
|
||||||
|
GRUB_INSTALL_PLATFORM_X86_64_EFI,
|
||||||
|
GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON,
|
||||||
|
GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275,
|
||||||
|
GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275,
|
||||||
|
GRUB_INSTALL_PLATFORM_MIPSEL_ARC,
|
||||||
|
GRUB_INSTALL_PLATFORM_MIPS_ARC,
|
||||||
|
GRUB_INSTALL_PLATFORM_IA64_EFI,
|
||||||
|
GRUB_INSTALL_PLATFORM_ARM_UBOOT,
|
||||||
|
GRUB_INSTALL_PLATFORM_ARM_EFI,
|
||||||
|
GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS,
|
||||||
|
GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS,
|
||||||
|
GRUB_INSTALL_PLATFORM_I386_XEN,
|
||||||
|
GRUB_INSTALL_PLATFORM_X86_64_XEN,
|
||||||
|
GRUB_INSTALL_PLATFORM_I386_XEN_PVH,
|
||||||
|
GRUB_INSTALL_PLATFORM_ARM64_EFI,
|
||||||
|
GRUB_INSTALL_PLATFORM_MIPS64EL_EFI,
|
||||||
|
GRUB_INSTALL_PLATFORM_ARM_COREBOOT,
|
||||||
|
GRUB_INSTALL_PLATFORM_RISCV32_EFI,
|
||||||
|
GRUB_INSTALL_PLATFORM_RISCV64_EFI,
|
||||||
|
GRUB_INSTALL_PLATFORM_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
enum grub_install_options {
|
||||||
|
GRUB_INSTALL_OPTIONS_DIRECTORY = 'd',
|
||||||
|
GRUB_INSTALL_OPTIONS_VERBOSITY = 'v',
|
||||||
|
GRUB_INSTALL_OPTIONS_MODULES = 0x201,
|
||||||
|
GRUB_INSTALL_OPTIONS_INSTALL_MODULES,
|
||||||
|
GRUB_INSTALL_OPTIONS_INSTALL_THEMES,
|
||||||
|
GRUB_INSTALL_OPTIONS_INSTALL_FONTS,
|
||||||
|
GRUB_INSTALL_OPTIONS_INSTALL_LOCALES,
|
||||||
|
GRUB_INSTALL_OPTIONS_INSTALL_COMPRESS,
|
||||||
|
GRUB_INSTALL_OPTIONS_DIRECTORY2,
|
||||||
|
GRUB_INSTALL_OPTIONS_LOCALE_DIRECTORY,
|
||||||
|
GRUB_INSTALL_OPTIONS_THEMES_DIRECTORY,
|
||||||
|
GRUB_INSTALL_OPTIONS_GRUB_MKIMAGE,
|
||||||
|
GRUB_INSTALL_OPTIONS_INSTALL_CORE_COMPRESS,
|
||||||
|
GRUB_INSTALL_OPTIONS_DTB
|
||||||
|
};
|
||||||
|
|
||||||
|
extern char *grub_install_source_directory;
|
||||||
|
|
||||||
|
enum grub_install_plat
|
||||||
|
grub_install_get_target (const char *src);
|
||||||
|
void
|
||||||
|
grub_install_mkdir_p (const char *dst);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_copy_files (const char *src,
|
||||||
|
const char *dst,
|
||||||
|
enum grub_install_plat platid);
|
||||||
|
char *
|
||||||
|
grub_install_get_platform_name (enum grub_install_plat platid);
|
||||||
|
|
||||||
|
const char *
|
||||||
|
grub_install_get_platform_cpu (enum grub_install_plat platid);
|
||||||
|
|
||||||
|
const char *
|
||||||
|
grub_install_get_platform_platform (enum grub_install_plat platid);
|
||||||
|
|
||||||
|
char *
|
||||||
|
grub_install_get_platforms_string (void);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GRUB_COMPRESSION_AUTO,
|
||||||
|
GRUB_COMPRESSION_NONE,
|
||||||
|
GRUB_COMPRESSION_XZ,
|
||||||
|
GRUB_COMPRESSION_LZMA
|
||||||
|
} grub_compression_t;
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_make_image_wrap (const char *dir, const char *prefix,
|
||||||
|
const char *outname, char *memdisk_path,
|
||||||
|
char *config_path,
|
||||||
|
const char *format, int note);
|
||||||
|
void
|
||||||
|
grub_install_make_image_wrap_file (const char *dir, const char *prefix,
|
||||||
|
FILE *fp, const char *outname,
|
||||||
|
char *memdisk_path,
|
||||||
|
char *config_path,
|
||||||
|
const char *mkimage_target, int note);
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_install_copy_file (const char *src,
|
||||||
|
const char *dst,
|
||||||
|
int is_critical);
|
||||||
|
|
||||||
|
struct grub_install_image_target_desc;
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_generate_image (const char *dir, const char *prefix,
|
||||||
|
FILE *out,
|
||||||
|
const char *outname, char *mods[],
|
||||||
|
char *memdisk_path, char **pubkey_paths,
|
||||||
|
size_t npubkeys,
|
||||||
|
char *config_path,
|
||||||
|
const struct grub_install_image_target_desc *image_target,
|
||||||
|
int note,
|
||||||
|
grub_compression_t comp, const char *dtb_file);
|
||||||
|
|
||||||
|
const struct grub_install_image_target_desc *
|
||||||
|
grub_install_get_image_target (const char *arg);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_util_bios_setup (const char *dir,
|
||||||
|
const char *boot_file, const char *core_file,
|
||||||
|
const char *dest, int force,
|
||||||
|
int fs_probe, int allow_floppy,
|
||||||
|
int add_rs_codes);
|
||||||
|
void
|
||||||
|
grub_util_sparc_setup (const char *dir,
|
||||||
|
const char *boot_file, const char *core_file,
|
||||||
|
const char *dest, int force,
|
||||||
|
int fs_probe, int allow_floppy,
|
||||||
|
int add_rs_codes);
|
||||||
|
|
||||||
|
char *
|
||||||
|
grub_install_get_image_targets_string (void);
|
||||||
|
|
||||||
|
const char *
|
||||||
|
grub_util_get_target_dirname (const struct grub_install_image_target_desc *t);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_create_envblk_file (const char *name);
|
||||||
|
|
||||||
|
const char *
|
||||||
|
grub_install_get_default_arm_platform (void);
|
||||||
|
|
||||||
|
const char *
|
||||||
|
grub_install_get_default_x86_platform (void);
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_install_register_efi (grub_device_t efidir_grub_dev,
|
||||||
|
const char *efifile_path,
|
||||||
|
const char *efi_distributor);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_register_ieee1275 (int is_prep, const char *install_device,
|
||||||
|
int partno, const char *relpath);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_sgi_setup (const char *install_device,
|
||||||
|
const char *imgfile, const char *destname);
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_install_compress_gzip (const char *src, const char *dest);
|
||||||
|
int
|
||||||
|
grub_install_compress_lzop (const char *src, const char *dest);
|
||||||
|
int
|
||||||
|
grub_install_compress_xz (const char *src, const char *dest);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_install_get_blocklist (grub_device_t root_dev,
|
||||||
|
const char *core_path, const char *core_img,
|
||||||
|
size_t core_size,
|
||||||
|
void (*callback) (grub_disk_addr_t sector,
|
||||||
|
unsigned offset,
|
||||||
|
unsigned length,
|
||||||
|
void *data),
|
||||||
|
void *hook_data);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_util_create_envblk_file (const char *name);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_util_glue_efi (const char *file32, const char *file64, const char *out);
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_util_render_label (const char *label_font,
|
||||||
|
const char *label_bgcolor,
|
||||||
|
const char *label_color,
|
||||||
|
const char *label_string,
|
||||||
|
const char *label);
|
||||||
|
|
||||||
|
const char *
|
||||||
|
grub_util_get_target_name (const struct grub_install_image_target_desc *t);
|
||||||
|
|
||||||
|
extern char *grub_install_copy_buffer;
|
||||||
|
#define GRUB_INSTALL_COPY_BUFFER_SIZE 1048576
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -135,7 +135,8 @@ typedef struct ventoy_windows_data
|
|||||||
{
|
{
|
||||||
char auto_install_script[384];
|
char auto_install_script[384];
|
||||||
char injection_archive[384];
|
char injection_archive[384];
|
||||||
grub_uint8_t reserved[256];
|
grub_uint8_t windows11_bypass_check;
|
||||||
|
grub_uint8_t reserved[255];
|
||||||
}ventoy_windows_data;
|
}ventoy_windows_data;
|
||||||
|
|
||||||
|
|
||||||
@@ -241,6 +242,7 @@ typedef struct ventoy_img_chunk_list
|
|||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
|
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
|
||||||
|
#define GRUB_IMG_REPLACE_MAGIC 0x1259BEEF
|
||||||
|
|
||||||
typedef const char * (*grub_env_get_pf)(const char *name);
|
typedef const char * (*grub_env_get_pf)(const char *name);
|
||||||
typedef int (*grub_env_set_pf)(const char *name, const char *val);
|
typedef int (*grub_env_set_pf)(const char *name, const char *val);
|
||||||
@@ -259,6 +261,7 @@ typedef struct ventoy_grub_param
|
|||||||
grub_env_get_pf grub_env_get;
|
grub_env_get_pf grub_env_get;
|
||||||
grub_env_set_pf grub_env_set;
|
grub_env_set_pf grub_env_set;
|
||||||
ventoy_grub_param_file_replace file_replace;
|
ventoy_grub_param_file_replace file_replace;
|
||||||
|
ventoy_grub_param_file_replace img_replace;
|
||||||
grub_env_printf_pf grub_env_printf;
|
grub_env_printf_pf grub_env_printf;
|
||||||
}ventoy_grub_param;
|
}ventoy_grub_param;
|
||||||
|
|
||||||
@@ -267,6 +270,7 @@ typedef struct ventoy_grub_param
|
|||||||
int grub_ext_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list);
|
int grub_ext_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list);
|
||||||
int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list);
|
int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list);
|
||||||
void grub_iso9660_set_nojoliet(int nojoliet);
|
void grub_iso9660_set_nojoliet(int nojoliet);
|
||||||
|
int grub_iso9660_is_joliet(void);
|
||||||
grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file);
|
grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file);
|
||||||
grub_uint64_t grub_iso9660_get_last_file_dirent_pos(grub_file_t file);
|
grub_uint64_t grub_iso9660_get_last_file_dirent_pos(grub_file_t file);
|
||||||
grub_uint64_t grub_udf_get_file_offset(grub_file_t file);
|
grub_uint64_t grub_udf_get_file_offset(grub_file_t file);
|
||||||
|
|||||||
@@ -12,12 +12,14 @@ make install
|
|||||||
PATH=$PATH:$VT_DIR/GRUB2/INSTALL/bin/:$VT_DIR/GRUB2/INSTALL/sbin/
|
PATH=$PATH:$VT_DIR/GRUB2/INSTALL/bin/:$VT_DIR/GRUB2/INSTALL/sbin/
|
||||||
|
|
||||||
net_modules_legacy="net tftp http"
|
net_modules_legacy="net tftp http"
|
||||||
all_modules_legacy="setkey date drivemap blocklist regexp newc vga_text ntldr search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio lspci pci ext2 xfs ventoy chain read halt iso9660 linux16 test true sleep reboot echo videotest videoinfo videotest_checksum video_colors video_cirrus video_bochs vga vbe video_fb font video gettext extcmd terminal linux minicmd help configfile tr trig boot biosdisk disk ls tar squash4 password_pbkdf2 all_video png jpeg part_gpt part_msdos fat exfat ntfs loopback gzio normal udf gfxmenu gfxterm gfxterm_background gfxterm_menu"
|
all_modules_legacy="file setkey date drivemap blocklist regexp newc vga_text ntldr search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio lspci pci ext2 xfs ventoy chain read halt iso9660 linux16 test true sleep reboot echo videotest videoinfo videotest_checksum video_colors video_cirrus video_bochs vga vbe video_fb font video gettext extcmd terminal linux minicmd help configfile tr trig boot biosdisk disk ls tar squash4 password_pbkdf2 all_video png jpeg part_gpt part_msdos fat exfat ntfs loopback gzio normal udf gfxmenu gfxterm gfxterm_background gfxterm_menu"
|
||||||
|
|
||||||
net_modules_uefi="efinet net tftp http"
|
net_modules_uefi="efinet net tftp http"
|
||||||
all_modules_uefi="setkey blocklist ventoy test true regexp newc search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux relocator jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop efi_uga video_bochs video_cirrus video video_fb gfxterm_background gfxterm_menu"
|
all_modules_uefi="file setkey blocklist ventoy test true regexp newc search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux relocator jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop efi_uga video_bochs video_cirrus video video_fb gfxterm_background gfxterm_menu"
|
||||||
|
|
||||||
all_modules_arm64_uefi="setkey blocklist ventoy test true regexp newc search gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop video video_fb gfxterm_background gfxterm_menu"
|
all_modules_arm64_uefi="file setkey blocklist ventoy test true regexp newc search gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop video video_fb gfxterm_background gfxterm_menu"
|
||||||
|
|
||||||
|
all_modules_mips64el_uefi="file setkey blocklist ventoy test true regexp newc search gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop video video_fb gfxterm_background gfxterm_menu"
|
||||||
|
|
||||||
|
|
||||||
if [ "$1" = "uefi" ]; then
|
if [ "$1" = "uefi" ]; then
|
||||||
@@ -34,6 +36,10 @@ elif [ "$1" = "arm64" ]; then
|
|||||||
all_modules="$net_modules_uefi $all_modules_arm64_uefi "
|
all_modules="$net_modules_uefi $all_modules_arm64_uefi "
|
||||||
|
|
||||||
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/arm64-efi" --prefix '(,2)/grub' --output "$VT_DIR/INSTALL/EFI/BOOT/BOOTAA64.EFI" --format 'arm64-efi' --compression 'auto' $all_modules_arm64_uefi
|
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/arm64-efi" --prefix '(,2)/grub' --output "$VT_DIR/INSTALL/EFI/BOOT/BOOTAA64.EFI" --format 'arm64-efi' --compression 'auto' $all_modules_arm64_uefi
|
||||||
|
elif [ "$1" = "mips64el" ]; then
|
||||||
|
all_modules="$net_modules_uefi $all_modules_mips64el_uefi "
|
||||||
|
|
||||||
|
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/mips64el-efi" --prefix '(,2)/grub' --output "$VT_DIR/INSTALL/EFI/BOOT/BOOTMIPS.EFI" --format 'mips64el-efi' --compression 'auto' $all_modules_mips64el_uefi
|
||||||
else
|
else
|
||||||
all_modules="$net_modules_legacy $all_modules_legacy "
|
all_modules="$net_modules_legacy $all_modules_legacy "
|
||||||
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc" --prefix '(,2)/grub' --output "$VT_DIR/INSTALL/grub/i386-pc/core.img" --format 'i386-pc' --compression 'auto' $all_modules_legacy 'fat' 'part_msdos' 'biosdisk'
|
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc" --prefix '(,2)/grub' --output "$VT_DIR/INSTALL/grub/i386-pc/core.img" --format 'i386-pc' --compression 'auto' $all_modules_legacy 'fat' 'part_msdos' 'biosdisk'
|
||||||
@@ -91,6 +97,26 @@ elif [ "$1" = "arm64" ]; then
|
|||||||
if ! echo $all_modules | grep -q " ${line%.mod} "; then
|
if ! echo $all_modules | grep -q " ${line%.mod} "; then
|
||||||
echo "Copy $line ..."
|
echo "Copy $line ..."
|
||||||
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/arm64-efi/$line $VT_DIR/INSTALL/grub/arm64-efi/
|
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/arm64-efi/$line $VT_DIR/INSTALL/grub/arm64-efi/
|
||||||
|
xz $VT_DIR/INSTALL/grub/arm64-efi/$line
|
||||||
|
mv $VT_DIR/INSTALL/grub/arm64-efi/${line}.xz $VT_DIR/INSTALL/grub/arm64-efi/${line}
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
elif [ "$1" = "mips64el" ]; then
|
||||||
|
rm -f $VT_DIR/GRUB2/NBP/core.efi
|
||||||
|
cp -a $VT_DIR/GRUB2/PXE/grub2/mips64el-efi/core.efi $VT_DIR/GRUB2/NBP/core.efi || exit 1
|
||||||
|
|
||||||
|
rm -rf $VT_DIR/INSTALL/grub/mips64el-efi
|
||||||
|
mkdir -p $VT_DIR/INSTALL/grub/mips64el-efi
|
||||||
|
|
||||||
|
cp -a $VT_DIR/GRUB2/PXE/grub2/mips64el-efi/normal.mod $VT_DIR/INSTALL/grub/mips64el-efi/normal.mod || exit 1
|
||||||
|
|
||||||
|
#copy other modules
|
||||||
|
ls -1 $VT_DIR/GRUB2/INSTALL/lib/grub/mips64el-efi/ | egrep '\.(lst|mod)$' | while read line; do
|
||||||
|
if ! echo $all_modules | grep -q " ${line%.mod} "; then
|
||||||
|
echo "Copy $line ..."
|
||||||
|
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/mips64el-efi/$line $VT_DIR/INSTALL/grub/mips64el-efi/
|
||||||
|
xz $VT_DIR/INSTALL/grub/mips64el-efi/$line
|
||||||
|
mv $VT_DIR/INSTALL/grub/mips64el-efi/${line}.xz $VT_DIR/INSTALL/grub/mips64el-efi/${line}
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
|
|||||||
1000
GRUB2/MOD_SRC/grub-2.04/util/grub-install-common.c
Normal file
1000
GRUB2/MOD_SRC/grub-2.04/util/grub-install-common.c
Normal file
File diff suppressed because it is too large
Load Diff
1981
GRUB2/MOD_SRC/grub-2.04/util/grub-install.c
Normal file
1981
GRUB2/MOD_SRC/grub-2.04/util/grub-install.c
Normal file
File diff suppressed because it is too large
Load Diff
373
GRUB2/MOD_SRC/grub-2.04/util/grub-mkconfig_lib.in
Normal file
373
GRUB2/MOD_SRC/grub-2.04/util/grub-mkconfig_lib.in
Normal file
@@ -0,0 +1,373 @@
|
|||||||
|
# Helper library for grub-mkconfig
|
||||||
|
# Copyright (C) 2007,2008,2009,2010 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
prefix="@prefix@"
|
||||||
|
exec_prefix="@exec_prefix@"
|
||||||
|
datarootdir="@datarootdir@"
|
||||||
|
datadir="@datadir@"
|
||||||
|
bindir="@bindir@"
|
||||||
|
sbindir="@sbindir@"
|
||||||
|
if [ "x$pkgdatadir" = x ]; then
|
||||||
|
pkgdatadir="${datadir}/@PACKAGE@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$grub_probe" = x; then
|
||||||
|
grub_probe="${sbindir}/@grub_probe@"
|
||||||
|
fi
|
||||||
|
if test "x$grub_file" = x; then
|
||||||
|
grub_file="${bindir}/@grub_file@"
|
||||||
|
fi
|
||||||
|
if test "x$grub_mkrelpath" = x; then
|
||||||
|
grub_mkrelpath="${bindir}/@grub_mkrelpath@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if which gettext >/dev/null 2>/dev/null; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
gettext () {
|
||||||
|
printf "%s" "$@"
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
|
grub_warn ()
|
||||||
|
{
|
||||||
|
echo "$(gettext "Warning:")" "$@" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
make_system_path_relative_to_its_root ()
|
||||||
|
{
|
||||||
|
"${grub_mkrelpath}" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
is_path_readable_by_grub ()
|
||||||
|
{
|
||||||
|
path="$1"
|
||||||
|
|
||||||
|
# abort if path doesn't exist
|
||||||
|
if test -e "$path" ; then : ;else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# abort if file is in a filesystem we can't read
|
||||||
|
if "${grub_probe}" -t fs "$path" > /dev/null 2>&1 ; then : ; else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ... or if we can't figure out the abstraction module, for example if
|
||||||
|
# memberlist fails on an LVM volume group.
|
||||||
|
if abstractions="`"${grub_probe}" -t abstraction "$path"`" 2> /dev/null ; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x$GRUB_ENABLE_CRYPTODISK = xy ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
for abstraction in $abstractions; do
|
||||||
|
if [ "x$abstraction" = xcryptodisk ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
convert_system_path_to_grub_path ()
|
||||||
|
{
|
||||||
|
path="$1"
|
||||||
|
|
||||||
|
grub_warn "convert_system_path_to_grub_path() is deprecated. Use prepare_grub_to_access_device() instead."
|
||||||
|
|
||||||
|
# abort if GRUB can't access the path
|
||||||
|
if is_path_readable_by_grub "${path}" ; then : ; else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if drive="`"${grub_probe}" -t drive "$path"`" ; then : ; else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if relative_path="`make_system_path_relative_to_its_root "$path"`" ; then : ; else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${drive}${relative_path}"
|
||||||
|
}
|
||||||
|
|
||||||
|
save_default_entry ()
|
||||||
|
{
|
||||||
|
if [ "x${GRUB_SAVEDEFAULT}" = "xtrue" ] ; then
|
||||||
|
cat << EOF
|
||||||
|
savedefault
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare_grub_to_access_device ()
|
||||||
|
{
|
||||||
|
old_ifs="$IFS"
|
||||||
|
IFS='
|
||||||
|
'
|
||||||
|
:<<\EOF
|
||||||
|
partmap="`"${grub_probe}" --device $@ --target=partmap`"
|
||||||
|
for module in ${partmap} ; do
|
||||||
|
case "${module}" in
|
||||||
|
netbsd | openbsd)
|
||||||
|
echo "insmod part_bsd";;
|
||||||
|
*)
|
||||||
|
echo "insmod part_${module}";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Abstraction modules aren't auto-loaded.
|
||||||
|
abstraction="`"${grub_probe}" --device $@ --target=abstraction`"
|
||||||
|
for module in ${abstraction} ; do
|
||||||
|
echo "insmod ${module}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# fs="`"${grub_probe}" --device $@ --target=fs`"
|
||||||
|
# for module in ${fs} ; do
|
||||||
|
# echo "insmod ${module}"
|
||||||
|
# done
|
||||||
|
|
||||||
|
if [ x$GRUB_ENABLE_CRYPTODISK = xy ]; then
|
||||||
|
for uuid in `"${grub_probe}" --device $@ --target=cryptodisk_uuid`; do
|
||||||
|
echo "cryptomount -u $uuid"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If there's a filesystem UUID that GRUB is capable of identifying, use it;
|
||||||
|
# otherwise set root as per value in device.map.
|
||||||
|
fs_hint="`"${grub_probe}" --device $@ --target=compatibility_hint`"
|
||||||
|
if [ "x$fs_hint" != x ]; then
|
||||||
|
echo "set root='$fs_hint'"
|
||||||
|
fi
|
||||||
|
if fs_uuid="`"${grub_probe}" --device $@ --target=fs_uuid 2> /dev/null`" ; then
|
||||||
|
hints="`"${grub_probe}" --device $@ --target=hints_string 2> /dev/null`" || hints=
|
||||||
|
echo "if [ x\$feature_platform_search_hint = xy ]; then"
|
||||||
|
echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
|
||||||
|
echo "else"
|
||||||
|
echo " search --no-floppy --fs-uuid --set=root ${fs_uuid}"
|
||||||
|
echo "fi"
|
||||||
|
fi
|
||||||
|
IFS="$old_ifs"
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_get_device_id ()
|
||||||
|
{
|
||||||
|
old_ifs="$IFS"
|
||||||
|
IFS='
|
||||||
|
'
|
||||||
|
device="$1"
|
||||||
|
if fs_uuid="`"${grub_probe}" --device ${device} --target=fs_uuid 2> /dev/null`" ; then
|
||||||
|
echo "$fs_uuid";
|
||||||
|
else
|
||||||
|
echo $device |sed 's, ,_,g'
|
||||||
|
fi
|
||||||
|
IFS="$old_ifs"
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_file_is_not_garbage ()
|
||||||
|
{
|
||||||
|
if test -f "$1" ; then
|
||||||
|
case "$1" in
|
||||||
|
*.dpkg-*) return 1 ;; # debian dpkg
|
||||||
|
*.rpmsave|*.rpmnew) return 1 ;;
|
||||||
|
README*|*/README*) return 1 ;; # documentation
|
||||||
|
*.sig) return 1 ;; # signatures
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
version_sort ()
|
||||||
|
{
|
||||||
|
case $version_sort_sort_has_v in
|
||||||
|
yes)
|
||||||
|
LC_ALL=C sort -V;;
|
||||||
|
no)
|
||||||
|
LC_ALL=C sort -n;;
|
||||||
|
*)
|
||||||
|
if sort -V </dev/null > /dev/null 2>&1; then
|
||||||
|
version_sort_sort_has_v=yes
|
||||||
|
LC_ALL=C sort -V
|
||||||
|
else
|
||||||
|
version_sort_sort_has_v=no
|
||||||
|
LC_ALL=C sort -n
|
||||||
|
fi;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
version_test_numeric ()
|
||||||
|
{
|
||||||
|
version_test_numeric_a="$1"
|
||||||
|
version_test_numeric_cmp="$2"
|
||||||
|
version_test_numeric_b="$3"
|
||||||
|
if [ "$version_test_numeric_a" = "$version_test_numeric_b" ] ; then
|
||||||
|
case "$version_test_numeric_cmp" in
|
||||||
|
ge|eq|le) return 0 ;;
|
||||||
|
gt|lt) return 1 ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if [ "$version_test_numeric_cmp" = "lt" ] ; then
|
||||||
|
version_test_numeric_c="$version_test_numeric_a"
|
||||||
|
version_test_numeric_a="$version_test_numeric_b"
|
||||||
|
version_test_numeric_b="$version_test_numeric_c"
|
||||||
|
fi
|
||||||
|
if (echo "$version_test_numeric_a" ; echo "$version_test_numeric_b") | version_sort | head -n 1 | grep -qx "$version_test_numeric_b" ; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
version_test_gt ()
|
||||||
|
{
|
||||||
|
version_test_gt_a="`echo "$1" | sed -e "s/[^-]*-//"`"
|
||||||
|
version_test_gt_b="`echo "$2" | sed -e "s/[^-]*-//"`"
|
||||||
|
version_test_gt_cmp=gt
|
||||||
|
if [ "x$version_test_gt_b" = "x" ] ; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
case "$version_test_gt_a:$version_test_gt_b" in
|
||||||
|
*.old:*.old) ;;
|
||||||
|
*.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=gt ;;
|
||||||
|
*:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=ge ;;
|
||||||
|
esac
|
||||||
|
version_test_numeric "$version_test_gt_a" "$version_test_gt_cmp" "$version_test_gt_b"
|
||||||
|
return "$?"
|
||||||
|
}
|
||||||
|
|
||||||
|
version_find_latest ()
|
||||||
|
{
|
||||||
|
version_find_latest_a=""
|
||||||
|
for i in "$@" ; do
|
||||||
|
if version_test_gt "$i" "$version_find_latest_a" ; then
|
||||||
|
version_find_latest_a="$i"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "$version_find_latest_a"
|
||||||
|
}
|
||||||
|
|
||||||
|
# One layer of quotation is eaten by "" and the second by sed; so this turns
|
||||||
|
# ' into \'.
|
||||||
|
grub_quote () {
|
||||||
|
sed "s/'/'\\\\''/g"
|
||||||
|
}
|
||||||
|
|
||||||
|
gettext_quoted () {
|
||||||
|
gettext "$@" | grub_quote
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run the first argument through gettext, and then pass that and all
|
||||||
|
# remaining arguments to printf. This is a useful abbreviation and tends to
|
||||||
|
# be easier to type.
|
||||||
|
gettext_printf () {
|
||||||
|
gettext_printf_format="$1"
|
||||||
|
shift
|
||||||
|
printf "$(gettext "$gettext_printf_format")" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
uses_abstraction () {
|
||||||
|
device="$1"
|
||||||
|
old_ifs="$IFS"
|
||||||
|
IFS='
|
||||||
|
'
|
||||||
|
|
||||||
|
abstraction="`"${grub_probe}" --device ${device} --target=abstraction`"
|
||||||
|
for module in ${abstraction}; do
|
||||||
|
if test "x${module}" = "x$2"; then
|
||||||
|
IFS="$old_ifs"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$old_ifs"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
print_option_help () {
|
||||||
|
if test x$print_option_help_wc = x; then
|
||||||
|
if wc -L </dev/null > /dev/null 2>&1; then
|
||||||
|
print_option_help_wc=-L
|
||||||
|
elif wc -m </dev/null > /dev/null 2>&1; then
|
||||||
|
print_option_help_wc=-m
|
||||||
|
else
|
||||||
|
print_option_help_wc=-b
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test x$grub_have_fmt = x; then
|
||||||
|
if fmt -w 40 </dev/null > /dev/null 2>&1; then
|
||||||
|
grub_have_fmt=y;
|
||||||
|
else
|
||||||
|
grub_have_fmt=n;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
print_option_help_lead=" $1"
|
||||||
|
print_option_help_lspace="$(echo "$print_option_help_lead" | wc $print_option_help_wc)"
|
||||||
|
print_option_help_fill="$((26 - print_option_help_lspace))"
|
||||||
|
printf "%s" "$print_option_help_lead"
|
||||||
|
if test $print_option_help_fill -le 0; then
|
||||||
|
print_option_help_nl=y
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
print_option_help_i=0;
|
||||||
|
while test $print_option_help_i -lt $print_option_help_fill; do
|
||||||
|
printf " "
|
||||||
|
print_option_help_i=$((print_option_help_i+1))
|
||||||
|
done
|
||||||
|
print_option_help_nl=n
|
||||||
|
fi
|
||||||
|
if test x$grub_have_fmt = xy; then
|
||||||
|
print_option_help_split="$(echo "$2" | fmt -w 50)"
|
||||||
|
else
|
||||||
|
print_option_help_split="$2"
|
||||||
|
fi
|
||||||
|
if test x$print_option_help_nl = xy; then
|
||||||
|
echo "$print_option_help_split" | awk \
|
||||||
|
'{ print " " $0; }'
|
||||||
|
else
|
||||||
|
echo "$print_option_help_split" | awk 'BEGIN { n = 0 }
|
||||||
|
{ if (n == 1) print " " $0; else print $0; n = 1 ; }'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_fmt () {
|
||||||
|
if test x$grub_have_fmt = x; then
|
||||||
|
if fmt -w 40 < /dev/null > /dev/null; then
|
||||||
|
grub_have_fmt=y;
|
||||||
|
else
|
||||||
|
grub_have_fmt=n;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$grub_have_fmt = xy; then
|
||||||
|
fmt
|
||||||
|
else
|
||||||
|
cat
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_tab=" "
|
||||||
|
|
||||||
|
grub_add_tab () {
|
||||||
|
sed -e "s/^/$grub_tab/"
|
||||||
|
}
|
||||||
|
|
||||||
2689
GRUB2/MOD_SRC/grub-2.04/util/grub-mkimagexx.c
Normal file
2689
GRUB2/MOD_SRC/grub-2.04/util/grub-mkimagexx.c
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user