mirror of https://github.com/ipxe/ipxe.git
Compare commits
No commits in common. "master" and "v1.20.1" have entirely different histories.
|
@ -1,121 +0,0 @@
|
|||
name: Build
|
||||
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
|
||||
cache:
|
||||
name: Cache
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Cache permissions
|
||||
run: |
|
||||
sudo chown $(id -un) /var/cache/apt/archives
|
||||
- name: Cache packages
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: /var/cache/apt/archives/*.deb
|
||||
key: apt-cache-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
restore-keys: |
|
||||
apt-cache-
|
||||
- name: Download packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install -y -d -o Acquire::Retries=50 \
|
||||
mtools syslinux isolinux \
|
||||
libc6-dev-i386 valgrind \
|
||||
gcc-arm-none-eabi gcc-aarch64-linux-gnu
|
||||
|
||||
x86:
|
||||
name: x86
|
||||
runs-on: ubuntu-22.04
|
||||
needs: cache
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Cache permissions
|
||||
run: |
|
||||
sudo chown $(id -un) /var/cache/apt/archives
|
||||
- name: Cache packages
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: /var/cache/apt/archives/*.deb
|
||||
key: apt-cache-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
- name: Install packages
|
||||
run: |
|
||||
sudo dpkg --add-architecture i386
|
||||
sudo apt update
|
||||
sudo apt install -y -o Acquire::Retries=50 \
|
||||
mtools syslinux isolinux \
|
||||
libc6-dev-i386 valgrind \
|
||||
libgcc-s1:i386 libc6-dbg:i386
|
||||
- name: Build (BIOS)
|
||||
run: |
|
||||
make -j 4 -C src
|
||||
- name: Build (Everything)
|
||||
run: |
|
||||
make -j 4 -C src everything
|
||||
- name: Test
|
||||
run: |
|
||||
valgrind ./src/bin-i386-linux/tests.linux
|
||||
valgrind ./src/bin-x86_64-linux/tests.linux
|
||||
|
||||
arm32:
|
||||
name: ARM32
|
||||
runs-on: ubuntu-22.04
|
||||
needs: cache
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Cache permissions
|
||||
run: |
|
||||
sudo chown $(id -un) /var/cache/apt/archives
|
||||
- name: Cache packages
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: /var/cache/apt/archives/*.deb
|
||||
key: apt-cache-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
- name: Install packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install -y -o Acquire::Retries=50 \
|
||||
mtools syslinux isolinux gcc-arm-none-eabi
|
||||
- name: Build
|
||||
run: |
|
||||
make -j 4 -C src CROSS=arm-none-eabi- \
|
||||
bin-arm32-efi/intel.efi \
|
||||
bin-arm32-efi/intel.usb \
|
||||
bin-arm32-efi/intel.iso
|
||||
|
||||
arm64:
|
||||
name: ARM64
|
||||
runs-on: ubuntu-22.04
|
||||
needs: cache
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Cache permissions
|
||||
run: |
|
||||
sudo chown $(id -un) /var/cache/apt/archives
|
||||
- name: Cache packages
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: /var/cache/apt/archives/*.deb
|
||||
key: apt-cache-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
- name: Install packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install -y -o Acquire::Retries=50 \
|
||||
mtools syslinux isolinux gcc-aarch64-linux-gnu
|
||||
- name: Build
|
||||
run: |
|
||||
make -j 4 -C src CROSS=aarch64-linux-gnu- \
|
||||
bin-arm64-efi/ipxe.efi \
|
||||
bin-arm64-efi/ipxe.usb \
|
||||
bin-arm64-efi/ipxe.iso
|
|
@ -1,37 +0,0 @@
|
|||
name: Coverity Scan
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- coverity_scan
|
||||
|
||||
jobs:
|
||||
submit:
|
||||
name: Submit
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v4
|
||||
- name: Download Coverity Scan
|
||||
run: |
|
||||
curl --form token=${{ secrets.COVERITY_SCAN_TOKEN }} \
|
||||
--form project=${{ github.repository }} \
|
||||
--output coverity.tar.gz \
|
||||
https://scan.coverity.com/download/cxx/linux64
|
||||
mkdir -p /opt/coverity
|
||||
sudo tar xvzf coverity.tar.gz --strip 1 --directory /opt/coverity
|
||||
- name: Build via Coverity Scan
|
||||
run: |
|
||||
make -C src bin/deps
|
||||
/opt/coverity/bin/cov-build --dir cov-int make -C src bin/blib.a
|
||||
- name: Create submission
|
||||
run : |
|
||||
tar cvzf cov-int.tar.gz cov-int
|
||||
- name: Submit to Coverity Scan
|
||||
run: |
|
||||
curl --form token=${{ secrets.COVERITY_SCAN_TOKEN }} \
|
||||
--form email=${{ secrets.COVERITY_SCAN_EMAIL }} \
|
||||
--form file=@cov-int.tar.gz \
|
||||
--form version=${{ github.sha }} \
|
||||
--form description=${{ github.ref }} \
|
||||
https://scan.coverity.com/builds?project=${{ github.repository }}
|
|
@ -0,0 +1,54 @@
|
|||
dist: trusty
|
||||
|
||||
sudo: false
|
||||
|
||||
language: c
|
||||
|
||||
cache: ccache
|
||||
|
||||
compiler:
|
||||
- gcc
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- binutils-dev
|
||||
- liblzma-dev
|
||||
- syslinux
|
||||
- genisoimage
|
||||
coverity_scan:
|
||||
project:
|
||||
name: "ipxe/ipxe"
|
||||
version: $TRAVIS_COMMIT
|
||||
build_command_prepend: "make -C src bin/deps"
|
||||
build_command: "make -C src bin/blib.a"
|
||||
branch_pattern: coverity_scan
|
||||
|
||||
env:
|
||||
global:
|
||||
- MAKEFLAGS="-j 4"
|
||||
|
||||
script:
|
||||
- make -C src bin/blib.a
|
||||
- make -C src bin/ipxe.pxe
|
||||
- make -C src bin/ipxe.usb
|
||||
- make -C src bin/ipxe.iso
|
||||
- make -C src bin/8086100e.mrom
|
||||
- make -C src bin-x86_64-pcbios/blib.a
|
||||
- make -C src bin-x86_64-pcbios/ipxe.pxe
|
||||
- make -C src bin-x86_64-pcbios/ipxe.usb
|
||||
- make -C src bin-x86_64-pcbios/ipxe.iso
|
||||
- make -C src bin-x86_64-pcbios/8086100e.mrom
|
||||
- make -C src bin-x86_64-efi/blib.a
|
||||
- make -C src bin-x86_64-efi/ipxe.efi
|
||||
- make -C src bin-x86_64-efi/intel.efidrv
|
||||
- make -C src bin-x86_64-efi/intel.efirom
|
||||
- make -C src bin-i386-efi/blib.a
|
||||
- make -C src bin-i386-efi/ipxe.efi
|
||||
- make -C src bin-i386-efi/intel.efidrv
|
||||
- make -C src bin-i386-efi/intel.efirom
|
||||
- make -C src bin-x86_64-linux/blib.a
|
||||
- make -C src bin-x86_64-linux/tap.linux
|
||||
- make -C src bin-x86_64-linux/af_packet.linux
|
||||
- make -C src bin-x86_64-linux/tests.linux
|
||||
- ./src/bin-x86_64-linux/tests.linux
|
|
@ -1,186 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
from base64 import b64encode
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from datetime import date
|
||||
from hashlib import sha256
|
||||
from itertools import count
|
||||
import subprocess
|
||||
|
||||
import boto3
|
||||
|
||||
BLOCKSIZE = 512 * 1024
|
||||
|
||||
|
||||
def detect_architecture(image):
|
||||
"""Detect CPU architecture"""
|
||||
mdir = subprocess.run(['mdir', '-b', '-i', image, '::/EFI/BOOT'],
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
if any(b'BOOTAA64.EFI' in x for x in mdir.stdout.splitlines()):
|
||||
return 'arm64'
|
||||
return 'x86_64'
|
||||
|
||||
|
||||
def create_snapshot(region, description, image, tags):
|
||||
"""Create an EBS snapshot"""
|
||||
client = boto3.client('ebs', region_name=region)
|
||||
snapshot = client.start_snapshot(VolumeSize=1,
|
||||
Description=description,
|
||||
Tags=tags)
|
||||
snapshot_id = snapshot['SnapshotId']
|
||||
with open(image, 'rb') as fh:
|
||||
for block in count():
|
||||
data = fh.read(BLOCKSIZE)
|
||||
if not data:
|
||||
break
|
||||
data = data.ljust(BLOCKSIZE, b'\0')
|
||||
checksum = b64encode(sha256(data).digest()).decode()
|
||||
client.put_snapshot_block(SnapshotId=snapshot_id,
|
||||
BlockIndex=block,
|
||||
BlockData=data,
|
||||
DataLength=BLOCKSIZE,
|
||||
Checksum=checksum,
|
||||
ChecksumAlgorithm='SHA256')
|
||||
client.complete_snapshot(SnapshotId=snapshot_id,
|
||||
ChangedBlocksCount=block)
|
||||
return snapshot_id
|
||||
|
||||
|
||||
def delete_images(region, filters, retain):
|
||||
client = boto3.client('ec2', region_name=region)
|
||||
resource = boto3.resource('ec2', region_name=region)
|
||||
images = client.describe_images(Owners=['self'], Filters=filters)
|
||||
old_images = sorted(images['Images'], key=lambda x: x['CreationDate'])
|
||||
if retain > 0:
|
||||
old_images = old_images[:-retain]
|
||||
for image in old_images:
|
||||
image_id = image['ImageId']
|
||||
snapshot_id = image['BlockDeviceMappings'][0]['Ebs']['SnapshotId']
|
||||
resource.Image(image_id).deregister()
|
||||
resource.Snapshot(snapshot_id).delete()
|
||||
|
||||
|
||||
def import_image(region, name, family, architecture, image, public, overwrite,
|
||||
retain):
|
||||
"""Import an AMI image"""
|
||||
client = boto3.client('ec2', region_name=region)
|
||||
resource = boto3.resource('ec2', region_name=region)
|
||||
description = '%s (%s)' % (name, architecture)
|
||||
tags = [
|
||||
{'Key': 'family', 'Value': family},
|
||||
{'Key': 'architecture', 'Value': architecture},
|
||||
]
|
||||
if overwrite:
|
||||
filters = [{'Name': 'name', 'Values': [description]}]
|
||||
delete_images(region=region, filters=filters, retain=0)
|
||||
if retain is not None:
|
||||
filters = [
|
||||
{'Name': 'tag:family', 'Values': [family]},
|
||||
{'Name': 'tag:architecture', 'Values': [architecture]},
|
||||
{'Name': 'is-public', 'Values': [str(public).lower()]},
|
||||
]
|
||||
delete_images(region=region, filters=filters, retain=retain)
|
||||
snapshot_id = create_snapshot(region=region, description=description,
|
||||
image=image, tags=tags)
|
||||
client.get_waiter('snapshot_completed').wait(SnapshotIds=[snapshot_id])
|
||||
image = client.register_image(Architecture=architecture,
|
||||
BlockDeviceMappings=[{
|
||||
'DeviceName': '/dev/sda1',
|
||||
'Ebs': {
|
||||
'SnapshotId': snapshot_id,
|
||||
'VolumeType': 'standard',
|
||||
},
|
||||
}],
|
||||
EnaSupport=True,
|
||||
Name=description,
|
||||
TagSpecifications=[{
|
||||
'ResourceType': 'image',
|
||||
'Tags': tags,
|
||||
}],
|
||||
RootDeviceName='/dev/sda1',
|
||||
SriovNetSupport='simple',
|
||||
VirtualizationType='hvm')
|
||||
image_id = image['ImageId']
|
||||
client.get_waiter('image_available').wait(ImageIds=[image_id])
|
||||
if public:
|
||||
resource.Image(image_id).modify_attribute(Attribute='launchPermission',
|
||||
OperationType='add',
|
||||
UserGroups=['all'])
|
||||
return image_id
|
||||
|
||||
|
||||
def launch_link(region, image_id):
|
||||
"""Construct a web console launch link"""
|
||||
return ("https://console.aws.amazon.com/ec2/v2/home?"
|
||||
"region=%s#LaunchInstanceWizard:ami=%s" % (region, image_id))
|
||||
|
||||
|
||||
# Parse command-line arguments
|
||||
parser = argparse.ArgumentParser(description="Import AWS EC2 image (AMI)")
|
||||
parser.add_argument('--name', '-n',
|
||||
help="Image name")
|
||||
parser.add_argument('--family', '-f',
|
||||
help="Image family name")
|
||||
parser.add_argument('--public', '-p', action='store_true',
|
||||
help="Make image public")
|
||||
parser.add_argument('--overwrite', action='store_true',
|
||||
help="Overwrite any existing image with same name")
|
||||
parser.add_argument('--retain', type=int, metavar='NUM',
|
||||
help="Retain at most <NUM> old images")
|
||||
parser.add_argument('--region', '-r', action='append',
|
||||
help="AWS region(s)")
|
||||
parser.add_argument('--wiki', '-w', metavar='FILE',
|
||||
help="Generate Dokuwiki table")
|
||||
parser.add_argument('image', nargs='+', help="iPXE disk image")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Detect CPU architectures
|
||||
architectures = {image: detect_architecture(image) for image in args.image}
|
||||
|
||||
# Use default family name if none specified
|
||||
if not args.family:
|
||||
args.family = 'iPXE'
|
||||
|
||||
# Use default name if none specified
|
||||
if not args.name:
|
||||
args.name = '%s (%s)' % (args.family, date.today().strftime('%Y-%m-%d'))
|
||||
|
||||
# Use all regions if none specified
|
||||
if not args.region:
|
||||
args.region = sorted(x['RegionName'] for x in
|
||||
boto3.client('ec2').describe_regions()['Regions'])
|
||||
|
||||
# Use one thread per import to maximise parallelism
|
||||
imports = [(region, image) for region in args.region for image in args.image]
|
||||
with ThreadPoolExecutor(max_workers=len(imports)) as executor:
|
||||
futures = {executor.submit(import_image,
|
||||
region=region,
|
||||
name=args.name,
|
||||
family=args.family,
|
||||
architecture=architectures[image],
|
||||
image=image,
|
||||
public=args.public,
|
||||
overwrite=args.overwrite,
|
||||
retain=args.retain): (region, image)
|
||||
for region, image in imports}
|
||||
results = {futures[future]: future.result()
|
||||
for future in as_completed(futures)}
|
||||
|
||||
# Construct Dokuwiki table
|
||||
wikitab = ["^ AWS region ^ CPU architecture ^ AMI ID ^\n"] + list(
|
||||
"| ''%s'' | ''%s'' | ''[[%s|%s]]'' |\n" % (
|
||||
region,
|
||||
architectures[image],
|
||||
launch_link(region, results[(region, image)]),
|
||||
results[(region, image)],
|
||||
) for region, image in imports)
|
||||
if args.wiki:
|
||||
with open(args.wiki, 'wt') as fh:
|
||||
fh.writelines(wikitab)
|
||||
|
||||
# Show created images
|
||||
for region, image in imports:
|
||||
print("%s %s %s %s" % (
|
||||
region, image, architectures[image], results[(region, image)]
|
||||
))
|
|
@ -1,68 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
|
||||
import boto3
|
||||
|
||||
BLOCKSIZE = 512 * 1024
|
||||
|
||||
IPXELOG_OFFSET = 16 * 1024
|
||||
|
||||
IPXELOG_MAGIC = b'iPXE LOG'
|
||||
|
||||
|
||||
def create_snapshot(region, instance_id):
|
||||
"""Create root volume snapshot"""
|
||||
client = boto3.client('ec2', region_name=region)
|
||||
resource = boto3.resource('ec2', region_name=region)
|
||||
instance = resource.Instance(instance_id)
|
||||
volumes = list(instance.volumes.all())
|
||||
snapshot = volumes[0].create_snapshot()
|
||||
snapshot.wait_until_completed()
|
||||
return snapshot.id
|
||||
|
||||
|
||||
def get_snapshot_block(region, snapshot_id, index):
|
||||
"""Get block content from snapshot"""
|
||||
client = boto3.client('ebs', region_name=region)
|
||||
blocks = client.list_snapshot_blocks(SnapshotId=snapshot_id,
|
||||
StartingBlockIndex=index)
|
||||
token = blocks['Blocks'][0]['BlockToken']
|
||||
block = client.get_snapshot_block(SnapshotId=snapshot_id,
|
||||
BlockIndex=index,
|
||||
BlockToken=token)
|
||||
return block['BlockData'].read()
|
||||
|
||||
|
||||
def get_block0_content(region, instance_id):
|
||||
"""Get content of root volume block zero from instance"""
|
||||
client = boto3.client('ec2', region_name=region)
|
||||
resource = boto3.resource('ec2', region_name=region)
|
||||
snapshot_id = create_snapshot(region, instance_id)
|
||||
block = get_snapshot_block(region, snapshot_id, 0)
|
||||
resource.Snapshot(snapshot_id).delete()
|
||||
return block
|
||||
|
||||
|
||||
def get_int13con_output(region, instance_id):
|
||||
"""Get INT13 console output"""
|
||||
block = get_block0_content(region, instance_id)
|
||||
logpart = block[IPXELOG_OFFSET:]
|
||||
magic = logpart[:len(IPXELOG_MAGIC)]
|
||||
if magic != IPXELOG_MAGIC:
|
||||
raise ValueError("Invalid log magic signature")
|
||||
log = logpart[len(IPXELOG_MAGIC):].split(b'\0')[0]
|
||||
return log.decode()
|
||||
|
||||
|
||||
# Parse command-line arguments
|
||||
parser = argparse.ArgumentParser(description="Get AWS INT13 console output")
|
||||
parser.add_argument('--region', '-r', help="AWS region")
|
||||
parser.add_argument('id', help="Instance ID")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Get console output from INT13CON partition
|
||||
output = get_int13con_output(args.region, args.id)
|
||||
|
||||
# Print console output
|
||||
print(output)
|
|
@ -1,167 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from datetime import date
|
||||
import io
|
||||
import subprocess
|
||||
import tarfile
|
||||
from uuid import uuid4
|
||||
|
||||
from google.cloud import compute
|
||||
from google.cloud import exceptions
|
||||
from google.cloud import storage
|
||||
|
||||
IPXE_STORAGE_PREFIX = 'ipxe-upload-temp-'
|
||||
|
||||
FEATURE_GVNIC = compute.GuestOsFeature(type_="GVNIC")
|
||||
FEATURE_IDPF = compute.GuestOsFeature(type_="IDPF")
|
||||
FEATURE_UEFI = compute.GuestOsFeature(type_="UEFI_COMPATIBLE")
|
||||
|
||||
POLICY_PUBLIC = compute.Policy(bindings=[{
|
||||
"role": "roles/compute.imageUser",
|
||||
"members": ["allAuthenticatedUsers"],
|
||||
}])
|
||||
|
||||
def delete_temp_bucket(bucket):
|
||||
"""Remove temporary bucket"""
|
||||
assert bucket.name.startswith(IPXE_STORAGE_PREFIX)
|
||||
for blob in bucket.list_blobs(prefix=IPXE_STORAGE_PREFIX):
|
||||
assert blob.name.startswith(IPXE_STORAGE_PREFIX)
|
||||
blob.delete()
|
||||
if not list(bucket.list_blobs()):
|
||||
bucket.delete()
|
||||
|
||||
def create_temp_bucket(location):
|
||||
"""Create temporary bucket (and remove any stale temporary buckets)"""
|
||||
client = storage.Client()
|
||||
for bucket in client.list_buckets(prefix=IPXE_STORAGE_PREFIX):
|
||||
delete_temp_bucket(bucket)
|
||||
name = '%s%s' % (IPXE_STORAGE_PREFIX, uuid4())
|
||||
return client.create_bucket(name, location=location)
|
||||
|
||||
def create_tarball(image):
|
||||
"""Create raw disk image tarball"""
|
||||
tarball = io.BytesIO()
|
||||
with tarfile.open(fileobj=tarball, mode='w:gz',
|
||||
format=tarfile.GNU_FORMAT) as tar:
|
||||
tar.add(image, arcname='disk.raw')
|
||||
tarball.seek(0)
|
||||
return tarball
|
||||
|
||||
def upload_blob(bucket, image):
|
||||
"""Upload raw disk image blob"""
|
||||
blob = bucket.blob('%s%s.tar.gz' % (IPXE_STORAGE_PREFIX, uuid4()))
|
||||
tarball = create_tarball(image)
|
||||
blob.upload_from_file(tarball)
|
||||
return blob
|
||||
|
||||
def detect_uefi(image):
|
||||
"""Identify UEFI CPU architecture(s)"""
|
||||
mdir = subprocess.run(['mdir', '-b', '-i', image, '::/EFI/BOOT'],
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
||||
check=False)
|
||||
mapping = {
|
||||
b'BOOTX64.EFI': 'x86_64',
|
||||
b'BOOTAA64.EFI': 'arm64',
|
||||
}
|
||||
uefi = [
|
||||
arch
|
||||
for filename, arch in mapping.items()
|
||||
if filename in mdir.stdout
|
||||
]
|
||||
return uefi
|
||||
|
||||
def image_architecture(uefi):
|
||||
"""Get image architecture"""
|
||||
return uefi[0] if len(uefi) == 1 else None if uefi else 'x86_64'
|
||||
|
||||
def image_features(uefi):
|
||||
"""Get image feature list"""
|
||||
features = [FEATURE_GVNIC, FEATURE_IDPF]
|
||||
if uefi:
|
||||
features.append(FEATURE_UEFI)
|
||||
return features
|
||||
|
||||
def image_name(base, uefi):
|
||||
"""Calculate image name or family name"""
|
||||
suffix = ('-uefi-%s' % uefi[0].replace('_', '-') if len(uefi) == 1 else
|
||||
'-uefi-multi' if uefi else '')
|
||||
return '%s%s' % (base, suffix)
|
||||
|
||||
def create_image(project, basename, basefamily, overwrite, public, bucket,
|
||||
image):
|
||||
"""Create image"""
|
||||
client = compute.ImagesClient()
|
||||
uefi = detect_uefi(image)
|
||||
architecture = image_architecture(uefi)
|
||||
features = image_features(uefi)
|
||||
name = image_name(basename, uefi)
|
||||
family = image_name(basefamily, uefi)
|
||||
if overwrite:
|
||||
try:
|
||||
client.delete(project=project, image=name).result()
|
||||
except exceptions.NotFound:
|
||||
pass
|
||||
blob = upload_blob(bucket, image)
|
||||
disk = compute.RawDisk(source=blob.public_url)
|
||||
image = compute.Image(name=name, family=family, architecture=architecture,
|
||||
guest_os_features=features, raw_disk=disk)
|
||||
client.insert(project=project, image_resource=image).result()
|
||||
if public:
|
||||
request = compute.GlobalSetPolicyRequest(policy=POLICY_PUBLIC)
|
||||
client.set_iam_policy(project=project, resource=name,
|
||||
global_set_policy_request_resource=request)
|
||||
image = client.get(project=project, image=name)
|
||||
return image
|
||||
|
||||
# Parse command-line arguments
|
||||
#
|
||||
parser = argparse.ArgumentParser(description="Import Google Cloud image")
|
||||
parser.add_argument('--name', '-n',
|
||||
help="Base image name")
|
||||
parser.add_argument('--family', '-f',
|
||||
help="Base family name")
|
||||
parser.add_argument('--public', '-p', action='store_true',
|
||||
help="Make image public")
|
||||
parser.add_argument('--overwrite', action='store_true',
|
||||
help="Overwrite any existing image with same name")
|
||||
parser.add_argument('--project', '-j', default="ipxe-images",
|
||||
help="Google Cloud project")
|
||||
parser.add_argument('--location', '-l',
|
||||
help="Google Cloud Storage initial location")
|
||||
parser.add_argument('image', nargs='+', help="iPXE disk image")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Use default family name if none specified
|
||||
if not args.family:
|
||||
args.family = 'ipxe'
|
||||
|
||||
# Use default name if none specified
|
||||
if not args.name:
|
||||
args.name = '%s-%s' % (args.family, date.today().strftime('%Y%m%d'))
|
||||
|
||||
# Create temporary upload bucket
|
||||
bucket = create_temp_bucket(args.location)
|
||||
|
||||
# Use one thread per image to maximise parallelism
|
||||
with ThreadPoolExecutor(max_workers=len(args.image)) as executor:
|
||||
futures = {executor.submit(create_image,
|
||||
project=args.project,
|
||||
basename=args.name,
|
||||
basefamily=args.family,
|
||||
overwrite=args.overwrite,
|
||||
public=args.public,
|
||||
bucket=bucket,
|
||||
image=image): image
|
||||
for image in args.image}
|
||||
results = {futures[future]: future.result()
|
||||
for future in as_completed(futures)}
|
||||
|
||||
# Delete temporary upload bucket
|
||||
delete_temp_bucket(bucket)
|
||||
|
||||
# Show created images
|
||||
for image in args.image:
|
||||
result = results[image]
|
||||
print("%s (%s) %s" % (result.name, result.family, result.status))
|
|
@ -1,146 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import textwrap
|
||||
import time
|
||||
from uuid import uuid4
|
||||
|
||||
from google.cloud import compute
|
||||
|
||||
IPXE_LOG_PREFIX = 'ipxe-log-temp-'
|
||||
IPXE_LOG_MAGIC = 'iPXE LOG'
|
||||
IPXE_LOG_END = '----- END OF iPXE LOG -----'
|
||||
|
||||
def get_log_disk(instances, project, zone, name):
|
||||
"""Get log disk source URL"""
|
||||
instance = instances.get(project=project, zone=zone, instance=name)
|
||||
disk = next(x for x in instance.disks if x.boot)
|
||||
return disk.source
|
||||
|
||||
def delete_temp_snapshot(snapshots, project, name):
|
||||
"""Delete temporary snapshot"""
|
||||
assert name.startswith(IPXE_LOG_PREFIX)
|
||||
snapshots.delete(project=project, snapshot=name)
|
||||
|
||||
def delete_temp_snapshots(snapshots, project):
|
||||
"""Delete all old temporary snapshots"""
|
||||
filter = "name eq %s.+" % IPXE_LOG_PREFIX
|
||||
request = compute.ListSnapshotsRequest(project=project, filter=filter)
|
||||
for snapshot in snapshots.list(request=request):
|
||||
delete_temp_snapshot(snapshots, project, snapshot.name)
|
||||
|
||||
def create_temp_snapshot(snapshots, project, source):
|
||||
"""Create temporary snapshot"""
|
||||
name = '%s%s' % (IPXE_LOG_PREFIX, uuid4())
|
||||
snapshot = compute.Snapshot(name=name, source_disk=source)
|
||||
snapshots.insert(project=project, snapshot_resource=snapshot).result()
|
||||
return name
|
||||
|
||||
def delete_temp_instance(instances, project, zone, name):
|
||||
"""Delete log dumper temporary instance"""
|
||||
assert name.startswith(IPXE_LOG_PREFIX)
|
||||
instances.delete(project=project, zone=zone, instance=name)
|
||||
|
||||
def delete_temp_instances(instances, project, zone):
|
||||
"""Delete all old log dumper temporary instances"""
|
||||
filter = "name eq %s.+" % IPXE_LOG_PREFIX
|
||||
request = compute.ListInstancesRequest(project=project, zone=zone,
|
||||
filter=filter)
|
||||
for instance in instances.list(request=request):
|
||||
delete_temp_instance(instances, project, zone, instance.name)
|
||||
|
||||
def create_temp_instance(instances, project, zone, family, image, machine,
|
||||
snapshot):
|
||||
"""Create log dumper temporary instance"""
|
||||
image = "projects/%s/global/images/family/%s" % (family, image)
|
||||
machine_type = "zones/%s/machineTypes/%s" % (zone, machine)
|
||||
logsource = "global/snapshots/%s" % snapshot
|
||||
bootparams = compute.AttachedDiskInitializeParams(source_image=image)
|
||||
bootdisk = compute.AttachedDisk(boot=True, auto_delete=True,
|
||||
initialize_params=bootparams)
|
||||
logparams = compute.AttachedDiskInitializeParams(source_snapshot=logsource)
|
||||
logdisk = compute.AttachedDisk(boot=False, auto_delete=True,
|
||||
initialize_params=logparams,
|
||||
device_name="ipxelog")
|
||||
nic = compute.NetworkInterface()
|
||||
name = '%s%s' % (IPXE_LOG_PREFIX, uuid4())
|
||||
script = textwrap.dedent(f"""
|
||||
#!/bin/sh
|
||||
tr -d '\\000' < /dev/disk/by-id/google-ipxelog-part3 > /dev/ttyS3
|
||||
echo "{IPXE_LOG_END}" > /dev/ttyS3
|
||||
""").strip()
|
||||
items = compute.Items(key="startup-script", value=script)
|
||||
metadata = compute.Metadata(items=[items])
|
||||
instance = compute.Instance(name=name, machine_type=machine_type,
|
||||
network_interfaces=[nic], metadata=metadata,
|
||||
disks=[bootdisk, logdisk])
|
||||
instances.insert(project=project, zone=zone,
|
||||
instance_resource=instance).result()
|
||||
return name
|
||||
|
||||
def get_log_output(instances, project, zone, name):
|
||||
"""Get iPXE log output"""
|
||||
request = compute.GetSerialPortOutputInstanceRequest(project=project,
|
||||
zone=zone, port=4,
|
||||
instance=name)
|
||||
while True:
|
||||
log = instances.get_serial_port_output(request=request).contents.strip()
|
||||
if log.endswith(IPXE_LOG_END):
|
||||
if log.startswith(IPXE_LOG_MAGIC):
|
||||
return log[len(IPXE_LOG_MAGIC):-len(IPXE_LOG_END)]
|
||||
else:
|
||||
return log[:-len(IPXE_LOG_END)]
|
||||
time.sleep(1)
|
||||
|
||||
# Parse command-line arguments
|
||||
#
|
||||
parser = argparse.ArgumentParser(description="Import Google Cloud image")
|
||||
parser.add_argument('--project', '-j', default="ipxe-images",
|
||||
help="Google Cloud project")
|
||||
parser.add_argument('--zone', '-z', required=True,
|
||||
help="Google Cloud zone")
|
||||
parser.add_argument('--family', '-f', default="debian-cloud",
|
||||
help="Helper OS image family")
|
||||
parser.add_argument('--image', '-i', default="debian-12",
|
||||
help="Helper OS image")
|
||||
parser.add_argument('--machine', '-m', default="e2-micro",
|
||||
help="Helper machine type")
|
||||
parser.add_argument('instance', help="Instance name")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Construct client objects
|
||||
#
|
||||
instances = compute.InstancesClient()
|
||||
snapshots = compute.SnapshotsClient()
|
||||
|
||||
# Clean up old temporary objects
|
||||
#
|
||||
delete_temp_instances(instances, project=args.project, zone=args.zone)
|
||||
delete_temp_snapshots(snapshots, project=args.project)
|
||||
|
||||
# Create log disk snapshot
|
||||
#
|
||||
logdisk = get_log_disk(instances, project=args.project, zone=args.zone,
|
||||
name=args.instance)
|
||||
logsnap = create_temp_snapshot(snapshots, project=args.project, source=logdisk)
|
||||
|
||||
# Create log dumper instance
|
||||
#
|
||||
dumper = create_temp_instance(instances, project=args.project, zone=args.zone,
|
||||
family=args.family, image=args.image,
|
||||
machine=args.machine, snapshot=logsnap)
|
||||
|
||||
# Wait for log output
|
||||
#
|
||||
output = get_log_output(instances, project=args.project, zone=args.zone,
|
||||
name=dumper)
|
||||
|
||||
# Print log output
|
||||
#
|
||||
print(output)
|
||||
|
||||
# Clean up
|
||||
#
|
||||
delete_temp_instance(instances, project=args.project, zone=args.zone,
|
||||
name=dumper)
|
||||
delete_temp_snapshot(snapshots, project=args.project, name=logsnap)
|
|
@ -1,79 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
"""Detach CMS encrypted data.
|
||||
|
||||
Detach encrypted data from a CMS envelopedData or authEnvelopedData
|
||||
message into a separate file.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
|
||||
import asn1
|
||||
|
||||
# Parse command-line arguments
|
||||
#
|
||||
parser = argparse.ArgumentParser(
|
||||
description=__doc__,
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
)
|
||||
parser.add_argument("-d", "--data", metavar="FILE",
|
||||
help="Write detached data (without envelope) to FILE")
|
||||
parser.add_argument("-e", "--envelope", metavar="FILE",
|
||||
help="Write envelope (without data) to FILE")
|
||||
parser.add_argument("-o", "--overwrite", action="store_true",
|
||||
help="Overwrite output files")
|
||||
parser.add_argument("file", help="Input envelope file")
|
||||
args = parser.parse_args()
|
||||
if args.data is None and args.envelope is None:
|
||||
parser.error("at least one of --data and --envelope is required")
|
||||
outmode = "wb" if args.overwrite else "xb"
|
||||
|
||||
# Create decoder
|
||||
#
|
||||
decoder = asn1.Decoder()
|
||||
with open(args.file, mode="rb") as fh:
|
||||
decoder.start(fh.read())
|
||||
|
||||
# Create encoder
|
||||
#
|
||||
encoder = asn1.Encoder()
|
||||
encoder.start()
|
||||
|
||||
# Detach encrypted data
|
||||
#
|
||||
data = None
|
||||
datastack = [
|
||||
asn1.Numbers.Sequence, 0, asn1.Numbers.Sequence, asn1.Numbers.Sequence
|
||||
]
|
||||
stack = []
|
||||
while stack or not decoder.eof():
|
||||
tag = decoder.peek()
|
||||
if tag is None:
|
||||
encoder.leave()
|
||||
decoder.leave()
|
||||
stack.pop()
|
||||
elif tag.typ == asn1.Types.Constructed:
|
||||
encoder.enter(nr=tag.nr, cls=tag.cls)
|
||||
decoder.enter()
|
||||
stack.append(tag.nr)
|
||||
else:
|
||||
(tag, value) = decoder.read()
|
||||
if stack == datastack and tag.nr == 0:
|
||||
data = value
|
||||
else:
|
||||
encoder.write(value, nr=tag.nr, cls=tag.cls)
|
||||
envelope = encoder.output()
|
||||
if data is None:
|
||||
parser.error("Input file does not contain any encrypted data")
|
||||
|
||||
# Write envelope (without data), if applicable
|
||||
#
|
||||
if args.envelope:
|
||||
with open(args.envelope, mode=outmode) as fh:
|
||||
fh.write(envelope)
|
||||
|
||||
# Write data (without envelope), if applicable
|
||||
#
|
||||
if args.data:
|
||||
with open(args.data, mode=outmode) as fh:
|
||||
fh.write(data)
|
|
@ -0,0 +1,62 @@
|
|||
ROM-o-matic web interface for building iPXE ROMs
|
||||
------------------------------------------------
|
||||
|
||||
This web application generates iPXE images and sends them to a web
|
||||
browser.
|
||||
|
||||
Available as part of the iPXE source code distribution, which can be
|
||||
downlaoded from http://etherboot.org/
|
||||
|
||||
Author: Marty Connor <mdc@etherboot.org>
|
||||
License: GPLv2
|
||||
Support: http://etherboot.org/mailman/listinfo/ipxe
|
||||
Please send support questions to the iPXE mailing list
|
||||
|
||||
System Requirements
|
||||
-------------------
|
||||
- Apache web server
|
||||
- PHP 4+
|
||||
- Tools required to build iPXE installed on the server
|
||||
- gcc, mtools, syslinux, perl, etc.
|
||||
|
||||
Setup
|
||||
-----
|
||||
As distributed, it is expected that the rom-o-matic source code
|
||||
directory is in the contrib directory of a iPXE source distribution.
|
||||
|
||||
The easiest way to do this is to simply put a iPXE source distribution
|
||||
in a web server accessible directory.
|
||||
|
||||
If this is not the case, you will need to either edit the file
|
||||
|
||||
"globals.php"
|
||||
|
||||
or create a file called
|
||||
|
||||
"local-config.php"
|
||||
|
||||
containing the following lines:
|
||||
|
||||
<?php
|
||||
$src_dir = "../../src";
|
||||
?>
|
||||
|
||||
Then change the line beginning "$src_dir = " to the path of your iPXE
|
||||
source code tree.
|
||||
|
||||
To make build times shorter, before you run rom-o-matic for the first time
|
||||
you should cd to the ipxe "src" directory and enter the following
|
||||
commands:
|
||||
|
||||
$ make
|
||||
$ make bin/NIC
|
||||
|
||||
This will pro-compile most object files and will make your rom-o-matic
|
||||
builds much faster.
|
||||
|
||||
Running rom-o-matic from a web browser
|
||||
--------------------------------------
|
||||
Enter a URL like:
|
||||
|
||||
http://example.com/ipxe-1.x.x/contrib/rom-o-matic
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
|
||||
* Copyright (C) 2009 Entity Cyber, Inc.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
?>
|
||||
<hr>
|
||||
<h4>
|
||||
Resources:
|
||||
</h4>
|
||||
<ul>
|
||||
<li>
|
||||
Source code for iPXE images is available at
|
||||
<a href="http://www.ipxe.org/download" target="_blank">
|
||||
http://www.ipxe.org/download</a>
|
||||
<br><br>
|
||||
</li>
|
||||
<li>
|
||||
For general information about using iPXE, please visit the
|
||||
<a href="http://www.ipxe.org/" target="_blank">
|
||||
iPXE Project Home Page</a>
|
||||
<br><br>
|
||||
</li>
|
||||
<li>
|
||||
For Email-based support for iPXE please join
|
||||
<a href="http://www.ipxe.org/contact" target="_blank">
|
||||
iPXE Project mailing lists.</a>
|
||||
<br><br>
|
||||
</li>
|
||||
<li>
|
||||
For real-time online iPXE support via IRC please visit the
|
||||
<a href="irc://irc.freenode.net/%23ipxe"> #ipxe channel
|
||||
of irc.freenode.net</a>.
|
||||
<br><br>
|
||||
</li>
|
||||
</ul>
|
||||
<hr>
|
||||
<font size="-1">
|
||||
<br>
|
||||
Please email <a href="mailto:<?php echo "${webmaster_email}" ?>"><?php echo "${webmaster_email}"?></a>
|
||||
with questions or comments about this website.
|
||||
</font>
|
||||
<br><br>
|
||||
<hr>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,311 @@
|
|||
<?php // -*- Mode: PHP; -*-
|
||||
|
||||
/**
|
||||
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
|
||||
* Copyright (C) 2009 Entity Cyber, Inc.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
// Get utility functions and set globals
|
||||
require_once "utils.php";
|
||||
|
||||
// Make sure at least $A (action) was supplied
|
||||
if ( ! isset ( $_POST['A'] ) ) {
|
||||
|
||||
// Present user with form to customize build options
|
||||
require_once "customize-flags.php";
|
||||
|
||||
exit ();
|
||||
|
||||
// If user chose "Customize" option on form
|
||||
} else if ( $_POST['A'] == "Customize" ) {
|
||||
|
||||
// Present user with form to customize build options
|
||||
require_once "customize-flags.php";
|
||||
|
||||
exit ();
|
||||
|
||||
// The following conditional includes all other cases except "Get Image"
|
||||
// particularly the explicit ($A == "Start Over") case
|
||||
} else if ( $_POST['A'] != "Get Image" ) {
|
||||
|
||||
// Note that this method of redirections discards all the
|
||||
// configuration flags, which is intentional in this case.
|
||||
|
||||
$dest = curDirURL ();
|
||||
header ( "Location: $dest" );
|
||||
|
||||
// This next "echo" should normally not be seen, because
|
||||
// the "header" statement above should cause immediate
|
||||
// redirection but just in case...
|
||||
|
||||
echo "Try this link: <a href=\"$dest\">$dest</a>";
|
||||
|
||||
exit ();
|
||||
}
|
||||
|
||||
// OK, we're going to try to use whatever options have been set
|
||||
// to build an image.
|
||||
|
||||
// Make sure at least $nic was supplied
|
||||
if ( ! isset ( $_POST['nic'] ) ) {
|
||||
die ( "No NIC supplied!" );
|
||||
}
|
||||
if ( isset ( $nics[$_POST['nic']] ) ) {
|
||||
$nic = $nics[$_POST['nic']];
|
||||
} else {
|
||||
die ( "Invalid NIC \"${_POST['nic']}\" supplied!" );
|
||||
}
|
||||
|
||||
// Fetch flags
|
||||
$flags = get_flags ();
|
||||
|
||||
// Get requested format
|
||||
$ofmt = isset ( $_POST['ofmt'] ) ? $_POST['ofmt'] : "";
|
||||
$fmt_extension = isset ( $ofmts[$ofmt] ) ? $ofmts[$ofmt] : 'dsk';
|
||||
|
||||
// Handle some special cases
|
||||
|
||||
$pci_vendor_code = "";
|
||||
$pci_device_code = "";
|
||||
|
||||
if ( $nic == 'undionly' && $fmt_extension == "pxe" ) {
|
||||
|
||||
// undionly.pxe can't work because it unloads the PXE stack
|
||||
// that it needs to communicate with, so we set the extension
|
||||
// to .kpxe, which has a chance of working. The extension
|
||||
// .kkpxe is another option.
|
||||
|
||||
$fmt_extension = "kpxe";
|
||||
|
||||
} else if ( $fmt_extension == "rom" ) {
|
||||
|
||||
if ( ! isset ( $_POST['pci_vendor_code'] )
|
||||
|| ! isset ( $_POST['pci_device_code'] ) ) {
|
||||
die ( "rom output format selected but PCI code(s) missing!" );
|
||||
}
|
||||
|
||||
$pci_vendor_code = $_POST['pci_vendor_code'];
|
||||
$pci_device_code = $_POST['pci_device_code'];
|
||||
|
||||
if ( $pci_vendor_code == ""
|
||||
|| $pci_device_code == "" ) {
|
||||
die ( "rom output format selected but PCI code(s) missing!" );
|
||||
}
|
||||
|
||||
// Try to be forgiving of 0xAAAA format
|
||||
if ( strtolower ( substr ( $pci_vendor_code, 0, 2 ) ) == "0x"
|
||||
&& strlen ( $pci_vendor_code ) == 6 ) {
|
||||
$pci_vendor_code = substr ( $pci_vendor_code, 2, 4 );
|
||||
}
|
||||
if ( strtolower ( substr ( $pci_device_code, 0, 2 ) ) == "0x"
|
||||
&& strlen ( $pci_device_code ) == 6 ) {
|
||||
$pci_device_code = substr ( $pci_device_code, 2, 4 );
|
||||
}
|
||||
|
||||
// concatenate the pci codes to get the $nic part of the
|
||||
// Make target
|
||||
$pci_codes = strtolower ( $pci_vendor_code . $pci_device_code );
|
||||
|
||||
$nic = $pci_codes;
|
||||
if ( ! isset ( $roms[$pci_codes] ) ) {
|
||||
die ( "Sorry, no network driver supports PCI codes<br>"
|
||||
. "${_POST['pci_vendor_code']}:"
|
||||
. "${_POST['pci_device_code']}" );
|
||||
}
|
||||
} else if ( $fmt_extension != "rom"
|
||||
&& ( $pci_vendor_code != "" || $pci_device_code != "" ) ) {
|
||||
die ( "'$fmt_extension' format was selected but PCI IDs were"
|
||||
. " also entered.<br>Did you mean to select 'rom' output format"
|
||||
. " instead?" );
|
||||
}
|
||||
|
||||
/**
|
||||
* remove temporary build directory
|
||||
*
|
||||
* @return bool true if removal is successful, false otherwise
|
||||
*/
|
||||
function rm_build_dir ()
|
||||
{
|
||||
global $build_dir;
|
||||
global $keep_build_dir;
|
||||
|
||||
if ( $keep_build_dir !== true ) {
|
||||
rm_file_or_dir ( $build_dir );
|
||||
}
|
||||
}
|
||||
|
||||
// Arrange for the build directory to always be removed on exit.
|
||||
$build_dir = "";
|
||||
$keep_build_dir = false;
|
||||
register_shutdown_function ( 'rm_build_dir' );
|
||||
|
||||
// Make temporary copy of src directory
|
||||
$build_dir = mktempcopy ( "$src_dir", "/tmp", "MDCROM" );
|
||||
$config_dir = $build_dir . "/config";
|
||||
|
||||
// Write config files with supplied flags
|
||||
write_ipxe_config_files ( $config_dir, $flags );
|
||||
|
||||
// Handle a possible embedded script
|
||||
$emb_script_cmd = "";
|
||||
$embedded_script = isset ( $_POST['embedded_script'] ) ? $_POST['embedded_script'] : "";
|
||||
if ( $embedded_script != "" ) {
|
||||
$emb_script_path = "$build_dir" . "/script0.ipxe";
|
||||
|
||||
if ( substr ( $embedded_script, 0, 5 ) != "#!ipxe" ) {
|
||||
$embedded_script = "#!ipxe\n" . $embedded_script;
|
||||
}
|
||||
|
||||
// iPXE 0.9.7 doesn't like '\r\n" in the shebang...
|
||||
$embedded_script = str_replace ( "\r\n", "\n", $embedded_script );
|
||||
|
||||
write_file_from_string ( $emb_script_path, $embedded_script );
|
||||
$emb_script_cmd = "EMBEDDED_IMAGE=${emb_script_path}";
|
||||
}
|
||||
|
||||
// Make the requested image. $status is set to 0 on success
|
||||
$make_target = "bin/${nic}.${fmt_extension}";
|
||||
$gitversion = exec('git describe --always --abbrev=1 --match "" 2>/dev/null');
|
||||
if ($gitversion) {
|
||||
$gitversion = "GITVERSION=$gitversion";
|
||||
}
|
||||
|
||||
$make_cmd = "make -C '$build_dir' '$make_target' $gitversion $emb_script_cmd 2>&1";
|
||||
|
||||
exec ( $make_cmd, $maketxt, $status );
|
||||
|
||||
// Uncomment the following section for debugging
|
||||
|
||||
/**
|
||||
|
||||
echo "<h2>build.php:</h2>";
|
||||
echo "<h3>Begin debugging output</h3>";
|
||||
|
||||
//echo "<h3>\$_POST variables</h3>";
|
||||
//echo "<pre>"; var_dump ( $_POST ); echo "</pre>";
|
||||
|
||||
echo "<h3>Build options:</h3>";
|
||||
echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
|
||||
echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
|
||||
echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" . "<br>";
|
||||
echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
|
||||
echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
|
||||
|
||||
echo "<h3>Flags:</h3>";
|
||||
show_flags ( $flags );
|
||||
|
||||
if ( $embedded_script != "" ) {
|
||||
echo "<h3>Embedded script:</h3>";
|
||||
echo "<blockquote>"."<pre>";
|
||||
echo $embedded_script;
|
||||
echo "</pre>"."</blockquote>";
|
||||
}
|
||||
|
||||
echo "<h3>Make output:</h3>";
|
||||
echo "Make command: " . $make_cmd . "<br>";
|
||||
echo "Build status = <? echo $status ?>" . "<br>";
|
||||
echo "<blockquote>"."<pre>";
|
||||
echo htmlentities ( implode ("\n", $maketxt ) );
|
||||
echo "</pre>"."</blockquote>";
|
||||
// Uncomment the next line if you want to keep the
|
||||
// build directory around for inspection after building.
|
||||
$keep_build_dir = true;
|
||||
die ( "<h3>End debugging output</h3>" );
|
||||
|
||||
**/ // End debugging section
|
||||
|
||||
// Send ROM to browser (with extreme prejudice)
|
||||
|
||||
if ( $status == 0 ) {
|
||||
|
||||
$fp = fopen("${build_dir}/${make_target}", "rb" );
|
||||
if ( $fp > 0 ) {
|
||||
|
||||
$len = filesize ( "${build_dir}/${make_target}" );
|
||||
if ( $len > 0 ) {
|
||||
|
||||
$buf = fread ( $fp, $len );
|
||||
fclose ( $fp );
|
||||
|
||||
// Delete build directory as soon as it is not needed
|
||||
rm_build_dir ();
|
||||
|
||||
$output_filename = preg_replace('/[^a-z0-9\+\.\-]/i', '', "ipxe-${version}-${nic}.${fmt_extension}");
|
||||
|
||||
// Try to force IE to handle downloading right.
|
||||
Header ( "Cache-control: private");
|
||||
Header ( "Content-Type: application/x-octet-stream; " .
|
||||
"name=$output_filename");
|
||||
Header ( "Content-Disposition: attachment; " .
|
||||
"Filename=$output_filename");
|
||||
Header ( "Content-Location: $output_filename");
|
||||
Header ( "Content-Length: $len");
|
||||
|
||||
echo $buf;
|
||||
|
||||
exit ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we reach this point, the build has failed, and we provide
|
||||
* debugging information for a potential bug report
|
||||
*
|
||||
*/
|
||||
|
||||
// Remove build directory
|
||||
rm_build_dir ();
|
||||
|
||||
// Announce failure if $status from make was non-zero
|
||||
echo "<h2>Build failed. Status = " . $status . "</h2>";
|
||||
echo "<h2>build.php:</h2>";
|
||||
echo "<h3>Build options:</h3>";
|
||||
echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
|
||||
echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
|
||||
echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" . "<br>";
|
||||
echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
|
||||
echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
|
||||
|
||||
echo "<h3>Flags:</h3>";
|
||||
show_flags ( $flags );
|
||||
|
||||
if ( $embedded_script != "" ) {
|
||||
echo "<h3>Embedded script:</h3>";
|
||||
echo "<blockquote>"."<pre>";
|
||||
echo $embedded_script;
|
||||
echo "</pre>"."</blockquote>";
|
||||
}
|
||||
|
||||
echo "<h3>Make output:</h3>";
|
||||
echo "Make command: " . $make_cmd . "<br>";
|
||||
echo "<blockquote>"."<pre>";
|
||||
echo htmlentities ( implode ("\n", $maketxt ) );
|
||||
echo "</pre>"."</blockquote>";
|
||||
|
||||
echo "Please let us know that this happened, and paste the above output into your email message.<br>";
|
||||
|
||||
include_once $bottom_inc;
|
||||
|
||||
// For emacs:
|
||||
// Local variables:
|
||||
// c-basic-offset: 4
|
||||
// c-indent-level: 4
|
||||
// tab-width: 4
|
||||
// End:
|
||||
|
||||
?>
|
|
@ -0,0 +1,69 @@
|
|||
<?php // -*- Mode: PHP; -*-
|
||||
|
||||
/**
|
||||
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
|
||||
* Copyright (C) 2009 Entity Cyber, Inc.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
// Get utility functions and set globals
|
||||
require_once "utils.php";
|
||||
|
||||
// Prepare settable compile options for presentation to user
|
||||
$flags = default_flags ();
|
||||
|
||||
$build = "<input type=\"submit\" name=\"A\" value=\"Get Image\">";
|
||||
$restart = "<input type=\"submit\" name=\"A\" value=\"Start Over\">";
|
||||
|
||||
// Begin html output
|
||||
include_once $top_inc;
|
||||
|
||||
?>
|
||||
|
||||
<form action="build.php" method=POST>
|
||||
<input type="hidden" name="version" value = "<?php echo $version ?>">
|
||||
<input type="hidden" name="use_flags" value="1">
|
||||
<h3>
|
||||
Make changes below and press <?php echo $build ?> to create an image, <br>
|
||||
Or press <?php echo $restart ?> to return to the main page.
|
||||
</h3>
|
||||
<hr>
|
||||
<ul>
|
||||
<?php require ( "directions.php" ); ?>
|
||||
</ul>
|
||||
<hr>
|
||||
<?php echo_flags( $flags ); ?>
|
||||
<hr>
|
||||
<h3>Embedded Script:</h3>
|
||||
<?php echo textarea ( "embedded_script", "", "10", "50" ); ?>
|
||||
<br><br>
|
||||
<hr>
|
||||
<center><table width="35%"><tr>
|
||||
<td align="left"> <?php echo $build; ?> </td>
|
||||
<td align="right"> <?php echo $restart ?></td>
|
||||
</tr></table></center>
|
||||
</form>
|
||||
|
||||
<?php include_once $bottom_inc; ?>
|
||||
<?
|
||||
// For emacs:
|
||||
//
|
||||
// Local variables:
|
||||
// c-basic-offset: 4
|
||||
// c-indent-level: 4
|
||||
// tab-width: 4
|
||||
// End:
|
||||
?>
|
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
|
||||
* Copyright (C) 2009 Entity Cyber, Inc.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
?>
|
||||
<li>
|
||||
Choose an output format: <?php echo keys_menubox ( "ofmt", $ofmts,
|
||||
isset ( $_POST['ofmt'] ) ? $_POST['ofmt'] : "") ?>
|
||||
<br><br>
|
||||
</li>
|
||||
<li>
|
||||
Choose a NIC type: <?php echo keys_menubox ( "nic", $nics,
|
||||
isset ( $_POST['nic'] ) ? $_POST['nic'] : "" ) ?>
|
||||
<br><br>
|
||||
</li>
|
||||
<li>
|
||||
<strong>( optional — for binary ROM image format only )</strong> <br><br>
|
||||
If you choose <em>Binary ROM image</em> as your output format, you must<br>
|
||||
enter <strong>4 hex digits</strong> below for
|
||||
<em>PCI VENDOR CODE</em> and <em>PCI DEVICE CODE</em> <br>
|
||||
that match the NIC device for which you are making this image.<br><br>
|
||||
Information on how to determine NIC PCI IDs may be found
|
||||
<a href="http://www.ipxe.org/howto/romburning"
|
||||
target="_blank">here</a>.
|
||||
<br><br>
|
||||
PCI VENDOR CODE: <?php echo textbox ( "pci_vendor_code",
|
||||
isset ( $_POST['pci_vendor_code'] ) ? $_POST['pci_vendor_code']
|
||||
: "", 6 ); ?>
|
||||
|
||||
PCI DEVICE CODE: <?php echo textbox ( "pci_device_code",
|
||||
isset ( $_POST['pci_device_code'] ) ? $_POST['pci_device_code']
|
||||
: "", 6 ); ?>
|
||||
<h4>Please note for ROM images:</h4>
|
||||
<ul>
|
||||
<li>
|
||||
If you enter PCI IDs, we will attempt to determine the correct<br>
|
||||
driver to support them, and will ignore any NIC type entered
|
||||
above.<br><br>
|
||||
</li>
|
||||
<li>
|
||||
iPXE does not support all possible PCI IDs for supported
|
||||
NICs.
|
||||
<br><br>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
|
@ -0,0 +1 @@
|
|||
Automatic booting
|
|
@ -0,0 +1 @@
|
|||
Tenths of a second for which the shell banner should appear
|
|
@ -0,0 +1,3 @@
|
|||
Serial Console I/O port address. Common addresses are:<br>
|
||||
COM1 => 0x3f8, COM2 => 0x2f8, COM3 => 0x3e8, COM4 => 0x2e8
|
||||
|
|
@ -0,0 +1 @@
|
|||
Serial Console Data bits
|
|
@ -0,0 +1 @@
|
|||
Serial Console Parity: 0=None, 1=Odd, 2=Even
|
|
@ -0,0 +1 @@
|
|||
Keep settings from a previous user of the serial port
|
|
@ -0,0 +1 @@
|
|||
Serial Console Baud rate
|
|
@ -0,0 +1 @@
|
|||
Serial Console Stop bits
|
|
@ -0,0 +1 @@
|
|||
Option configuration console
|
|
@ -0,0 +1 @@
|
|||
Enable Default BIOS console
|
|
@ -0,0 +1 @@
|
|||
Enable Serial port console
|
|
@ -0,0 +1 @@
|
|||
Wireless WEP encryption support
|
|
@ -0,0 +1 @@
|
|||
Wireless WPA encryption support
|
|
@ -0,0 +1 @@
|
|||
Wireless WPA2 encryption support
|
|
@ -0,0 +1 @@
|
|||
DHCP management commands
|
|
@ -0,0 +1 @@
|
|||
DNS resolver
|
|
@ -0,0 +1 @@
|
|||
File Transfer Protocol
|
|
@ -0,0 +1 @@
|
|||
Hypertext Transfer Protocol
|
|
@ -0,0 +1 @@
|
|||
Trivial File Transfer Protocol
|
|
@ -0,0 +1 @@
|
|||
Interface management commands
|
|
@ -0,0 +1 @@
|
|||
Linux bzImage image support
|
|
@ -0,0 +1 @@
|
|||
Image management commands
|
|
@ -0,0 +1 @@
|
|||
ELF image support
|
|
@ -0,0 +1 @@
|
|||
MultiBoot image support
|
|
@ -0,0 +1 @@
|
|||
NBI image support
|
|
@ -0,0 +1 @@
|
|||
PXE image support
|
|
@ -0,0 +1 @@
|
|||
iPXE script image support
|
|
@ -0,0 +1 @@
|
|||
Wireless interface management commands
|
|
@ -0,0 +1 @@
|
|||
NMB resolver
|
|
@ -0,0 +1 @@
|
|||
Non-volatile option storage commands
|
|
@ -0,0 +1 @@
|
|||
Routing table management commands
|
|
@ -0,0 +1 @@
|
|||
SAN boot commands
|
|
@ -0,0 +1,531 @@
|
|||
<?php // -*- Mode: PHP; -*-
|
||||
|
||||
/**
|
||||
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
|
||||
* Copyright (C) 2009 Entity Cyber, Inc.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
$ofmts = array
|
||||
( "Floppy bootable image (.dsk)" => "dsk",
|
||||
"SYSLINUX-based bootable floppy image (.sdsk)" => "sdsk",
|
||||
"ISO bootable image (.iso)" => "iso",
|
||||
"ISO bootable image with legacy floppy emulation (.liso)" => "liso",
|
||||
"Linux kernel (SYSLINUX/GRUB/LILO) loadable image (.lkrn)" => "lkrn",
|
||||
"USB Keychain disk image (.usb)" => "usb",
|
||||
"ROM binary (flashable) image (.rom)" => "rom",
|
||||
"ROM binary (flashable) for problem PMM BIOSES (.hrom)" => "hrom",
|
||||
"PXE bootstrap loader image [Unload PXE stack] (.pxe)" => "pxe",
|
||||
"PXE bootstrap loader keep [Keep PXE stack method 1] (.kpxe)" => "kpxe",
|
||||
"PXE bootstrap loader keep [Keep PXE stack method 2] (.kkpxe)" => "kkpxe",
|
||||
);
|
||||
|
||||
$flag_table = array (
|
||||
|
||||
// Begin General Options:
|
||||
|
||||
"HDR_MISC_OPTIONS"
|
||||
=> array (
|
||||
"flag" => "HDR_MISC_OPTIONS",
|
||||
"hide_from_user" => "yes", // Hide even the header
|
||||
"type" => "header",
|
||||
"label" => "Miscellaneous Options"
|
||||
),
|
||||
|
||||
"PRODUCT_NAME"
|
||||
=> array (
|
||||
"flag" => "PRODUCT_NAME",
|
||||
"hide_from_user" => "yes",
|
||||
"type" => "string",
|
||||
"value" => "",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"PRODUCT_SHORT_NAME"
|
||||
=> array (
|
||||
"flag" => "PRODUCT_SHORT_NAME",
|
||||
"hide_from_user" => "yes",
|
||||
"type" => "string",
|
||||
"value" => "iPXE",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
// End General Options:
|
||||
|
||||
// Begin Console Options:
|
||||
|
||||
"HDR_CONSOLE_OPTIONS"
|
||||
=> array (
|
||||
"flag" => "HDR_CONSOLE_OPTIONS",
|
||||
"type" => "header",
|
||||
"label" => "Console Options"
|
||||
),
|
||||
|
||||
"CONSOLE_PCBIOS"
|
||||
=> array (
|
||||
"flag" => "CONSOLE_PCBIOS",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "console"
|
||||
),
|
||||
|
||||
"CONSOLE_SERIAL"
|
||||
=> array (
|
||||
"flag" => "CONSOLE_SERIAL",
|
||||
"type" => "on/off",
|
||||
"value" => "off",
|
||||
"cfgsec" => "console"
|
||||
),
|
||||
|
||||
"BANNER_TIMEOUT"
|
||||
=> array (
|
||||
"flag" => "BANNER_TIMEOUT",
|
||||
"type" => "integer",
|
||||
"value" => "20",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"KEYBOARD_MAP"
|
||||
=> array (
|
||||
"flag" => "KEYBOARD_MAP",
|
||||
"type" => "choice",
|
||||
"options" => array("al","az","bg","by","cf","cz","de","dk","es","et","fi","fr",
|
||||
"gr","hu","il","it","lt","mk","mt","nl","no","pl","pt","ro","ru","sg","sr",
|
||||
"th","ua","uk","us","wo"),
|
||||
"value" => "us",
|
||||
"cfgsec" => "console"
|
||||
),
|
||||
|
||||
"LOG_LEVEL"
|
||||
=> array (
|
||||
"flag" => "LOG_LEVEL",
|
||||
"type" => "choice",
|
||||
"options" => array("LOG_NONE","LOG_EMERG","LOG_ALERT","LOG_CRIT","LOG_ERR",
|
||||
"LOG_WARNING","LOG_NOTICE","LOG_INFO","LOG_DEBUG","LOG_ALL"),
|
||||
"value" => "LOG_NONE",
|
||||
"cfgsec" => "console"
|
||||
),
|
||||
|
||||
// End Console Options
|
||||
|
||||
// Begin Network Protocol Options:
|
||||
|
||||
"HDR_NETWORK_PROTOCOL_OPTIONS"
|
||||
=> array (
|
||||
"flag" => "HDR_NETWORK_PROTOCOL_OPTIONS",
|
||||
"hide_from_user" => "yes", // Hide even the header
|
||||
"type" => "header",
|
||||
"label" => "Network Protocol Options"
|
||||
),
|
||||
|
||||
"NET_PROTO_IPV4"
|
||||
=> array (
|
||||
"flag" => "NET_PROTO_IPV4",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"hide_from_user" => "yes",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
// End Network Protocol Options
|
||||
|
||||
// Begin Serial Port configuration
|
||||
|
||||
"HDR_SERIAL_PORT_OPTIONS"
|
||||
=> array (
|
||||
"flag" => "HDR_SERIAL_PORT_OPTIONS",
|
||||
"type" => "header",
|
||||
"label" => "Serial Port Options"
|
||||
),
|
||||
|
||||
"COMCONSOLE"
|
||||
=> array (
|
||||
"flag" => "COMCONSOLE",
|
||||
"type" => "integer-hex", // e.g. 0x378
|
||||
"value" => "0x3F8",
|
||||
"cfgsec" => "serial"
|
||||
),
|
||||
|
||||
"COMPRESERVE"
|
||||
=> array (
|
||||
"flag" => "COMPRESERVE",
|
||||
"type" => "on/off",
|
||||
"value" => "off",
|
||||
"cfgsec" => "serial"
|
||||
),
|
||||
|
||||
"COMSPEED"
|
||||
=> array (
|
||||
"flag" => "COMSPEED",
|
||||
"type" => "integer",
|
||||
"value" => "115200",
|
||||
"cfgsec" => "serial"
|
||||
),
|
||||
|
||||
"COMDATA"
|
||||
=> array (
|
||||
"flag" => "COMDATA",
|
||||
"type" => "integer",
|
||||
"value" => "8",
|
||||
"cfgsec" => "serial"
|
||||
),
|
||||
|
||||
"COMPARITY"
|
||||
=> array (
|
||||
"flag" => "COMPARITY",
|
||||
"type" => "integer",
|
||||
"value" => "0",
|
||||
"cfgsec" => "serial"
|
||||
),
|
||||
|
||||
"COMSTOP"
|
||||
=> array (
|
||||
"flag" => "COMSTOP",
|
||||
"type" => "integer",
|
||||
"value" => "1",
|
||||
"cfgsec" => "serial"
|
||||
),
|
||||
|
||||
// End Serial Options
|
||||
|
||||
// Begin Download Protocols
|
||||
|
||||
"HDR_DOWNLOAD_PROTOCOLS"
|
||||
=> array (
|
||||
"flag" => "HDR_DOWNLOAD_PROTOCOLS",
|
||||
"type" => "header",
|
||||
"label" => "Download Protocols"
|
||||
),
|
||||
|
||||
"DOWNLOAD_PROTO_TFTP"
|
||||
=> array (
|
||||
"flag" => "DOWNLOAD_PROTO_TFTP",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"DOWNLOAD_PROTO_HTTP"
|
||||
=> array (
|
||||
"flag" => "DOWNLOAD_PROTO_HTTP",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"DOWNLOAD_PROTO_HTTPS"
|
||||
=> array (
|
||||
"flag" => "DOWNLOAD_PROTO_HTTPS",
|
||||
"type" => "on/off",
|
||||
"value" => "off",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"DOWNLOAD_PROTO_FTP"
|
||||
=> array (
|
||||
"flag" => "DOWNLOAD_PROTO_FTP",
|
||||
"type" => "on/off",
|
||||
"value" => "off",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
// End Download Protocols
|
||||
|
||||
// Begin SAN boot protocols
|
||||
|
||||
"HDR_SANBOOT_PROTOCOLS"
|
||||
=> array (
|
||||
"flag" => "HDR_SANBOOT_PROTOCOLS",
|
||||
"type" => "header",
|
||||
"label" => "SAN Boot Protocols"
|
||||
),
|
||||
|
||||
"SANBOOT_PROTO_ISCSI"
|
||||
=> array (
|
||||
"flag" => "SANBOOT_PROTO_ISCSI",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"SANBOOT_PROTO_AOE"
|
||||
=> array (
|
||||
"flag" => "SANBOOT_PROTO_AOE",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
// End SAN boot protocols
|
||||
|
||||
// Begin Name resolution modules
|
||||
|
||||
"HDR_NAME_RESOLUTION_MODULES"
|
||||
=> array (
|
||||
"flag" => "HDR_NAME_RESOLUTION_MODULES",
|
||||
"type" => "header",
|
||||
"label" => "Name Resolution Modules"
|
||||
),
|
||||
|
||||
"DNS_RESOLVER"
|
||||
=> array (
|
||||
"flag" => "DNS_RESOLVER",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"NMB_RESOLVER"
|
||||
=> array (
|
||||
"flag" => "NMB_RESOLVER",
|
||||
"type" => "on/off",
|
||||
"value" => "off",
|
||||
"hide_from_user" => "yes",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
// End Name resolution modules
|
||||
|
||||
// Begin Image types
|
||||
|
||||
"HDR_IMAGE_TYPES"
|
||||
=> array (
|
||||
"flag" => "HDR_IMAGE_TYPES",
|
||||
"type" => "header",
|
||||
"label" => "Image Types",
|
||||
),
|
||||
|
||||
"IMAGE_ELF"
|
||||
=> array (
|
||||
"flag" => "IMAGE_ELF",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"IMAGE_NBI"
|
||||
=> array (
|
||||
"flag" => "IMAGE_NBI",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"IMAGE_MULTIBOOT"
|
||||
=> array (
|
||||
"flag" => "IMAGE_MULTIBOOT",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"IMAGE_PXE"
|
||||
=> array (
|
||||
"flag" => "IMAGE_PXE",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"IMAGE_SCRIPT"
|
||||
=> array (
|
||||
"flag" => "IMAGE_SCRIPT",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"IMAGE_BZIMAGE"
|
||||
=> array (
|
||||
"flag" => "IMAGE_BZIMAGE",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"IMAGE_COMBOOT"
|
||||
=> array (
|
||||
"flag" => "IMAGE_COMBOOT",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
// End Image types
|
||||
|
||||
// Begin Command-line commands to include
|
||||
|
||||
"HDR_COMMAND_LINE_OPTIONS"
|
||||
=> array (
|
||||
"flag" => "HDR_COMMAND_LINE_OPTIONS",
|
||||
"type" => "header",
|
||||
"label" => "Command Line Options",
|
||||
),
|
||||
|
||||
"AUTOBOOT_CMD"
|
||||
=> array (
|
||||
"flag" => "AUTOBOOT_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"NVO_CMD"
|
||||
=> array (
|
||||
"flag" => "NVO_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"CONFIG_CMD"
|
||||
=> array (
|
||||
"flag" => "CONFIG_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"IFMGMT_CMD"
|
||||
=> array (
|
||||
"flag" => "IFMGMT_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"IWMGMT_CMD"
|
||||
=> array (
|
||||
"flag" => "IWMGMT_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"ROUTE_CMD"
|
||||
=> array (
|
||||
"flag" => "ROUTE_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"IMAGE_CMD"
|
||||
=> array (
|
||||
"flag" => "IMAGE_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"DHCP_CMD"
|
||||
=> array (
|
||||
"flag" => "DHCP_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"SANBOOT_CMD"
|
||||
=> array (
|
||||
"flag" => "SANBOOT_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"LOGIN_CMD"
|
||||
=> array (
|
||||
"flag" => "LOGIN_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"TIME_CMD"
|
||||
=> array (
|
||||
"flag" => "TIME_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "off",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"DIGEST_CMD"
|
||||
=> array (
|
||||
"flag" => "DIGEST_CMD",
|
||||
"type" => "on/off",
|
||||
"value" => "off",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
// End Command-line commands to include
|
||||
|
||||
// Begin Wireless options
|
||||
|
||||
"HDR_WIRELESS_OPTIONS"
|
||||
=> array (
|
||||
"flag" => "HDR_WIRELESS_OPTIONS",
|
||||
"type" => "header",
|
||||
"label" => "Wireless Interface Options",
|
||||
),
|
||||
|
||||
"CRYPTO_80211_WEP"
|
||||
=> array (
|
||||
"flag" => "CRYPTO_80211_WEP",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"CRYPTO_80211_WPA"
|
||||
=> array (
|
||||
"flag" => "CRYPTO_80211_WPA",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
"CRYPTO_80211_WPA2"
|
||||
=> array (
|
||||
"flag" => "CRYPTO_80211_WPA2",
|
||||
"type" => "on/off",
|
||||
"value" => "on",
|
||||
"cfgsec" => "general"
|
||||
),
|
||||
|
||||
// End Wireless options
|
||||
|
||||
// Obscure options required to compile
|
||||
"NETDEV_DISCARD_RATE"
|
||||
=> array (
|
||||
"flag" => "NETDEV_DISCARD_RATE",
|
||||
"type" => "integer",
|
||||
"value" => "0",
|
||||
"cfgsec" => "general",
|
||||
"hide_from_user" => true
|
||||
)
|
||||
|
||||
// End Obscure options
|
||||
);
|
||||
|
||||
// For emacs:
|
||||
// Local variables:
|
||||
// c-basic-offset: 4
|
||||
// c-indent-level: 4
|
||||
// tab-width: 4
|
||||
// End:
|
||||
|
||||
?>
|
|
@ -0,0 +1,51 @@
|
|||
<?php // -*- Mode: PHP; -*-
|
||||
|
||||
/**
|
||||
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
|
||||
* Copyright (C) 2009 Entity Cyber, Inc.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
// Directory containing iPXE source code tree
|
||||
$src_dir = "../../src";
|
||||
|
||||
// Compute iPXE version based on source tree
|
||||
exec ( "make -C '$src_dir' version 2>&1", $make_output, $status );
|
||||
$version = ( $status == 0 && count ( $make_output ) > 1 )
|
||||
? trim ( $make_output[count ( $make_output ) - 2] )
|
||||
: "";
|
||||
|
||||
// Email address of person responsible for this website
|
||||
$webmaster_email = "webmaster@example.com";
|
||||
|
||||
// Files that header and footer text
|
||||
$top_inc = "top.php";
|
||||
$bottom_inc = "bottom.php";
|
||||
|
||||
// Descriptive strings
|
||||
$header_title = "ROM-o-matic for iPXE $version";
|
||||
$html_tagline = "ROM-o-matic dynamically generates iPXE images";
|
||||
$html_title = "ROM-o-matic for iPXE $version";
|
||||
$description = "a dynamic iPXE image generator";
|
||||
|
||||
// For emacs:
|
||||
// Local variables:
|
||||
// c-basic-offset: 4
|
||||
// c-indent-level: 4
|
||||
// tab-width: 4
|
||||
// End:
|
||||
|
||||
?>
|
|
@ -0,0 +1,47 @@
|
|||
<?php // -*- Mode: PHP; -*-
|
||||
|
||||
/**
|
||||
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
|
||||
* Copyright (C) 2009 Entity Cyber, Inc.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
// Get utility functions and set globals
|
||||
require_once "utils.php";
|
||||
|
||||
// Begin html output
|
||||
include_once $top_inc;
|
||||
|
||||
?>
|
||||
<form action="build.php" method=POST>
|
||||
<input type="hidden" name="version" value = "<?php echo $version ?>">
|
||||
<h3>To create an image:</h3>
|
||||
<ol>
|
||||
<?php require ( "directions.php" ); ?>
|
||||
<li>
|
||||
Generate and download an image:
|
||||
<input type="submit" name="A" value="Get Image">
|
||||
<br><br>
|
||||
</li>
|
||||
<li>
|
||||
(optional) Customize image configuration options:
|
||||
<input type="submit" name="A" value="Customize">
|
||||
<br><br>
|
||||
</li>
|
||||
</ol>
|
||||
</form>
|
||||
|
||||
<?php include_once $bottom_inc ?>
|
|
@ -1,5 +1,10 @@
|
|||
/*
|
||||
* Copyright (C) 2024 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
|
||||
* Copyright (C) 2009 Entity Cyber, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
@ -13,25 +18,24 @@
|
|||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*
|
||||
* You can also choose to distribute this program under the terms of
|
||||
* the Unmodified Binary Distribution Licence (as given in the file
|
||||
* COPYING.UBDL), provided that you have satisfied its requirements.
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
?>
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Null multiprocessor API
|
||||
*
|
||||
*/
|
||||
|
||||
#include <ipxe/mp.h>
|
||||
|
||||
PROVIDE_MPAPI_INLINE ( null, mp_address );
|
||||
PROVIDE_MPAPI_INLINE ( null, mp_exec_boot );
|
||||
PROVIDE_MPAPI_INLINE ( null, mp_start_all );
|
||||
<html>
|
||||
<head>
|
||||
<link rev="made" href="mailto:<?php echo "${webmaster_email}" ?>">
|
||||
<meta name="keywords" content="rom, etherboot, ipxe, open source, rom-o-matic.net">
|
||||
<title><?php echo $header_title ?></title>
|
||||
<meta name="description" content="<?php echo $description ?>">
|
||||
</head>
|
||||
<h1>
|
||||
<?php echo "$html_title" ?>
|
||||
</h1>
|
||||
<hr>
|
||||
<h2>
|
||||
<?php echo "$html_tagline" ?>
|
||||
</h2>
|
||||
</form>
|
||||
<hr>
|
|
@ -0,0 +1,684 @@
|
|||
<?php // -*- Mode: PHP; -*-
|
||||
|
||||
/**
|
||||
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
|
||||
* Copyright (C) 2009 Entity Cyber, Inc.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
// Include table of user-configurable iPXE options
|
||||
require_once "flag-table.php";
|
||||
|
||||
// Include user-shadowable globals
|
||||
require_once "globals.php";
|
||||
|
||||
// Allow user to shadow globals
|
||||
if ( is_file ( 'local-config.php' ) ) {
|
||||
include_once "local-config.php";
|
||||
}
|
||||
|
||||
////
|
||||
// General utility functions
|
||||
////
|
||||
|
||||
/**
|
||||
* Remove undesirable characters from a given string
|
||||
*
|
||||
* Certain characters have the potential to be used for
|
||||
* malicious purposes by web-based attackers. This routine
|
||||
* filters out such characters.
|
||||
*
|
||||
* @param string $s supplied string
|
||||
*
|
||||
* @return string returned string with unwanted characters
|
||||
* removed
|
||||
*/
|
||||
function cleanstring ( $s )
|
||||
{
|
||||
$len = strlen ( $s );
|
||||
if ( $len > 80 ) {
|
||||
$s = substr ( $s, 0, 80 );
|
||||
}
|
||||
|
||||
$s = trim ( $s );
|
||||
$pos = 0;
|
||||
$result = "";
|
||||
|
||||
while ( $pos < $len ) {
|
||||
$ltr = ord ( ucfirst ( $s[$pos] ) );
|
||||
if ( ( $ltr >= ord ( "A" ) ) && ( $ltr <= ord ( "Z" ) ) ||
|
||||
( $ltr >= ord ( "0" ) ) && ( $ltr <= ord ( "9" ) ) ||
|
||||
( $ltr == ord ( "." ) ) && ( strlen ( $result ) > 0 ) ||
|
||||
( $ltr == ord ( "_" ) ) ||
|
||||
( $ltr == ord ( "+" ) ) ||
|
||||
( $ltr == ord ( ":" ) ) ||
|
||||
( $ltr == ord ( "/" ) ) ||
|
||||
( $ltr == ord ( "-" ) ) ) {
|
||||
$result .= $s[$pos];
|
||||
}
|
||||
$pos++;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return URL of the currently running script, minus the filename
|
||||
*
|
||||
* @return string the URL of the currently running script, minus the filename
|
||||
*/
|
||||
function curDirURL ()
|
||||
{
|
||||
$dir = dirname ( $_SERVER['PHP_SELF'] );
|
||||
|
||||
if ( $dir == "." || $dir == "/" ) {
|
||||
$dir = "";
|
||||
}
|
||||
|
||||
$isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
|
||||
$port = ( isset($_SERVER["SERVER_PORT"] ) &&
|
||||
( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) ||
|
||||
( $isHTTPS && $_SERVER["SERVER_PORT"] != "443" ) ) );
|
||||
|
||||
$port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
|
||||
|
||||
$dest = ( $isHTTPS ? 'https://' : 'http://' ) .
|
||||
$_SERVER["SERVER_NAME"] . $dir . "/";
|
||||
|
||||
return $dest;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract NIC families and associated ROM PCI IDs from the src/bin/NIC file.
|
||||
*
|
||||
* $src_dir must contain the path of the iPXE src directory for this build
|
||||
*
|
||||
* @return array[0] array $new_nics
|
||||
* @return array[1] array $roms
|
||||
*/
|
||||
function parse_nic_file ()
|
||||
{
|
||||
global $src_dir;
|
||||
|
||||
$fd = fopen ( "$src_dir/bin/NIC", "r" );
|
||||
if ( ! $fd ) {
|
||||
die ( "Missing src/bin/NIC file. 'make bin/NIC'" );
|
||||
}
|
||||
|
||||
$nics = array ();
|
||||
$roms = array ();
|
||||
$nic = "";
|
||||
|
||||
while ( !feof ( $fd ) ) {
|
||||
|
||||
$line = trim ( fgets ( $fd, 200 ) );
|
||||
|
||||
$first_eight_chars = substr ( $line, 0, 8 );
|
||||
settype ( $first_eight_chars, "string" );
|
||||
|
||||
if ( strpos ( $first_eight_chars, "family" ) === 0 ) {
|
||||
|
||||
// get pathname of NIC driver
|
||||
#list ( $dummy, $nic ) = split( "[ \t]+", $line );
|
||||
list ( $dummy, $nic ) = explode("\t", $line);
|
||||
settype ( $nic, "string" );
|
||||
|
||||
// extract filename name of driver from pathname
|
||||
$nic = substr ( $nic, strrpos ( $nic, "/" ) + 1,
|
||||
strlen ( $nic ) - strrpos ( $nic, "/" ) + 1 );
|
||||
|
||||
$nics[$nic] = $nic;
|
||||
|
||||
// For each ISA NIC, there can only be one ROM variant
|
||||
$roms[$nic] = $nic;
|
||||
}
|
||||
|
||||
// If the first 8 digits of the line are hex digits
|
||||
// add this rom to the current nic family.
|
||||
|
||||
if ( ( strlen ( $first_eight_chars ) == 8 )
|
||||
&& ( ctype_xdigit ( $first_eight_chars ) )
|
||||
&& ( $nic != "" ) ) {
|
||||
|
||||
$roms[$first_eight_chars] = $nic;
|
||||
}
|
||||
}
|
||||
fclose ( $fd );
|
||||
|
||||
// put most NICs in nice alpha order for menu
|
||||
ksort ( $nics );
|
||||
|
||||
// add special cases to the top
|
||||
|
||||
$new_nics = array ( "all-drivers" => "ipxe",
|
||||
"undionly" => "undionly",
|
||||
"undi" => "undi",
|
||||
);
|
||||
|
||||
foreach ( $nics as $key => $value ) {
|
||||
// skip the undi driver
|
||||
if ( $key != "undi" ) {
|
||||
$new_nics[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return array ( $new_nics, $roms );
|
||||
}
|
||||
|
||||
////
|
||||
// HTML form utility functions
|
||||
////
|
||||
|
||||
/**
|
||||
* Return html code to create hidden form input fields
|
||||
*
|
||||
* @param string $flag name of form variable to set
|
||||
* @param string $value value to give form variable
|
||||
*
|
||||
* @return string html code for given hidden form input field
|
||||
*/
|
||||
function hidden ( $flag, $value )
|
||||
{
|
||||
$value = htmlentities ( $value );
|
||||
return "<input type=\"hidden\" value=\"$value\" name=\"$flag\"></input>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Return html code to create checkbox form input fields
|
||||
*
|
||||
* @param string $flag name of form variable to set
|
||||
* @param string $value "on" means box should be checked
|
||||
*
|
||||
* @return string html code for given hidden form input field
|
||||
*/
|
||||
function checkbox ( $flag, $value )
|
||||
{
|
||||
return "<input type=\"checkbox\" value=\"on\" name=\"$flag\"" .
|
||||
($value == "on" ? " checked>" : ">" );
|
||||
}
|
||||
|
||||
/**
|
||||
* Return html code to create text form input fields
|
||||
*
|
||||
* @param string $flag name of form variable to set
|
||||
* @param string $value initial contents of field
|
||||
* @param string $size size in characters of text box
|
||||
*
|
||||
* @return string html code for given text input field
|
||||
*/
|
||||
function textbox ( $flag, $value, $size )
|
||||
{
|
||||
$value = htmlentities ( $value );
|
||||
return "<input type=\"text\" size=\"$size\" value=\"$value\" name=\"$flag\">";
|
||||
}
|
||||
|
||||
/**
|
||||
* Return html code to create textarea form fields
|
||||
*
|
||||
* @param string $flag name of form variable to set
|
||||
* @param string $value initial contents of textarea
|
||||
* @param string $rows height of text area in rows
|
||||
* @param string $cols width of text area in columns
|
||||
*
|
||||
* @return string html code for given textarea input field
|
||||
*/
|
||||
function textarea ( $flag, $value, $rows, $cols )
|
||||
{
|
||||
$value = htmlentities ( $value );
|
||||
return "<textarea name=\"$flag\" rows=\"$rows\" cols=\"$cols\">"
|
||||
. $value . "</textarea>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Return html code to create select (menu) form fields
|
||||
*
|
||||
* Use array of strings as menu choices
|
||||
*
|
||||
* @param string $flag name of form variable to set
|
||||
* @param array $options array of strings representing choices
|
||||
* @param string $value value of choice to select in menu
|
||||
*
|
||||
* @return string html code for given select (menu) input field
|
||||
*/
|
||||
function menubox ( $name, $options, $value )
|
||||
{
|
||||
$s="<select name=\"$name\">";
|
||||
|
||||
foreach ( $options as $ignore => $option ) {
|
||||
if ( !$value ) $value = $option;
|
||||
$s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
|
||||
htmlentities ( $option ) . "</option>";
|
||||
}
|
||||
return $s . "</select>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Return html code to create select (menu) form fields
|
||||
*
|
||||
* Use indices of array of strings as menu choices rather than
|
||||
* the values pointed to by the indicies.
|
||||
*
|
||||
* @param string $flag name of form variable to set
|
||||
* @param array $options array of strings representing choices
|
||||
* @param string $value value of choice to select in menu
|
||||
*
|
||||
* @return string html code for given select (menu) input field
|
||||
*/
|
||||
function keys_menubox ( $name, $options, $value )
|
||||
{
|
||||
$s="<select name=\"$name\">";
|
||||
|
||||
foreach ( $options as $option => $ignore ) {
|
||||
if ( !$value ) $value = $option;
|
||||
$s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
|
||||
htmlentities ( $option ) . "</option>";
|
||||
}
|
||||
return $s . "</select>";
|
||||
}
|
||||
|
||||
////
|
||||
// Flag (compile option) handling functions
|
||||
////
|
||||
|
||||
/**
|
||||
* Return default compile options (flags)
|
||||
*
|
||||
* Initial compile options are in a global called $flag_table.
|
||||
* Create and return an array containing the ones we want.
|
||||
*
|
||||
* @return array default compile options (flags)
|
||||
*/
|
||||
function default_flags ()
|
||||
{
|
||||
global $flag_table;
|
||||
|
||||
$flags = array ();
|
||||
|
||||
foreach ( $flag_table as $key => $props ) {
|
||||
|
||||
$flag = $props["flag"];
|
||||
$type = $props["type"];
|
||||
|
||||
// Fields like headers have no "value" property
|
||||
if ( isset ( $props["value"] ) ) {
|
||||
$flags[$flag] = $props["value"];
|
||||
}
|
||||
}
|
||||
return $flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return combination of default and user compile options (flags)
|
||||
*
|
||||
* Initial compile options are in a global called $flag_table.
|
||||
* Compile options may have been changed via form input. We return
|
||||
* an array with either the default value of each option or a user
|
||||
* supplied value from form input.
|
||||
*
|
||||
* @return array combined default and user supplied compile options (flags)
|
||||
*/
|
||||
function get_flags ()
|
||||
{
|
||||
global $flag_table;
|
||||
|
||||
$flags = default_flags ();
|
||||
|
||||
if ( ! isset ( $_POST["use_flags"] ) )
|
||||
return $flags;
|
||||
|
||||
foreach ( $flag_table as $key => $props ) {
|
||||
|
||||
$flag = $props["flag"];
|
||||
$type = $props["type"];
|
||||
|
||||
if ( isset ( $_POST["$flag"] ) ) {
|
||||
$flags[$flag] = $_POST["$flag"];
|
||||
if ( $type == "integer-hex" ) {
|
||||
if ( strtolower ( substr ( $flags[$flag], 0, 2 ) ) != "0x" ) {
|
||||
$flags[$flag] = "0x" . $flags[$flag];
|
||||
}
|
||||
}
|
||||
} else if ( $type == "on/off" ) {
|
||||
// Unchecked checkboxes don't pass any POST value
|
||||
// so we must check for them specially. At this
|
||||
// point we know that there is no $_POST value set
|
||||
// for this option. If it is a checkbox, this means
|
||||
// it is unchecked, so record that in $flags so we
|
||||
// can later generate an #undef for this option.
|
||||
$flags[$flag] = "off";
|
||||
}
|
||||
}
|
||||
return $flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Output given value in appropriate format for iPXE config file
|
||||
*
|
||||
* iPXE config/*.h files use C pre-processor syntax. Output the given
|
||||
* compile option in a format appropriate to its type
|
||||
*
|
||||
* @param string $key index into $flag_table for given compile option
|
||||
* @param string $value value we wish to set compile option to
|
||||
*
|
||||
* @return string code to set compile option to given value
|
||||
*/
|
||||
function pprint_flag ( $key, $value )
|
||||
{
|
||||
global $flag_table;
|
||||
|
||||
// Determine type of given compile option (flag)
|
||||
$type = $flag_table[$key]["type"];
|
||||
$s = "";
|
||||
|
||||
if ( $type == "on/off" && $value == "on" ) {
|
||||
$s = "#define $key";
|
||||
} else if ( $type == "on/off" && $value != "on" ) {
|
||||
$s = "#undef $key";
|
||||
} else if ( $type == "string" ) {
|
||||
$s = ( "#define $key \"" . cleanstring ( $value ) . "\"" );
|
||||
} else if ($type == "qstring" ) {
|
||||
$s = ( "#define $key \\\"" . cleanstring ( $value ) . "\\\"" );
|
||||
} else {
|
||||
$s = "#define $key " . cleanstring ( $value );
|
||||
}
|
||||
|
||||
return $s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Output html code to display all compile options as a table
|
||||
*
|
||||
* @param array $flags array of compile options
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function echo_flags ( $flags )
|
||||
{
|
||||
global $flag_table;
|
||||
|
||||
echo "<table>\n";
|
||||
|
||||
foreach ( $flag_table as $key => $props ) {
|
||||
|
||||
// Hide parameters from users that should not be changed.
|
||||
$hide_from_user = isset ( $props["hide_from_user"] ) ? $props["hide_from_user"] : "no";
|
||||
|
||||
$flag = $props["flag"];
|
||||
$type = $props["type"];
|
||||
|
||||
$value = isset ( $flags[$flag] ) ? $flags[$flag] : '';
|
||||
|
||||
if ( $hide_from_user == "yes" ) {
|
||||
|
||||
// Hidden flags cannot not be set by the user. We use hidden form
|
||||
// fields to keep them at their default values.
|
||||
if ( $type != "header" ) {
|
||||
echo hidden ( $flag, $value );
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// Flag (iPXE compile option) should be displayed to user
|
||||
|
||||
if ( $type == "header" ) {
|
||||
|
||||
$label = $props["label"];
|
||||
echo "<td colspan=2><hr><h3>$label</h3><hr></td>";
|
||||
|
||||
} else if ($type == "on/off" ) {
|
||||
|
||||
echo "<td>", checkbox ( $flag, $value ), "</td><td><strong>$flag</strong></td>";
|
||||
|
||||
} else { // don't display checkbox for non-on/off flags
|
||||
|
||||
echo "<td> </td><td><strong>$flag: </strong>";
|
||||
|
||||
if ($type == "choice" ) {
|
||||
$options = $props["options"];
|
||||
echo menubox($flag, $options, $value);
|
||||
|
||||
} else {
|
||||
|
||||
echo textbox($flag, $value, ($type == "integer" ||
|
||||
$type == "integer-hex"
|
||||
? 7 : 25));
|
||||
}
|
||||
echo "</td>";
|
||||
}
|
||||
echo "</tr>\n";
|
||||
|
||||
if ( $type != "header" ) {
|
||||
echo "<tr><td> </td>";
|
||||
echo "<td>\n";
|
||||
if ( is_file ( "doc/$flag.html" ) ) {
|
||||
include_once "doc/$flag.html";
|
||||
}
|
||||
echo "\n</td></tr>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
echo "</table>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array of configuration sections used in all compile options
|
||||
*
|
||||
* $flag_table, the global list of compile options contains a 'cfgsec'
|
||||
* property for each flag we are interested in. We return a list of
|
||||
* all the unique cfgsec options we find in $flag_table.
|
||||
*
|
||||
* @return array an array of strings representing all unique cfgsec values
|
||||
* found in $flag_table
|
||||
*/
|
||||
function get_flag_cfgsecs ()
|
||||
{
|
||||
global $flag_table;
|
||||
$cfgsecs = array ();
|
||||
|
||||
foreach ( $flag_table as $key => $props ) {
|
||||
if ( isset ( $props['cfgsec'] ) ) {
|
||||
$cfgsec = $props["cfgsec"];
|
||||
$cfgsecs[$cfgsec] = $cfgsec;
|
||||
}
|
||||
}
|
||||
return $cfgsecs;
|
||||
}
|
||||
|
||||
////
|
||||
// File and directory handling functions
|
||||
////
|
||||
|
||||
/**
|
||||
* Create a copy of a given source directory to a given destination
|
||||
*
|
||||
* Since we are going to modify the source directory, we create a copy
|
||||
* of the directory with a unique name in the given destination directory.
|
||||
* We supply a prefix for the tempnam call to prepend to the random filename
|
||||
* it generates.
|
||||
*
|
||||
* @param string $src source directory
|
||||
* @param string $dst destination directory
|
||||
* @param string $prefix string to append to directory created
|
||||
*
|
||||
* @return string absolute path to destination directory
|
||||
*/
|
||||
function mktempcopy ( $src, $dst, $prefix )
|
||||
{
|
||||
if ( $src[0] != "/" ) {
|
||||
$src = dirname ( $_SERVER['SCRIPT_FILENAME'] ) . "/" . $src;
|
||||
}
|
||||
|
||||
// Create a file in the given destination directory with a unique name
|
||||
$dir = tempnam ( $dst, $prefix );
|
||||
|
||||
// Delete the file just created, since it would interfere with the copy we
|
||||
// are about to do. We only care that the dir name we copy to is unique.
|
||||
unlink ( $dir );
|
||||
|
||||
exec ( "/bin/cp -a '$src' '$dir' 2>&1", $cpytxt, $status );
|
||||
|
||||
if ( $status != 0 ) {
|
||||
die ( "src directory copy failed!" );
|
||||
}
|
||||
return $dir;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write iPXE config files based on value of given flags
|
||||
*
|
||||
* iPXE compile options are stored in src/config/*.h .
|
||||
* We write out a config file for each set of options.
|
||||
*
|
||||
* @param string $config_dir directory to write .h files to
|
||||
* @param array $flags array of compile options for this build
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function write_ipxe_config_files ( $config_dir, $flags )
|
||||
{
|
||||
global $flag_table;
|
||||
|
||||
$cfgsecs = get_flag_cfgsecs ();
|
||||
|
||||
foreach ( $cfgsecs as $cfgsec ) {
|
||||
|
||||
$fname = $config_dir . "/" . $cfgsec . ".h";
|
||||
|
||||
$fp = fopen ( $fname, "wb" );
|
||||
if ( $fp <= 0 ) {
|
||||
die ( "Unable to open $fname file for output!" );
|
||||
}
|
||||
|
||||
$ifdef_secname = "CONFIG_" . strtoupper ( $cfgsec ) . "_H";
|
||||
|
||||
fwrite ( $fp, "#ifndef ${ifdef_secname}\n" );
|
||||
fwrite ( $fp, "#define ${ifdef_secname}\n" );
|
||||
fwrite ( $fp, "#include <config/defaults.h>\n" );
|
||||
|
||||
foreach ( $flags as $key => $value ) {
|
||||
// When the flag matches this section name, write it out
|
||||
if ( $flag_table[$key]["cfgsec"] == $cfgsec ) {
|
||||
fwrite ( $fp, pprint_flag ( $key, $value ) . "\n" );
|
||||
}
|
||||
}
|
||||
fwrite ( $fp, "#endif /* ${ifdef_secname} */\n" );
|
||||
fclose ( $fp );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Output a string to a file
|
||||
*
|
||||
* Output a given string to a given pathname. The file will be created if
|
||||
* necessary, and the string will replace the file's contents in all cases.
|
||||
*
|
||||
* @param string $fname pathname of file to output string to
|
||||
* @param string $ftext text to output to file
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function write_file_from_string ( $fname, $ftext )
|
||||
{
|
||||
$fp = fopen ( $fname, "wb" );
|
||||
if ( ! $fp ) {
|
||||
die ( "Unable to open $fname file for output!" );
|
||||
}
|
||||
fwrite ( $fp, $ftext );
|
||||
fclose ( $fp );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a file or recursively delete a directory tree
|
||||
*
|
||||
* @param string $file_or_dir_name name of file or directory to delete
|
||||
* @return bool Returns TRUE on success, FALSE on failure
|
||||
*/
|
||||
function rm_file_or_dir ( $file_or_dir_name )
|
||||
{
|
||||
if ( ! file_exists ( $file_or_dir_name ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( is_file ( $file_or_dir_name ) || is_link ( $file_or_dir_name ) ) {
|
||||
return unlink ( $file_or_dir_name );
|
||||
}
|
||||
|
||||
$dir = dir ( $file_or_dir_name );
|
||||
while ( ( $dir_entry = $dir->read () ) !== false ) {
|
||||
|
||||
if ( $dir_entry == '.' || $dir_entry == '..') {
|
||||
continue;
|
||||
}
|
||||
rm_file_or_dir ( $file_or_dir_name . '/' . $dir_entry );
|
||||
}
|
||||
$dir->close();
|
||||
|
||||
return rmdir ( $file_or_dir_name );
|
||||
}
|
||||
|
||||
////
|
||||
// Debugging functions
|
||||
////
|
||||
|
||||
/**
|
||||
* Emit html code to display given array of compile options (flags)
|
||||
*
|
||||
* @param array $flags array of compile options for this build
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function show_flags ( $flags )
|
||||
{
|
||||
echo ( "\$flags contains " . count ( $flags ) . " elements:" . "<br>" );
|
||||
|
||||
foreach ( $flags as $key => $flag ) {
|
||||
echo ( "\$flags[" . $key . "]=" . "\"$flag\"" . "<br>" );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Emit HTML code to display default array of compile options (flags)
|
||||
*
|
||||
* $flag_table contains default compile options and properties. This
|
||||
* routine outputs HTML code to display all properties of $flag_table.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function dump_flag_table ()
|
||||
{
|
||||
global $flag_table;
|
||||
|
||||
echo ( "\$flag_table contains " . count ( $flag_table ) . " elements:" . "<br>" );
|
||||
|
||||
foreach ( $flag_table as $key => $props ) {
|
||||
print ( "flag_table[" . $key . "] = " . "<br>" );
|
||||
|
||||
foreach ( $props as $key2 => $props2 ) {
|
||||
print ( " " . $key2 . " = " . $props2 . "<br>" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Parse src/bin/NIC file
|
||||
list ( $nics, $roms ) = parse_nic_file ();
|
||||
|
||||
// For emacs:
|
||||
// Local variables:
|
||||
// c-basic-offset: 4
|
||||
// c-indent-level: 4
|
||||
// tab-width: 4
|
||||
// End:
|
||||
|
||||
?>
|
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +1,4 @@
|
|||
.toolcheck
|
||||
.echocheck
|
||||
TAGS*
|
||||
bin-*
|
||||
bin*
|
||||
|
|
29
src/Makefile
29
src/Makefile
|
@ -10,7 +10,6 @@ LDFLAGS :=
|
|||
HOST_CFLAGS :=
|
||||
MAKEDEPS := Makefile
|
||||
CROSS_COMPILE ?= $(CROSS)
|
||||
SYMBOL_PREFIX :=
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
|
@ -24,18 +23,17 @@ CP := cp
|
|||
ECHO := echo
|
||||
PRINTF := printf
|
||||
PERL := perl
|
||||
PYTHON := python
|
||||
TRUE := true
|
||||
CC = $(CROSS_COMPILE)gcc
|
||||
CPP = $(CC) -E
|
||||
AS = $(CROSS_COMPILE)as
|
||||
LD = $(CROSS_COMPILE)ld
|
||||
SIZE = $(CROSS_COMPILE)size
|
||||
AR = $(CROSS_COMPILE)ar
|
||||
RANLIB = $(CROSS_COMPILE)ranlib
|
||||
OBJCOPY = $(CROSS_COMPILE)objcopy
|
||||
NM = $(CROSS_COMPILE)nm
|
||||
OBJDUMP = $(CROSS_COMPILE)objdump
|
||||
CC := $(CROSS_COMPILE)gcc
|
||||
CPP := $(CC) -E
|
||||
AS := $(CROSS_COMPILE)as
|
||||
LD := $(CROSS_COMPILE)ld
|
||||
SIZE := $(CROSS_COMPILE)size
|
||||
AR := $(CROSS_COMPILE)ar
|
||||
RANLIB := $(CROSS_COMPILE)ranlib
|
||||
OBJCOPY := $(CROSS_COMPILE)objcopy
|
||||
NM := $(CROSS_COMPILE)nm
|
||||
OBJDUMP := $(CROSS_COMPILE)objdump
|
||||
OPENSSL := openssl
|
||||
CSPLIT := csplit
|
||||
PARSEROM := ./util/parserom.pl
|
||||
|
@ -50,8 +48,9 @@ ELF2EFI32 := ./util/elf2efi32
|
|||
ELF2EFI64 := ./util/elf2efi64
|
||||
EFIROM := ./util/efirom
|
||||
EFIFATBIN := ./util/efifatbin
|
||||
ICCFIX := ./util/iccfix
|
||||
EINFO := ./util/einfo
|
||||
GENKEYMAP := ./util/genkeymap.py
|
||||
GENKEYMAP := ./util/genkeymap.pl
|
||||
DOXYGEN := doxygen
|
||||
LCAB := lcab
|
||||
QEMUIMG := qemu-img
|
||||
|
@ -75,9 +74,7 @@ SRCDIRS += drivers/net/phantom
|
|||
SRCDIRS += drivers/net/vxge
|
||||
SRCDIRS += drivers/net/efi
|
||||
SRCDIRS += drivers/net/tg3
|
||||
SRCDIRS += drivers/net/bnxt
|
||||
SRCDIRS += drivers/net/sfc
|
||||
SRCDIRS += drivers/net/marvell
|
||||
SRCDIRS += drivers/block
|
||||
SRCDIRS += drivers/nvs
|
||||
SRCDIRS += drivers/bitbash
|
||||
|
@ -192,7 +189,7 @@ vmware : bin/8086100f.mrom bin/808610d3.mrom bin/10222000.rom bin/15ad07b0.rom
|
|||
@$(ECHO) ' bin/10222000.rom -- vlance/pcnet32'
|
||||
@$(ECHO) ' bin/15ad07b0.rom -- vmxnet3'
|
||||
@$(ECHO)
|
||||
@$(ECHO) 'For more information, see https://ipxe.org/howto/vmware'
|
||||
@$(ECHO) 'For more information, see http://ipxe.org/howto/vmware'
|
||||
@$(ECHO)
|
||||
@$(ECHO) '==========================================================='
|
||||
|
||||
|
|
|
@ -1,13 +1,5 @@
|
|||
# -*- makefile -*- : Force emacs to use Makefile mode
|
||||
|
||||
# Enable stack protection if available
|
||||
#
|
||||
SPG_TEST = $(CC) -fstack-protector-strong -mstack-protector-guard=global \
|
||||
-x c -c /dev/null -o /dev/null >/dev/null 2>&1
|
||||
SPG_FLAGS := $(shell $(SPG_TEST) && $(ECHO) '-fstack-protector-strong ' \
|
||||
'-mstack-protector-guard=global')
|
||||
CFLAGS += $(SPG_FLAGS)
|
||||
|
||||
# The EFI linker script
|
||||
#
|
||||
LDSCRIPT = scripts/efi.lds
|
||||
|
@ -23,9 +15,9 @@ NON_AUTO_MEDIA += efidrv
|
|||
NON_AUTO_MEDIA += drv.efi
|
||||
NON_AUTO_MEDIA += efirom
|
||||
|
||||
# Include SNP and MNP drivers in the all-drivers build
|
||||
# Include SNP driver in the all-drivers build
|
||||
#
|
||||
DRIVERS_net += snp mnp
|
||||
DRIVERS_net += snp
|
||||
|
||||
# Rules for building EFI files
|
||||
#
|
||||
|
@ -43,17 +35,12 @@ $(BIN)/%.drv.efi : $(BIN)/%.efidrv
|
|||
|
||||
$(BIN)/%.efirom : $(BIN)/%.efidrv $(EFIROM)
|
||||
$(QM)$(ECHO) " [FINISH] $@"
|
||||
$(Q)$(EFIROM) -v $(firstword $(TGT_PCI_VENDOR) 0) \
|
||||
-d $(firstword $(TGT_PCI_DEVICE) 0) -c $< $@
|
||||
$(Q)$(EFIROM) -v $(TGT_PCI_VENDOR) -d $(TGT_PCI_DEVICE) $< $@
|
||||
|
||||
$(BIN)/efidrv.cab : $(BIN)/alldrv.efis # $(ALL_drv.efi) is not yet defined
|
||||
$(QM)$(ECHO) " [CAB] $@"
|
||||
$(Q)$(LCAB) -n -q $(ALL_drv.efi) $@
|
||||
|
||||
$(BIN)/%.iso : $(BIN)/%.efi util/genfsimg
|
||||
$(QM)$(ECHO) " [GENFSIMG] $@"
|
||||
$(Q)util/genfsimg -o $@ $<
|
||||
|
||||
$(BIN)/%.usb : $(BIN)/%.efi util/genfsimg
|
||||
$(QM)$(ECHO) " [GENFSIMG] $@"
|
||||
$(Q)util/genfsimg -o $@ $<
|
||||
$(BIN)/%.usb : $(BIN)/%.efi
|
||||
$(QM)$(ECHO) " [GENEFIDSK] $@"
|
||||
$(Q)bash util/genefidsk -o $@ -b $(EFI_BOOT_FILE) $<
|
||||
|
|
|
@ -3,20 +3,6 @@
|
|||
# This file contains various boring housekeeping functions that would
|
||||
# otherwise seriously clutter up the main Makefile.
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Make syntax does not allow use of comma or space in certain places.
|
||||
# This ugly workaround is suggested in the manual.
|
||||
#
|
||||
COMMA := ,
|
||||
EMPTY :=
|
||||
SPACE := $(EMPTY) $(EMPTY)
|
||||
HASH := \#
|
||||
define NEWLINE
|
||||
|
||||
|
||||
endef
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Find a usable "echo -e" substitute.
|
||||
|
@ -82,6 +68,51 @@ HOST_OS := $(shell uname -s)
|
|||
hostos :
|
||||
@$(ECHO) $(HOST_OS)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Determine compiler
|
||||
|
||||
CCDEFS := $(shell $(CC) -E -x c -c /dev/null -dM | cut -d" " -f2)
|
||||
ccdefs:
|
||||
@$(ECHO) $(CCDEFS)
|
||||
|
||||
ifeq ($(filter __ICC,$(CCDEFS)),__ICC)
|
||||
CCTYPE := icc
|
||||
else
|
||||
CCTYPE := gcc
|
||||
endif
|
||||
cctype:
|
||||
@$(ECHO) $(CCTYPE)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Check for tools that can cause failed builds
|
||||
#
|
||||
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
GCC_2_96_BANNER := $(shell $(CC) -v 2>&1 | grep -is 'gcc version 2\.96')
|
||||
ifneq ($(GCC_2_96_BANNER),)
|
||||
$(warning gcc 2.96 is unsuitable for compiling iPXE)
|
||||
$(warning Use gcc 2.95 or a newer version instead)
|
||||
$(error Unsuitable build environment found)
|
||||
endif
|
||||
endif
|
||||
|
||||
PERL_UNICODE_CHECK := $(shell $(PERL) -e 'use bytes; print chr(255)' | wc -c)
|
||||
ifeq ($(PERL_UNICODE_CHECK),2)
|
||||
$(warning Your Perl version has a Unicode handling bug)
|
||||
$(warning Execute this command before building iPXE:)
|
||||
$(warning export LANG=$${LANG%.UTF-8})
|
||||
$(error Unsuitable build environment found)
|
||||
endif
|
||||
|
||||
LD_GOLD_BANNER := $(shell $(LD) -v 2>&1 | grep 'GNU gold')
|
||||
ifneq ($(LD_GOLD_BANNER),)
|
||||
$(warning GNU gold is unsuitable for building iPXE)
|
||||
$(warning Use GNU ld instead)
|
||||
$(error Unsuitable build environment found)
|
||||
endif
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Check if $(eval ...) is available to use
|
||||
|
@ -94,6 +125,85 @@ endif
|
|||
eval :
|
||||
@$(ECHO) $(HAVE_EVAL)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Check for various tool workarounds
|
||||
#
|
||||
|
||||
WORKAROUND_CFLAGS :=
|
||||
WORKAROUND_ASFLAGS :=
|
||||
WORKAROUND_LDFLAGS :=
|
||||
|
||||
# Make syntax does not allow use of comma or space in certain places.
|
||||
# This ugly workaround is suggested in the manual.
|
||||
#
|
||||
COMMA := ,
|
||||
EMPTY :=
|
||||
SPACE := $(EMPTY) $(EMPTY)
|
||||
HASH := \#
|
||||
define NEWLINE
|
||||
|
||||
|
||||
endef
|
||||
|
||||
# Some widespread patched versions of gcc include -fstack-protector by
|
||||
# default, even when -ffreestanding is specified. We therefore need
|
||||
# to disable -fstack-protector if the compiler supports it.
|
||||
#
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
SP_TEST = $(CC) -fno-stack-protector -x c -c /dev/null \
|
||||
-o /dev/null >/dev/null 2>&1
|
||||
SP_FLAGS := $(shell $(SP_TEST) && $(ECHO) '-fno-stack-protector')
|
||||
WORKAROUND_CFLAGS += $(SP_FLAGS)
|
||||
endif
|
||||
|
||||
# gcc 4.4 generates .eh_frame sections by default, which distort the
|
||||
# output of "size". Inhibit this.
|
||||
#
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
CFI_TEST = $(CC) -fno-dwarf2-cfi-asm -fno-exceptions -fno-unwind-tables \
|
||||
-fno-asynchronous-unwind-tables -x c -c /dev/null \
|
||||
-o /dev/null >/dev/null 2>&1
|
||||
CFI_FLAGS := $(shell $(CFI_TEST) && \
|
||||
$(ECHO) '-fno-dwarf2-cfi-asm -fno-exceptions ' \
|
||||
'-fno-unwind-tables -fno-asynchronous-unwind-tables')
|
||||
WORKAROUND_CFLAGS += $(CFI_FLAGS)
|
||||
endif
|
||||
|
||||
# gcc 4.6 generates spurious warnings if -Waddress is in force.
|
||||
# Inhibit this.
|
||||
#
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
WNA_TEST = $(CC) -Waddress -x c -c /dev/null -o /dev/null >/dev/null 2>&1
|
||||
WNA_FLAGS := $(shell $(WNA_TEST) && $(ECHO) '-Wno-address')
|
||||
WORKAROUND_CFLAGS += $(WNA_FLAGS)
|
||||
|
||||
# gcc 8.0 generates warnings for certain suspect string operations. Our
|
||||
# sources have been vetted for correct usage. Turn off these warnings.
|
||||
#
|
||||
WNST_TEST = $(CC) -Wstringop-truncation -x c -c /dev/null -o /dev/null \
|
||||
>/dev/null 2>&1
|
||||
WNST_FLAGS := $(shell $(WNST_TEST) && $(ECHO) '-Wno-stringop-truncation')
|
||||
WORKAROUND_CFLAGS += $(WNST_FLAGS)
|
||||
|
||||
# gcc 9.1 generates warnings for taking address of packed member which
|
||||
# may result in an unaligned pointer value. Inhibit the warnings.
|
||||
#
|
||||
WNAPM_TEST = $(CC) -Wno-address-of-packed-member -x c -c /dev/null \
|
||||
-o /dev/null >/dev/null 2>&1
|
||||
WNAPM_FLAGS := $(shell $(WNAPM_TEST) && \
|
||||
$(ECHO) '-Wno-address-of-packed-member')
|
||||
WORKAROUND_CFLAGS += $(WNAPM_FLAGS)
|
||||
endif
|
||||
|
||||
# Some versions of gas choke on division operators, treating them as
|
||||
# comment markers. Specifying --divide will work around this problem,
|
||||
# but isn't available on older gas versions.
|
||||
#
|
||||
DIVIDE_TEST = $(AS) --divide /dev/null -o /dev/null 2>/dev/null
|
||||
DIVIDE_FLAGS := $(shell $(DIVIDE_TEST) && $(ECHO) '--divide')
|
||||
WORKAROUND_ASFLAGS += $(DIVIDE_FLAGS)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Build verbosity
|
||||
|
@ -180,7 +290,7 @@ ifeq ($(wildcard $(BIN)),)
|
|||
$(shell $(MKDIR) -p $(BIN))
|
||||
endif
|
||||
|
||||
# Target to allow e.g. "make bin-x86_64-efi arch"
|
||||
# Target to allow e.g. "make bin-efi arch"
|
||||
#
|
||||
$(BIN) :
|
||||
@# Do nothing, silently
|
||||
|
@ -229,13 +339,8 @@ else
|
|||
BIN_AP := $(BIN_APS)
|
||||
BIN_SECUREBOOT := 0
|
||||
endif
|
||||
ifeq ($(BIN_AP),efi)
|
||||
BIN_ARCH := i386
|
||||
BIN_PLATFORM := efi
|
||||
else
|
||||
BIN_ARCH := $(word 1,$(BIN_AP))
|
||||
BIN_PLATFORM := $(word 2,$(BIN_AP))
|
||||
endif
|
||||
BIN_PLATFORM := $(lastword $(BIN_AP))
|
||||
BIN_ARCH := $(wordlist 2,$(words $(BIN_AP)),discard $(BIN_AP))
|
||||
|
||||
# Determine build architecture
|
||||
DEFAULT_ARCH := i386
|
||||
|
@ -246,13 +351,9 @@ arch :
|
|||
.PHONY : arch
|
||||
|
||||
# Determine build platform
|
||||
DEFAULT_PLATFORM_i386 := pcbios
|
||||
DEFAULT_PLATFORM_x86_64 := pcbios
|
||||
DEFAULT_PLATFORM_riscv32 := sbi
|
||||
DEFAULT_PLATFORM_riscv64 := sbi
|
||||
DEFAULT_PLATFORM := $(DEFAULT_PLATFORM_$(ARCH))
|
||||
PLATFORM := $(firstword $(BIN_PLATFORM) $(DEFAULT_PLATFORM) none)
|
||||
CFLAGS += -DPLATFORM=$(PLATFORM) -DPLATFORM_$(PLATFORM)
|
||||
DEFAULT_PLATFORM := pcbios
|
||||
PLATFORM := $(firstword $(BIN_PLATFORM) $(DEFAULT_PLATFORM))
|
||||
CFLAGS += -DPLATFORM=$(PLATFORM)
|
||||
platform :
|
||||
@$(ECHO) $(PLATFORM)
|
||||
|
||||
|
@ -263,164 +364,18 @@ CFLAGS += -DSECUREBOOT=$(SECUREBOOT)
|
|||
secureboot :
|
||||
@$(ECHO) $(SECUREBOOT)
|
||||
|
||||
# Set cross-compilation prefix automatically if not specified
|
||||
ifeq ($(CROSS_COMPILE),)
|
||||
CROSS_COMPILE := $(CROSS_COMPILE_$(ARCH))
|
||||
endif
|
||||
|
||||
endif # defined(BIN)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Determine compiler
|
||||
|
||||
CCDEFS := $(shell $(CC) -E -x c -c /dev/null -dM | cut -d" " -f2)
|
||||
ccdefs:
|
||||
@$(ECHO) $(CCDEFS)
|
||||
|
||||
ifeq ($(filter __GNUC__,$(CCDEFS)),__GNUC__)
|
||||
CCTYPE := gcc
|
||||
endif
|
||||
cctype:
|
||||
@$(ECHO) $(CCTYPE)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Check for tools that can cause failed builds
|
||||
#
|
||||
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
GCC_2_96_BANNER := $(shell $(CC) -v 2>&1 | grep -is 'gcc version 2\.96')
|
||||
ifneq ($(GCC_2_96_BANNER),)
|
||||
$(warning gcc 2.96 is unsuitable for compiling iPXE)
|
||||
$(warning Use gcc 2.95 or a newer version instead)
|
||||
$(error Unsuitable build environment found)
|
||||
endif
|
||||
endif
|
||||
|
||||
PERL_UNICODE_CHECK := $(shell $(PERL) -e 'use bytes; print chr(255)' | wc -c)
|
||||
ifeq ($(PERL_UNICODE_CHECK),2)
|
||||
$(warning Your Perl version has a Unicode handling bug)
|
||||
$(warning Execute this command before building iPXE:)
|
||||
$(warning export LANG=$${LANG%.UTF-8})
|
||||
$(error Unsuitable build environment found)
|
||||
endif
|
||||
|
||||
LD_GOLD_BANNER := $(shell $(LD) -v 2>&1 | grep 'GNU gold')
|
||||
ifneq ($(LD_GOLD_BANNER),)
|
||||
$(warning GNU gold is unsuitable for building iPXE)
|
||||
$(warning Use GNU ld instead)
|
||||
$(error Unsuitable build environment found)
|
||||
endif
|
||||
|
||||
OBJCOPY_ETC_BANNER := $(shell $(OBJCOPY) --version | grep 'elftoolchain')
|
||||
ifneq ($(OBJCOPY_ETC_BANNER),)
|
||||
$(warning The elftoolchain objcopy is unsuitable for building iPXE)
|
||||
$(warning Use binutils objcopy instead)
|
||||
$(error Unsuitable build environment found)
|
||||
endif
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Check for various tool workarounds
|
||||
#
|
||||
|
||||
WORKAROUND_CFLAGS :=
|
||||
WORKAROUND_ASFLAGS :=
|
||||
WORKAROUND_LDFLAGS :=
|
||||
|
||||
# gcc 4.4 generates .eh_frame sections by default, which distort the
|
||||
# output of "size". Inhibit this.
|
||||
#
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
CFI_TEST = $(CC) -fno-dwarf2-cfi-asm -fno-exceptions -fno-unwind-tables \
|
||||
-fno-asynchronous-unwind-tables -x c -c /dev/null \
|
||||
-o /dev/null >/dev/null 2>&1
|
||||
CFI_FLAGS := $(shell $(CFI_TEST) && \
|
||||
$(ECHO) '-fno-dwarf2-cfi-asm -fno-exceptions ' \
|
||||
'-fno-unwind-tables -fno-asynchronous-unwind-tables')
|
||||
WORKAROUND_CFLAGS += $(CFI_FLAGS)
|
||||
endif
|
||||
|
||||
# gcc 4.6 generates spurious warnings if -Waddress is in force.
|
||||
# Inhibit this.
|
||||
#
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
WNA_TEST = $(CC) -Waddress -x c -c /dev/null -o /dev/null >/dev/null 2>&1
|
||||
WNA_FLAGS := $(shell $(WNA_TEST) && $(ECHO) '-Wno-address')
|
||||
WORKAROUND_CFLAGS += $(WNA_FLAGS)
|
||||
|
||||
# gcc 8.0 generates warnings for certain suspect string operations. Our
|
||||
# sources have been vetted for correct usage. Turn off these warnings.
|
||||
#
|
||||
WNST_TEST = $(CC) -Wstringop-truncation -x c -c /dev/null -o /dev/null \
|
||||
>/dev/null 2>&1
|
||||
WNST_FLAGS := $(shell $(WNST_TEST) && $(ECHO) '-Wno-stringop-truncation')
|
||||
WORKAROUND_CFLAGS += $(WNST_FLAGS)
|
||||
|
||||
# gcc 9.1 generates warnings for taking address of packed member which
|
||||
# may result in an unaligned pointer value. Inhibit the warnings.
|
||||
#
|
||||
WNAPM_TEST = $(CC) -Wno-address-of-packed-member -x c -c /dev/null \
|
||||
-o /dev/null >/dev/null 2>&1
|
||||
WNAPM_FLAGS := $(shell $(WNAPM_TEST) && \
|
||||
$(ECHO) '-Wno-address-of-packed-member')
|
||||
WORKAROUND_CFLAGS += $(WNAPM_FLAGS)
|
||||
endif
|
||||
|
||||
# Some versions of gas choke on division operators, treating them as
|
||||
# comment markers. Specifying --divide will work around this problem,
|
||||
# but isn't available on older gas versions.
|
||||
#
|
||||
DIVIDE_TEST = $(AS) --divide /dev/null -o /dev/null 2>/dev/null
|
||||
DIVIDE_FLAGS := $(shell $(DIVIDE_TEST) && $(ECHO) '--divide')
|
||||
WORKAROUND_ASFLAGS += $(DIVIDE_FLAGS)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Include architecture-specific Makefile
|
||||
#
|
||||
|
||||
ifdef ARCH
|
||||
MAKEDEPS += arch/$(ARCH)/Makefile
|
||||
include arch/$(ARCH)/Makefile
|
||||
endif
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Especially ugly workarounds
|
||||
|
||||
# Some widespread patched versions of gcc include -fPIE -Wl,-pie by
|
||||
# default. Note that gcc will exit *successfully* if it fails to
|
||||
# recognise an option that starts with "no", so we have to test for
|
||||
# output on stderr instead of checking the exit status.
|
||||
#
|
||||
# Current versions of gcc require -no-pie; older versions require
|
||||
# -nopie. We therefore test for both.
|
||||
#
|
||||
# This workaround must be determined only after the
|
||||
# architecture-specific Makefile has been included, since some
|
||||
# platforms (e.g. bin-x86_64-efi) will explicitly require the use of
|
||||
# -fpie.
|
||||
#
|
||||
ifeq ($(filter -fpie,$(CFLAGS)),)
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
PIE_TEST = [ -z "`$(CC) -fno-PIE -no-pie -x c -c /dev/null -o /dev/null 2>&1`" ]
|
||||
PIE_FLAGS := $(shell $(PIE_TEST) && $(ECHO) '-fno-PIE -no-pie')
|
||||
PIE_TEST2 = [ -z "`$(CC) -fno-PIE -nopie -x c -c /dev/null -o /dev/null 2>&1`" ]
|
||||
PIE_FLAGS2 := $(shell $(PIE_TEST2) && $(ECHO) '-fno-PIE -nopie')
|
||||
WORKAROUND_CFLAGS += $(PIE_FLAGS) $(PIE_FLAGS2)
|
||||
endif
|
||||
endif
|
||||
|
||||
# Some widespread patched versions of gcc include -fcf-protection=full
|
||||
# by default.
|
||||
#
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
CFP_TEST = $(CC) -fcf-protection=none -x c -c /dev/null -o /dev/null \
|
||||
>/dev/null 2>&1
|
||||
CFP_FLAGS := $(shell $(CFP_TEST) && $(ECHO) '-fcf-protection=none')
|
||||
WORKAROUND_CFLAGS += $(CFP_FLAGS)
|
||||
# Include architecture-specific include path
|
||||
ifdef ARCH
|
||||
INCDIRS += arch/$(ARCH)/include
|
||||
INCDIRS += arch/$(ARCH)/include/$(PLATFORM)
|
||||
endif
|
||||
|
||||
###############################################################################
|
||||
|
@ -460,13 +415,6 @@ ifdef BIN
|
|||
incdirs :
|
||||
@$(ECHO) $(INCDIRS)
|
||||
|
||||
# Inhibit -fstack-protector (which is implicitly enabled in some
|
||||
# patched gcc versions) unless explicitly mentioned in CFLAGS.
|
||||
#
|
||||
ifeq ($(findstring -fstack-protector,$(CFLAGS)),)
|
||||
CFLAGS += -fno-stack-protector
|
||||
endif
|
||||
|
||||
# Common flags
|
||||
#
|
||||
CFLAGS += $(foreach INC,$(INCDIRS),-I$(INC))
|
||||
|
@ -474,17 +422,39 @@ CFLAGS += -Os
|
|||
CFLAGS += -g
|
||||
ifeq ($(CCTYPE),gcc)
|
||||
CFLAGS += -ffreestanding
|
||||
CFLAGS += -fcommon
|
||||
CFLAGS += -Wall -W -Wformat-nonliteral
|
||||
CFLAGS += -Wno-array-bounds -Wno-dangling-pointer
|
||||
HOST_CFLAGS += -Wall -W -Wformat-nonliteral
|
||||
HOST_CFLAGS += -Wno-array-bounds -Wno-dangling-pointer
|
||||
endif
|
||||
ifeq ($(CCTYPE),icc)
|
||||
CFLAGS += -fno-builtin
|
||||
CFLAGS += -no-ip
|
||||
CFLAGS += -no-gcc
|
||||
CFLAGS += -diag-disable 111 # Unreachable code
|
||||
CFLAGS += -diag-disable 128 # Unreachable loop
|
||||
CFLAGS += -diag-disable 170 # Array boundary checks
|
||||
CFLAGS += -diag-disable 177 # Unused functions
|
||||
CFLAGS += -diag-disable 181 # printf() format checks
|
||||
CFLAGS += -diag-disable 188 # enum strictness
|
||||
CFLAGS += -diag-disable 193 # Undefined preprocessor identifiers
|
||||
CFLAGS += -diag-disable 280 # switch ( constant )
|
||||
CFLAGS += -diag-disable 310 # K&R parameter lists
|
||||
CFLAGS += -diag-disable 424 # Extra semicolon
|
||||
CFLAGS += -diag-disable 589 # Declarations mid-code
|
||||
CFLAGS += -diag-disable 593 # Unused variables
|
||||
CFLAGS += -diag-disable 810 # Casting ints to smaller ints
|
||||
CFLAGS += -diag-disable 981 # Sequence point violations
|
||||
CFLAGS += -diag-disable 1292 # Ignored attributes
|
||||
CFLAGS += -diag-disable 1338 # void pointer arithmetic
|
||||
CFLAGS += -diag-disable 1361 # Variable-length arrays
|
||||
CFLAGS += -diag-disable 1418 # Missing prototypes
|
||||
CFLAGS += -diag-disable 1419 # Missing prototypes
|
||||
CFLAGS += -diag-disable 1599 # Hidden variables
|
||||
CFLAGS += -Wall -Wmissing-declarations
|
||||
endif
|
||||
CFLAGS += $(WORKAROUND_CFLAGS) $(EXTRA_CFLAGS)
|
||||
ASFLAGS += $(WORKAROUND_ASFLAGS) $(EXTRA_ASFLAGS)
|
||||
LDFLAGS += $(WORKAROUND_LDFLAGS) $(EXTRA_LDFLAGS)
|
||||
HOST_CFLAGS += -O2 -g
|
||||
HOST_EFI_CFLAGS += -fshort-wchar
|
||||
|
||||
# Inhibit -Werror if NO_WERROR is specified on make command line
|
||||
#
|
||||
|
@ -494,6 +464,35 @@ ASFLAGS += --fatal-warnings
|
|||
HOST_CFLAGS += -Werror
|
||||
endif
|
||||
|
||||
# Function trace recorder state in the last build. This is needed
|
||||
# in order to correctly rebuild whenever the function recorder is
|
||||
# enabled/disabled.
|
||||
#
|
||||
FNREC_STATE := $(BIN)/.fnrec.state
|
||||
ifeq ($(wildcard $(FNREC_STATE)),)
|
||||
FNREC_OLD := <invalid>
|
||||
else
|
||||
FNREC_OLD := $(shell cat $(FNREC_STATE))
|
||||
endif
|
||||
ifeq ($(FNREC_OLD),$(FNREC))
|
||||
$(FNREC_STATE) :
|
||||
else
|
||||
$(FNREC_STATE) : clean
|
||||
$(shell $(ECHO) "$(FNREC)" > $(FNREC_STATE))
|
||||
endif
|
||||
|
||||
VERYCLEANUP += $(FNREC_STATE)
|
||||
MAKEDEPS += $(FNREC_STATE)
|
||||
|
||||
ifeq ($(FNREC),1)
|
||||
# Enabling -finstrument-functions affects gcc's analysis and leads to spurious
|
||||
# warnings about use of uninitialised variables.
|
||||
#
|
||||
CFLAGS += -Wno-uninitialized
|
||||
CFLAGS += -finstrument-functions
|
||||
CFLAGS += -finstrument-functions-exclude-file-list=core/fnrec.c
|
||||
endif
|
||||
|
||||
# Enable per-item sections and section garbage collection. Note that
|
||||
# some older versions of gcc support -fdata-sections but treat it as
|
||||
# implying -fno-common, which would break our build. Some other older
|
||||
|
@ -518,13 +517,6 @@ LDFLAGS += --gc-sections
|
|||
#
|
||||
LDFLAGS += -static
|
||||
|
||||
# Use separate code segment if supported by linker
|
||||
#
|
||||
ZSC_TEST = $(LD) -z separate-code --version 2>&1 > /dev/null
|
||||
ZSC_FLAGS := $(shell [ -z "`$(ZSC_TEST)`" ] && \
|
||||
$(ECHO) '-z separate-code -z max-page-size=4096')
|
||||
LDFLAGS += $(ZSC_FLAGS)
|
||||
|
||||
# compiler.h is needed for our linking and debugging system
|
||||
#
|
||||
CFLAGS += -include include/compiler.h
|
||||
|
@ -534,10 +526,6 @@ CFLAGS += -include include/compiler.h
|
|||
#
|
||||
CFLAGS += -DASM_TCHAR='$(ASM_TCHAR)' -DASM_TCHAR_OPS='$(ASM_TCHAR_OPS)'
|
||||
|
||||
# Inhibit the default -Dlinux
|
||||
#
|
||||
CFLAGS += -Ulinux
|
||||
|
||||
# CFLAGS for specific object types
|
||||
#
|
||||
CFLAGS_c +=
|
||||
|
@ -555,6 +543,16 @@ OBJ_CFLAGS = $(CFLAGS_$(OBJECT)) -DOBJECT=$(subst -,_,$(OBJECT))
|
|||
$(BIN)/%.flags :
|
||||
@$(ECHO) $(OBJ_CFLAGS)
|
||||
|
||||
# ICC requires postprocessing objects to fix up table alignments
|
||||
#
|
||||
ifeq ($(CCTYPE),icc)
|
||||
POST_O = && $(ICCFIX) $@
|
||||
POST_O_DEPS := $(ICCFIX)
|
||||
else
|
||||
POST_O :=
|
||||
POST_O_DEPS :=
|
||||
endif
|
||||
|
||||
# Debug level calculations
|
||||
#
|
||||
DBGLVL_MAX = -DDBGLVL_MAX=$(firstword $(subst ., ,$(1)))
|
||||
|
@ -564,9 +562,9 @@ DBGLVL = $(call DBGLVL_MAX,$(1)) $(call DBGLVL_DFLT,$(1))
|
|||
# Rules for specific object types.
|
||||
#
|
||||
COMPILE_c = $(CC) $(CFLAGS) $(CFLAGS_c) $(OBJ_CFLAGS)
|
||||
RULE_c = $(Q)$(COMPILE_c) -c $< -o $@
|
||||
RULE_c = $(Q)$(COMPILE_c) -c $< -o $@ $(POST_O)
|
||||
RULE_c_to_ids.o = $(Q)$(ECHO_E) '$(OBJ_IDS_ASM_NL)' | $(ASSEMBLE_S) -o $@
|
||||
RULE_c_to_dbg%.o= $(Q)$(COMPILE_c) $(call DBGLVL,$*) -c $< -o $@
|
||||
RULE_c_to_dbg%.o= $(Q)$(COMPILE_c) $(call DBGLVL,$*) -c $< -o $@ $(POST_O)
|
||||
RULE_c_to_c = $(Q)$(COMPILE_c) -E -c $< > $@
|
||||
RULE_c_to_s = $(Q)$(COMPILE_c) -S -g0 -c $< -o $@
|
||||
|
||||
|
@ -806,38 +804,6 @@ include/ipxe/profile.h : $(PROFILE_LIST)
|
|||
|
||||
.PRECIOUS : include/ipxe/profile.h
|
||||
|
||||
# (Single-element) list of function recorder configuration
|
||||
#
|
||||
FNREC_LIST := $(BIN)/.fnrec.list
|
||||
ifeq ($(wildcard $(FNREC_LIST)),)
|
||||
FNREC_OLD := <invalid>
|
||||
else
|
||||
FNREC_OLD := $(shell cat $(FNREC_LIST))
|
||||
endif
|
||||
ifneq ($(FNREC_OLD),$(FNREC))
|
||||
$(shell $(ECHO) "$(FNREC)" > $(FNREC_LIST))
|
||||
endif
|
||||
|
||||
$(FNREC_LIST) : $(MAKEDEPS)
|
||||
|
||||
VERYCLEANUP += $(FNREC_LIST)
|
||||
|
||||
# Function recorder configuration
|
||||
#
|
||||
ifeq ($(FNREC),1)
|
||||
# Enabling -finstrument-functions affects gcc's analysis and leads to spurious
|
||||
# warnings about use of uninitialised variables.
|
||||
#
|
||||
CFLAGS += -Wno-uninitialized
|
||||
CFLAGS += -finstrument-functions
|
||||
CFLAGS += -finstrument-functions-exclude-file-list=core/fnrec.c
|
||||
endif
|
||||
|
||||
include/compiler.h : $(FNREC_LIST)
|
||||
$(Q)$(TOUCH) $@
|
||||
|
||||
.PRECIOUS : include/compiler.h
|
||||
|
||||
# These files use .incbin inline assembly to include a binary file.
|
||||
# Unfortunately ccache does not detect this dependency and caches
|
||||
# builds even when the binary file has changed.
|
||||
|
@ -893,7 +859,7 @@ define deps_template_parts
|
|||
@$(MKDIR) -p $(BIN)/deps/$(dir $(1))
|
||||
$(Q)$(CPP) $(CFLAGS) $(CFLAGS_$(2)) $(CFLAGS_$(3)) -DOBJECT=$(3) \
|
||||
-Wno-error -M $(1) -MG -MP | \
|
||||
sed 's/\.o[[:blank:]]*:/_DEPS +=/' > $(BIN)/deps/$(1).d
|
||||
sed 's/\.o\s*:/_DEPS +=/' > $(BIN)/deps/$(1).d
|
||||
endef
|
||||
|
||||
# rules_template : generate rules for a given source file
|
||||
|
@ -909,7 +875,7 @@ endef
|
|||
# $(3) is the source base name (e.g. "rtl8139")
|
||||
#
|
||||
define rules_template_parts
|
||||
$$(BIN)/$(3).o : $(1) $$(MAKEDEPS) $$($(3)_DEPS)
|
||||
$$(BIN)/$(3).o : $(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS)
|
||||
$$(QM)$(ECHO) " [BUILD] $$@"
|
||||
$$(RULE_$(2))
|
||||
BOBJS += $$(BIN)/$(3).o
|
||||
|
@ -924,7 +890,7 @@ endef
|
|||
# $(4) is the destination type (e.g. "dbg%.o")
|
||||
#
|
||||
define rules_template_target
|
||||
$$(BIN)/$(3).$(4) : $(1) $$(MAKEDEPS) $$($(3)_DEPS)
|
||||
$$(BIN)/$(3).$(4) : $(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS)
|
||||
$$(QM)$(ECHO) " [BUILD] $$@"
|
||||
$$(RULE_$(2)_to_$(4))
|
||||
$(TGT)_OBJS += $$(BIN)/$(3).$(4)
|
||||
|
@ -946,7 +912,7 @@ $(BIN)/deps/%.d : % $(MAKEDEPS)
|
|||
|
||||
# Calculate list of dependency files
|
||||
#
|
||||
AUTO_DEPS = $(patsubst %,$(BIN)/deps/%.d,$(AUTO_SRCS) core/version.c)
|
||||
AUTO_DEPS = $(patsubst %,$(BIN)/deps/%.d,$(AUTO_SRCS))
|
||||
autodeps :
|
||||
@$(ECHO) $(AUTO_DEPS)
|
||||
VERYCLEANUP += $(BIN)/deps
|
||||
|
@ -1025,7 +991,6 @@ endif
|
|||
# Device ID tables (using IDs from ROM definition file)
|
||||
#
|
||||
define obj_pci_id_asm
|
||||
.section ".note.GNU-stack", "", $(ASM_TCHAR)progbits
|
||||
.section ".pci_devlist.$(1)", "a", $(ASM_TCHAR)progbits
|
||||
.globl pci_devlist_$(1)
|
||||
pci_devlist_$(1):
|
||||
|
@ -1131,10 +1096,9 @@ TGT_LD_ENTRY = _$(TGT_PREFIX)_start
|
|||
#
|
||||
TGT_LD_FLAGS = $(foreach SYM,$(TGT_LD_ENTRY) $(TGT_LD_DRIVERS) \
|
||||
$(TGT_LD_DEVLIST) obj_config obj_config_$(PLATFORM),\
|
||||
-u $(SYMBOL_PREFIX)$(SYM) \
|
||||
--defsym check_$(SYM)=$(SYMBOL_PREFIX)$(SYM) ) \
|
||||
-u $(SYM) --defsym check_$(SYM)=$(SYM) ) \
|
||||
$(patsubst %,--defsym %,$(TGT_LD_IDS)) \
|
||||
-e $(SYMBOL_PREFIX)$(TGT_LD_ENTRY)
|
||||
-e $(TGT_LD_ENTRY)
|
||||
|
||||
# Calculate list of debugging versions of objects to be included in
|
||||
# the target.
|
||||
|
@ -1195,43 +1159,23 @@ BLIB = $(BIN)/blib.a
|
|||
$(BLIB) : $(BLIB_OBJS) $(BLIB_LIST) $(MAKEDEPS)
|
||||
$(Q)$(RM) $(BLIB)
|
||||
$(QM)$(ECHO) " [AR] $@"
|
||||
$(Q)$(AR) rcD $@ $(sort $(BLIB_OBJS))
|
||||
$(Q)$(OBJCOPY) --enable-deterministic-archives \
|
||||
--prefix-symbols=$(SYMBOL_PREFIX) $@
|
||||
$(Q)$(RANLIB) -D $@
|
||||
$(Q)$(AR) r $@ $(sort $(BLIB_OBJS))
|
||||
$(Q)$(RANLIB) $@
|
||||
blib : $(BLIB)
|
||||
|
||||
# Command to generate build ID. Must be unique for each $(BIN)/%.tmp,
|
||||
# even within the same build run.
|
||||
#
|
||||
# The build ID is supposed to be collision-free across all ROMs that
|
||||
# might ever end up installed in the same system. It doesn't just
|
||||
# disambiguate targets within a single build; it also disambiguates
|
||||
# different builds (such as builds for multiple ROMs all built from
|
||||
# the same blib.a).
|
||||
#
|
||||
BUILD_ID_CMD = cat $^ | cksum | awk '{print $$1}'
|
||||
BUILD_ID_CMD := perl -e 'printf "0x%08x", int ( rand ( 0xffffffff ) );'
|
||||
|
||||
# Build timestamp
|
||||
#
|
||||
# Used as a means to automatically select the newest version of iPXE
|
||||
# if multiple iPXE drivers are loaded concurrently in a UEFI system.
|
||||
#
|
||||
# It gets rounded down to the nearest minute when used for this
|
||||
# purpose.
|
||||
#
|
||||
ifdef SOURCE_DATE_EPOCH
|
||||
BUILD_TIMESTAMP := $(SOURCE_DATE_EPOCH)
|
||||
else ifdef GITVERSION
|
||||
BUILD_TIMESTAMP := $(shell git log -1 --pretty=%ct)
|
||||
else
|
||||
BUILD_TIMESTAMP := $(shell date +%s)
|
||||
endif
|
||||
|
||||
# Build version
|
||||
#
|
||||
GIT_INDEX := $(if $(GITVERSION),$(if $(wildcard ../.git/index),../.git/index))
|
||||
$(BIN)/version.%.o : core/version.c $(MAKEDEPS) $(version_DEPS) $(GIT_INDEX)
|
||||
$(BIN)/version.%.o : core/version.c $(MAKEDEPS) $(GIT_INDEX)
|
||||
$(QM)$(ECHO) " [VERSION] $@"
|
||||
$(Q)$(COMPILE_c) -DBUILD_NAME="\"$*\"" \
|
||||
-DVERSION_MAJOR=$(VERSION_MAJOR) \
|
||||
|
@ -1239,7 +1183,6 @@ $(BIN)/version.%.o : core/version.c $(MAKEDEPS) $(version_DEPS) $(GIT_INDEX)
|
|||
-DVERSION_PATCH=$(VERSION_PATCH) \
|
||||
-DVERSION="\"$(VERSION)\"" \
|
||||
-c $< -o $@
|
||||
$(Q)$(OBJCOPY) --prefix-symbols=$(SYMBOL_PREFIX) $@
|
||||
|
||||
# Build an intermediate object file from the objects required for the
|
||||
# specified target.
|
||||
|
@ -1247,7 +1190,7 @@ $(BIN)/version.%.o : core/version.c $(MAKEDEPS) $(version_DEPS) $(GIT_INDEX)
|
|||
$(BIN)/%.tmp : $(BIN)/version.%.o $(BLIB) $(MAKEDEPS) $(LDSCRIPT)
|
||||
$(QM)$(ECHO) " [LD] $@"
|
||||
$(Q)$(LD) $(LDFLAGS) -T $(LDSCRIPT) $(TGT_LD_FLAGS) $< $(BLIB) -o $@ \
|
||||
--defsym _build_id=$(shell $(BUILD_ID_CMD)) \
|
||||
--defsym _build_id=`$(BUILD_ID_CMD)` \
|
||||
--defsym _build_timestamp=$(BUILD_TIMESTAMP) \
|
||||
-Map $(BIN)/$*.tmp.map
|
||||
$(Q)$(OBJDUMP) -ht $@ | $(PERL) $(SORTOBJDUMP) >> $(BIN)/$*.tmp.map
|
||||
|
@ -1450,24 +1393,33 @@ CLEANUP += $(ZBIN)
|
|||
|
||||
$(ELF2EFI32) : util/elf2efi.c $(MAKEDEPS)
|
||||
$(QM)$(ECHO) " [HOSTCC] $@"
|
||||
$(Q)$(HOST_CC) $(HOST_CFLAGS) $(HOST_EFI_CFLAGS) -idirafter include -DEFI_TARGET32 $< -o $@
|
||||
$(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -DEFI_TARGET32 $< -o $@
|
||||
CLEANUP += $(ELF2EFI32)
|
||||
|
||||
$(ELF2EFI64) : util/elf2efi.c $(MAKEDEPS)
|
||||
$(QM)$(ECHO) " [HOSTCC] $@"
|
||||
$(Q)$(HOST_CC) $(HOST_CFLAGS) $(HOST_EFI_CFLAGS) -idirafter include -DEFI_TARGET64 $< -o $@
|
||||
$(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -DEFI_TARGET64 $< -o $@
|
||||
CLEANUP += $(ELF2EFI64)
|
||||
|
||||
$(EFIROM) : util/efirom.c util/eficompress.c $(MAKEDEPS)
|
||||
$(EFIROM) : util/efirom.c $(MAKEDEPS)
|
||||
$(QM)$(ECHO) " [HOSTCC] $@"
|
||||
$(Q)$(HOST_CC) $(HOST_CFLAGS) $(HOST_EFI_CFLAGS) -idirafter include -o $@ $<
|
||||
$(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -o $@ $<
|
||||
CLEANUP += $(EFIROM)
|
||||
|
||||
$(EFIFATBIN) : util/efifatbin.c $(MAKEDEPS)
|
||||
$(QM)$(ECHO) " [HOSTCC] $@"
|
||||
$(Q)$(HOST_CC) $(HOST_CFLAGS) $(HOST_EFI_CFLAGS) -idirafter include -o $@ $<
|
||||
$(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -o $@ $<
|
||||
CLEANUP += $(EFIFATBIN)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# The ICC fixup utility
|
||||
#
|
||||
$(ICCFIX) : util/iccfix.c $(MAKEDEPS)
|
||||
$(QM)$(ECHO) " [HOSTCC] $@"
|
||||
$(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -o $@ $<
|
||||
CLEANUP += $(ICCFIX)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# The error usage information utility
|
||||
|
@ -1592,7 +1544,7 @@ endif # defined(BIN)
|
|||
#
|
||||
|
||||
hci/keymap/keymap_%.c :
|
||||
$(Q)$(PYTHON) $(GENKEYMAP) $* > $@
|
||||
$(Q)$(PERL) $(GENKEYMAP) $* > $@
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
|
@ -1607,14 +1559,13 @@ hci/keymap/keymap_%.c :
|
|||
#
|
||||
|
||||
ifeq ($(NUM_BINS),0)
|
||||
ALLBINS := bin bin-*
|
||||
ALLBIN = $(foreach B,$(ALLBINS),$(patsubst $(BIN)/%,$(B)/%,$(1)))
|
||||
CLEANUP := $(foreach C,$(CLEANUP),$(call ALLBIN,$(C)))
|
||||
VERYCLEANUP := $(foreach V,$(VERYCLEANUP),$(call ALLBIN,$(V)))
|
||||
ALLBINS := bin{,-*}
|
||||
CLEANUP := $(patsubst $(BIN)/%,$(ALLBINS)/%,$(CLEANUP))
|
||||
VERYCLEANUP := $(patsubst $(BIN)/%,$(ALLBINS)/%,$(VERYCLEANUP))
|
||||
endif
|
||||
|
||||
clean :
|
||||
$(RM) -r $(CLEANUP)
|
||||
$(RM) $(CLEANUP)
|
||||
|
||||
veryclean : clean
|
||||
$(RM) -r $(VERYCLEANUP)
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
# -*- makefile -*- : Force emacs to use Makefile mode
|
||||
|
||||
# Prefix all iPXE symbols to avoid collisions with platform libraries
|
||||
#
|
||||
SYMBOL_PREFIX = _ipxe__
|
||||
|
||||
# Enable valgrind
|
||||
#
|
||||
CFLAGS += -UNVALGRIND
|
||||
|
||||
# The Linux linker script
|
||||
#
|
||||
LDSCRIPT = scripts/linux.lds
|
||||
|
||||
# Use a two-stage link
|
||||
#
|
||||
LDFLAGS += -r -d
|
||||
|
||||
# Source directories
|
||||
#
|
||||
SRCDIRS += drivers/linux
|
||||
SRCDIRS += interface/linux
|
||||
NON_AUTO_SRCS += interface/linux/linux_api.c
|
||||
|
||||
# Media types
|
||||
#
|
||||
NON_AUTO_MEDIA = linux
|
||||
|
||||
# Compiler flags for building host API wrapper
|
||||
#
|
||||
LINUX_CFLAGS += -Os -idirafter include -DSYMBOL_PREFIX=$(SYMBOL_PREFIX)
|
||||
ifneq ($(SYSROOT),)
|
||||
LINUX_CFLAGS += --sysroot=$(SYSROOT)
|
||||
endif
|
||||
|
||||
# Check for libslirp
|
||||
#
|
||||
LIBSLIRP_TEST = $(CC) $(LINUX_CFLAGS) -x c /dev/null -nostartfiles \
|
||||
-include slirp/libslirp.h -lslirp \
|
||||
-o /dev/null >/dev/null 2>&1
|
||||
WITH_LIBSLIRP := $(shell $(LIBSLIRP_TEST) && $(ECHO) yes)
|
||||
ifneq ($(WITH_LIBSLIRP),)
|
||||
LINUX_CFLAGS += -DHAVE_LIBSLIRP
|
||||
LINUX_LIBS += -lslirp
|
||||
endif
|
||||
|
||||
# Host API wrapper
|
||||
#
|
||||
$(BIN)/linux_api.o : interface/linux/linux_api.c include/ipxe/linux_api.h \
|
||||
include/ipxe/slirp.h $(MAKEDEPS)
|
||||
$(QM)$(ECHO) " [BUILD] $@"
|
||||
$(Q)$(CC) $(LINUX_CFLAGS) $(WORKAROUND_CFLAGS) -o $@ -c $<
|
||||
|
||||
# Rule to generate final binary
|
||||
#
|
||||
$(BIN)/%.linux : $(BIN)/%.linux.tmp $(BIN)/linux_api.o
|
||||
$(QM)$(ECHO) " [FINISH] $@"
|
||||
$(Q)$(CC) $(LINUX_CFLAGS) $(WORKAROUND_CFLAGS) -o $@ $^ $(LINUX_LIBS)
|
|
@ -3,11 +3,10 @@
|
|||
ASM_TCHAR := %
|
||||
ASM_TCHAR_OPS := %%
|
||||
|
||||
# Include ARM-specific headers
|
||||
# Include common ARM headers
|
||||
#
|
||||
INCDIRS := arch/$(ARCH)/include arch/arm/include $(INCDIRS)
|
||||
INCDIRS += arch/arm/include
|
||||
|
||||
# ARM-specific directories containing source files
|
||||
#
|
||||
SRCDIRS += arch/arm/core
|
||||
SRCDIRS += arch/arm/interface/efi
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
# -*- makefile -*- : Force emacs to use Makefile mode
|
||||
|
||||
# Include generic Linux Makefile
|
||||
#
|
||||
MAKEDEPS += Makefile.linux
|
||||
include Makefile.linux
|
|
@ -46,7 +46,7 @@ union arm32_io_qword {
|
|||
*
|
||||
* This is not atomic for ARM32.
|
||||
*/
|
||||
static __unused uint64_t arm32_readq ( volatile uint64_t *io_addr ) {
|
||||
static uint64_t arm32_readq ( volatile uint64_t *io_addr ) {
|
||||
volatile union arm32_io_qword *ptr =
|
||||
container_of ( io_addr, union arm32_io_qword, qword );
|
||||
union arm32_io_qword tmp;
|
||||
|
@ -64,8 +64,7 @@ static __unused uint64_t arm32_readq ( volatile uint64_t *io_addr ) {
|
|||
*
|
||||
* This is not atomic for ARM32.
|
||||
*/
|
||||
static __unused void arm32_writeq ( uint64_t data,
|
||||
volatile uint64_t *io_addr ) {
|
||||
static void arm32_writeq ( uint64_t data, volatile uint64_t *io_addr ) {
|
||||
volatile union arm32_io_qword *ptr =
|
||||
container_of ( io_addr, union arm32_io_qword, qword );
|
||||
union arm32_io_qword tmp;
|
||||
|
@ -83,6 +82,7 @@ PROVIDE_IOAPI_INLINE ( arm, readl );
|
|||
PROVIDE_IOAPI_INLINE ( arm, writeb );
|
||||
PROVIDE_IOAPI_INLINE ( arm, writew );
|
||||
PROVIDE_IOAPI_INLINE ( arm, writel );
|
||||
PROVIDE_IOAPI_INLINE ( arm, iodelay );
|
||||
PROVIDE_IOAPI_INLINE ( arm, mb );
|
||||
#ifdef __aarch64__
|
||||
PROVIDE_IOAPI_INLINE ( arm, readq );
|
||||
|
@ -91,4 +91,3 @@ PROVIDE_IOAPI_INLINE ( arm, writeq );
|
|||
PROVIDE_IOAPI ( arm, readq, arm32_readq );
|
||||
PROVIDE_IOAPI ( arm, writeq, arm32_writeq );
|
||||
#endif
|
||||
PROVIDE_DUMMY_PIO ( arm );
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _BITS_ACPI_H
|
||||
#define _BITS_ACPI_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* ARM-specific ACPI API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#endif /* _BITS_ACPI_H */
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _BITS_ENTROPY_H
|
||||
#define _BITS_ENTROPY_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* ARM-specific entropy API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#endif /* _BITS_ENTROPY_H */
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _BITS_HYPERV_H
|
||||
#define _BITS_HYPERV_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Hyper-V interface
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#endif /* _BITS_HYPERV_H */
|
|
@ -9,9 +9,6 @@
|
|||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
/** Page shift */
|
||||
#define PAGE_SHIFT 12
|
||||
|
||||
#include <ipxe/arm_io.h>
|
||||
|
||||
#endif /* _BITS_IO_H */
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _BITS_IOMAP_H
|
||||
#define _BITS_IOMAP_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* ARM-specific I/O mapping API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#endif /* _BITS_IOMAP_H */
|
|
@ -9,12 +9,6 @@
|
|||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
/**
|
||||
* Sleep until next CPU interrupt
|
||||
*
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) void cpu_halt ( void ) {
|
||||
__asm__ __volatile__ ( "wfi" );
|
||||
}
|
||||
#include <ipxe/efi/efiarm_nap.h>
|
||||
|
||||
#endif /* _BITS_NAP_H */
|
||||
#endif /* _BITS_MAP_H */
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
#ifndef _BITS_PCI_IO_H
|
||||
#define _BITS_PCI_IO_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* ARM PCI I/O API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <ipxe/io.h>
|
||||
|
||||
#endif /* _BITS_PCI_IO_H */
|
|
@ -3,12 +3,10 @@
|
|||
|
||||
/** @file
|
||||
*
|
||||
* RISCV-specific reboot API implementations
|
||||
* ARM-specific reboot API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <ipxe/sbi_reboot.h>
|
||||
|
||||
#endif /* _BITS_REBOOT_H */
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _BITS_SANBOOT_H
|
||||
#define _BITS_SANBOOT_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* ARM-specific sanboot API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#endif /* _BITS_SANBOOT_H */
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _BITS_SMBIOS_H
|
||||
#define _BITS_SMBIOS_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* ARM-specific SMBIOS API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#endif /* _BITS_SMBIOS_H */
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _BITS_TIME_H
|
||||
#define _BITS_TIME_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* ARM-specific time API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#endif /* _BITS_TIME_H */
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _BITS_UACCESS_H
|
||||
#define _BITS_UACCESS_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* ARM-specific user access API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#endif /* _BITS_UACCESS_H */
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _BITS_UART_H
|
||||
#define _BITS_UART_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* 16550-compatible UART
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#endif /* _BITS_UART_H */
|
|
@ -3,12 +3,10 @@
|
|||
|
||||
/** @file
|
||||
*
|
||||
* RISCV-specific user memory allocation API implementations
|
||||
* ARM-specific user memory allocation API implementations
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <ipxe/sbi_umalloc.h>
|
||||
|
||||
#endif /* _BITS_UMALLOC_H */
|
|
@ -15,13 +15,14 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|||
#define IOAPI_PREFIX_arm __arm_
|
||||
#endif
|
||||
|
||||
#include <ipxe/dummy_pio.h>
|
||||
|
||||
/*
|
||||
* Memory space mappings
|
||||
*
|
||||
*/
|
||||
|
||||
/** Page shift */
|
||||
#define PAGE_SHIFT 12
|
||||
|
||||
/*
|
||||
* Physical<->Bus address mappings
|
||||
*
|
||||
|
@ -79,6 +80,55 @@ ARM_WRITEX ( w, uint16_t, "h", "" );
|
|||
ARM_WRITEX ( l, uint32_t, "", "" );
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Dummy PIO reads and writes up to 32 bits
|
||||
*
|
||||
* There is no common standard for I/O-space access for ARM, and
|
||||
* non-MMIO peripherals are vanishingly rare. Provide dummy
|
||||
* implementations that will allow code to link and should cause
|
||||
* drivers to simply fail to detect hardware at runtime.
|
||||
*
|
||||
*/
|
||||
|
||||
#define ARM_INX( _suffix, _type ) \
|
||||
static inline __always_inline _type \
|
||||
IOAPI_INLINE ( arm, in ## _suffix ) ( volatile _type *io_addr __unused) { \
|
||||
return ~( (_type) 0 ); \
|
||||
} \
|
||||
static inline __always_inline void \
|
||||
IOAPI_INLINE ( arm, ins ## _suffix ) ( volatile _type *io_addr __unused, \
|
||||
_type *data, unsigned int count ) { \
|
||||
memset ( data, 0xff, count * sizeof ( *data ) ); \
|
||||
}
|
||||
ARM_INX ( b, uint8_t );
|
||||
ARM_INX ( w, uint16_t );
|
||||
ARM_INX ( l, uint32_t );
|
||||
|
||||
#define ARM_OUTX( _suffix, _type ) \
|
||||
static inline __always_inline void \
|
||||
IOAPI_INLINE ( arm, out ## _suffix ) ( _type data __unused, \
|
||||
volatile _type *io_addr __unused ) { \
|
||||
/* Do nothing */ \
|
||||
} \
|
||||
static inline __always_inline void \
|
||||
IOAPI_INLINE ( arm, outs ## _suffix ) ( volatile _type *io_addr __unused, \
|
||||
const _type *data __unused, \
|
||||
unsigned int count __unused ) { \
|
||||
/* Do nothing */ \
|
||||
}
|
||||
ARM_OUTX ( b, uint8_t );
|
||||
ARM_OUTX ( w, uint16_t );
|
||||
ARM_OUTX ( l, uint32_t );
|
||||
|
||||
/*
|
||||
* Slow down I/O
|
||||
*
|
||||
*/
|
||||
static inline __always_inline void
|
||||
IOAPI_INLINE ( arm, iodelay ) ( void ) {
|
||||
/* Nothing to do */
|
||||
}
|
||||
|
||||
/*
|
||||
* Memory barrier
|
||||
*
|
||||
|
@ -93,7 +143,4 @@ IOAPI_INLINE ( arm, mb ) ( void ) {
|
|||
#endif
|
||||
}
|
||||
|
||||
/* Dummy PIO */
|
||||
DUMMY_PIO ( arm );
|
||||
|
||||
#endif /* _IPXE_ARM_IO_H */
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
#ifndef _IPXE_EFIARM_NAP_H
|
||||
#define _IPXE_EFIARM_NAP_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* EFI CPU sleeping
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#ifdef NAP_EFIARM
|
||||
#define NAP_PREFIX_efiarm
|
||||
#else
|
||||
#define NAP_PREFIX_efiarm __efiarm_
|
||||
#endif
|
||||
|
||||
#endif /* _IPXE_EFIARM_NAP_H */
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2023 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
* Copyright (C) 2016 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
@ -23,31 +23,31 @@
|
|||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <ipxe/nap.h>
|
||||
#include <ipxe/efi/efi.h>
|
||||
|
||||
/** @file
|
||||
*
|
||||
* CPU sleeping test
|
||||
* iPXE CPU sleeping API for EFI
|
||||
*
|
||||
*/
|
||||
|
||||
/* Forcibly enable assertions */
|
||||
#undef NDEBUG
|
||||
|
||||
#include <ipxe/nap.h>
|
||||
#include <ipxe/test.h>
|
||||
|
||||
/**
|
||||
* Perform CPU sleeping self-test
|
||||
* Sleep until next interrupt
|
||||
*
|
||||
*/
|
||||
static void nap_test_exec ( void ) {
|
||||
|
||||
/* Check that we can sleep without crashing or halting forever */
|
||||
cpu_nap();
|
||||
ok ( 1 );
|
||||
static void efiarm_cpu_nap ( void ) {
|
||||
/*
|
||||
* I can't find any EFI API that allows us to put the CPU to
|
||||
* sleep. The CpuSleep() function is defined in CpuLib.h, but
|
||||
* isn't part of any exposed protocol so we have no way to
|
||||
* call it.
|
||||
*
|
||||
* The EFI shell doesn't seem to bother sleeping the CPU; it
|
||||
* just sits there idly burning power.
|
||||
*
|
||||
*/
|
||||
__asm__ __volatile__ ( "wfi" );
|
||||
}
|
||||
|
||||
/** CPU sleeping self-test */
|
||||
struct self_test nap_test __self_test = {
|
||||
.name = "nap",
|
||||
.exec = nap_test_exec,
|
||||
};
|
||||
PROVIDE_NAP ( efiarm, cpu_nap, efiarm_cpu_nap );
|
|
@ -5,7 +5,7 @@ SRCDIRS += arch/arm32/libgcc
|
|||
|
||||
# ARM32-specific flags
|
||||
#
|
||||
CFLAGS += -mthumb -mcpu=cortex-a15 -mabi=aapcs
|
||||
CFLAGS += -mthumb -mcpu=cortex-a15 -mabi=aapcs -mfloat-abi=soft
|
||||
CFLAGS += -mword-relocations
|
||||
ASFLAGS += -mthumb -mcpu=cortex-a15
|
||||
|
||||
|
@ -13,11 +13,6 @@ ASFLAGS += -mthumb -mcpu=cortex-a15
|
|||
#
|
||||
CFLAGS += -fshort-wchar
|
||||
|
||||
# EFI requires that enums are always 32 bits, and nothing else
|
||||
# currently cares
|
||||
#
|
||||
CFLAGS += -fno-short-enums
|
||||
|
||||
# Include common ARM Makefile
|
||||
MAKEDEPS += arch/arm/Makefile
|
||||
include arch/arm/Makefile
|
||||
|
|
|
@ -1,13 +1,17 @@
|
|||
# -*- makefile -*- : Force emacs to use Makefile mode
|
||||
|
||||
# EFI uses the soft float ABI
|
||||
# UEFI requires that enums are always 32 bits
|
||||
#
|
||||
CFLAGS += -mfloat-abi=soft
|
||||
CFLAGS += -fno-short-enums
|
||||
|
||||
# Specify EFI image builder
|
||||
#
|
||||
ELF2EFI = $(ELF2EFI32)
|
||||
|
||||
# Specify EFI boot file
|
||||
#
|
||||
EFI_BOOT_FILE = bootarm.efi
|
||||
|
||||
# Include generic EFI Makefile
|
||||
#
|
||||
MAKEDEPS += arch/arm/Makefile.efi
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
# -*- makefile -*- : Force emacs to use Makefile mode
|
||||
|
||||
# The number of different ABIs for 32-bit ARM is insane. It is
|
||||
# unclear whether or not unaligned accesses ought to work in a 32-bit
|
||||
# Linux userspace binary. When running in QEMU, unaligned accesses
|
||||
# result in a SIGBUS. Since this is likely to be the most common use
|
||||
# case (for running self-tests on an x86 build machine), and since we
|
||||
# don't particularly care about performance for Linux userspace
|
||||
# binaries, force the compiler to never generate an unaligned access.
|
||||
#
|
||||
CFLAGS += -mno-unaligned-access
|
||||
|
||||
# Inhibit the harmless warning about wchar_t size mismatch between the
|
||||
# linux_api.o helper object and the rest of iPXE.
|
||||
#
|
||||
LINUX_CFLAGS += -Wl,--no-wchar-size-warning
|
||||
|
||||
# Starting virtual address
|
||||
#
|
||||
LDFLAGS += -Ttext=0x10000
|
||||
|
||||
# Include generic Linux Makefile
|
||||
#
|
||||
MAKEDEPS += arch/arm/Makefile.linux
|
||||
include arch/arm/Makefile.linux
|
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
* Copyright (C) 2016 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*
|
||||
* You can also choose to distribute this program under the terms of
|
||||
* the Unmodified Binary Distribution Licence (as given in the file
|
||||
* COPYING.UBDL), provided that you have satisfied its requirements.
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <ipxe/bigint.h>
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Big integer support
|
||||
*/
|
||||
|
||||
/**
|
||||
* Multiply big integers
|
||||
*
|
||||
* @v multiplicand0 Element 0 of big integer to be multiplied
|
||||
* @v multiplier0 Element 0 of big integer to be multiplied
|
||||
* @v result0 Element 0 of big integer to hold result
|
||||
* @v size Number of elements
|
||||
*/
|
||||
void bigint_multiply_raw ( const uint32_t *multiplicand0,
|
||||
const uint32_t *multiplier0,
|
||||
uint32_t *result0, unsigned int size ) {
|
||||
const bigint_t ( size ) __attribute__ (( may_alias )) *multiplicand =
|
||||
( ( const void * ) multiplicand0 );
|
||||
const bigint_t ( size ) __attribute__ (( may_alias )) *multiplier =
|
||||
( ( const void * ) multiplier0 );
|
||||
bigint_t ( size * 2 ) __attribute__ (( may_alias )) *result =
|
||||
( ( void * ) result0 );
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
uint32_t multiplicand_element;
|
||||
uint32_t multiplier_element;
|
||||
uint32_t *result_elements;
|
||||
uint32_t discard_low;
|
||||
uint32_t discard_high;
|
||||
uint32_t discard_temp;
|
||||
|
||||
/* Zero result */
|
||||
memset ( result, 0, sizeof ( *result ) );
|
||||
|
||||
/* Multiply integers one element at a time */
|
||||
for ( i = 0 ; i < size ; i++ ) {
|
||||
multiplicand_element = multiplicand->element[i];
|
||||
for ( j = 0 ; j < size ; j++ ) {
|
||||
multiplier_element = multiplier->element[j];
|
||||
result_elements = &result->element[ i + j ];
|
||||
/* Perform a single multiply, and add the
|
||||
* resulting double-element into the result,
|
||||
* carrying as necessary. The carry can
|
||||
* never overflow beyond the end of the
|
||||
* result, since:
|
||||
*
|
||||
* a < 2^{n}, b < 2^{n} => ab < 2^{2n}
|
||||
*/
|
||||
__asm__ __volatile__ ( "umull %1, %2, %5, %6\n\t"
|
||||
"ldr %3, [%0]\n\t"
|
||||
"adds %3, %1\n\t"
|
||||
"stmia %0!, {%3}\n\t"
|
||||
"ldr %3, [%0]\n\t"
|
||||
"adcs %3, %2\n\t"
|
||||
"stmia %0!, {%3}\n\t"
|
||||
"bcc 2f\n\t"
|
||||
"\n1:\n\t"
|
||||
"ldr %3, [%0]\n\t"
|
||||
"adcs %3, #0\n\t"
|
||||
"stmia %0!, {%3}\n\t"
|
||||
"bcs 1b\n\t"
|
||||
"\n2:\n\t"
|
||||
: "+l" ( result_elements ),
|
||||
"=l" ( discard_low ),
|
||||
"=l" ( discard_high ),
|
||||
"=l" ( discard_temp ),
|
||||
"+m" ( *result )
|
||||
: "l" ( multiplicand_element ),
|
||||
"l" ( multiplier_element )
|
||||
: "cc" );
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,85 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2024 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*
|
||||
* You can also choose to distribute this program under the terms of
|
||||
* the Unmodified Binary Distribution Licence (as given in the file
|
||||
* COPYING.UBDL), provided that you have satisfied its requirements.
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Performance Monitor Cycle Counter (PMCCNTR)
|
||||
*
|
||||
*/
|
||||
|
||||
.section ".note.GNU-stack", "", %progbits
|
||||
.text
|
||||
.arm
|
||||
|
||||
/*
|
||||
* PMCCNTR status
|
||||
*
|
||||
* bit 31 set if PMCCNTR availability is not yet determined
|
||||
* bit 0 set if PMCCNTR is available
|
||||
*
|
||||
*/
|
||||
.section ".data.pmccntr_status", "aw", %progbits
|
||||
.globl pmccntr_status
|
||||
pmccntr_status:
|
||||
.word 0x80000000
|
||||
|
||||
/*
|
||||
* Check PMCCNTR availability
|
||||
*
|
||||
* Must preserve all registers, and return with either PMCCNTR enabled
|
||||
* or the Z flag set to indicate unavailability.
|
||||
*
|
||||
*/
|
||||
.section ".text.pmccntr_check", "ax", %progbits
|
||||
.globl pmccntr_check
|
||||
.type pmccntr_check, %function
|
||||
pmccntr_check:
|
||||
/* Save registers */
|
||||
stmfd sp!, { r0, r1 }
|
||||
/* Read CPSR.M (bits 3:0, always permitted in PL0) */
|
||||
mrs r0, cpsr
|
||||
and r0, r0, #0x0000000f
|
||||
/* Read PMUSERENR.EN (bit 0, always permitted in PL0) */
|
||||
mrc p15, 0, r1, c9, c14, 0
|
||||
and r1, r1, #0x00000001
|
||||
/* Check if we are in PL1+ or in PL0 with PMUSERENR.EN set */
|
||||
orrs r0, r0, r1
|
||||
/* If PMCCNTR is unavailable, exit with status=0 and ZF set */
|
||||
beq 1f
|
||||
/* Set PMCR.E (bit 0), set exit status=1 and ZF clear */
|
||||
movs r0, #0x00000001
|
||||
mcr p15, 0, r0, c9, c12, 0
|
||||
/* Set PMCNTENSET.C (bit 31) */
|
||||
mov r1, #0x80000000
|
||||
mcr p15, 0, r1, c9, c12, 1
|
||||
1: /* Store PMCCNTR status */
|
||||
ldr r1, pmccntr_status_ptr
|
||||
str r0, [r1]
|
||||
/* Restore registers and return */
|
||||
ldmfd sp!, { r0, r1 }
|
||||
bx lr
|
||||
pmccntr_status_ptr:
|
||||
.word pmccntr_status
|
||||
.size pmccntr_check, . - pmccntr_check
|
|
@ -1,6 +1,5 @@
|
|||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||
|
||||
.section ".note.GNU-stack", "", %progbits
|
||||
.text
|
||||
.arm
|
||||
|
||||
|
|
|
@ -43,9 +43,8 @@ bigint_init_raw ( uint32_t *value0, unsigned int size,
|
|||
* @v addend0 Element 0 of big integer to add
|
||||
* @v value0 Element 0 of big integer to be added to
|
||||
* @v size Number of elements
|
||||
* @ret carry Carry out
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_add_raw ( const uint32_t *addend0, uint32_t *value0,
|
||||
unsigned int size ) {
|
||||
bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
|
@ -55,9 +54,8 @@ bigint_add_raw ( const uint32_t *addend0, uint32_t *value0,
|
|||
uint32_t *discard_end;
|
||||
uint32_t discard_addend_i;
|
||||
uint32_t discard_value_i;
|
||||
int carry;
|
||||
|
||||
__asm__ __volatile__ ( "adds %2, %0, %9, lsl #2\n\t" /* clear CF */
|
||||
__asm__ __volatile__ ( "adds %2, %0, %8, lsl #2\n\t" /* clear CF */
|
||||
"\n1:\n\t"
|
||||
"ldmia %0!, {%3}\n\t"
|
||||
"ldr %4, [%1]\n\t"
|
||||
|
@ -70,11 +68,9 @@ bigint_add_raw ( const uint32_t *addend0, uint32_t *value0,
|
|||
"=l" ( discard_end ),
|
||||
"=l" ( discard_addend_i ),
|
||||
"=l" ( discard_value_i ),
|
||||
"=@cccs" ( carry ),
|
||||
"+m" ( *value )
|
||||
: "0" ( addend0 ), "1" ( value0 ),
|
||||
"l" ( size ) );
|
||||
return carry;
|
||||
: "0" ( addend0 ), "1" ( value0 ), "l" ( size )
|
||||
: "cc" );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -83,9 +79,8 @@ bigint_add_raw ( const uint32_t *addend0, uint32_t *value0,
|
|||
* @v subtrahend0 Element 0 of big integer to subtract
|
||||
* @v value0 Element 0 of big integer to be subtracted from
|
||||
* @v size Number of elements
|
||||
* @ret borrow Borrow out
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_subtract_raw ( const uint32_t *subtrahend0, uint32_t *value0,
|
||||
unsigned int size ) {
|
||||
bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
|
@ -95,9 +90,8 @@ bigint_subtract_raw ( const uint32_t *subtrahend0, uint32_t *value0,
|
|||
uint32_t *discard_end;
|
||||
uint32_t discard_subtrahend_i;
|
||||
uint32_t discard_value_i;
|
||||
int borrow;
|
||||
|
||||
__asm__ __volatile__ ( "add %2, %0, %9, lsl #2\n\t"
|
||||
__asm__ __volatile__ ( "add %2, %0, %8, lsl #2\n\t"
|
||||
"cmp %2, %0\n\t" /* set CF */
|
||||
"\n1:\n\t"
|
||||
"ldmia %0!, {%3}\n\t"
|
||||
|
@ -111,30 +105,27 @@ bigint_subtract_raw ( const uint32_t *subtrahend0, uint32_t *value0,
|
|||
"=l" ( discard_end ),
|
||||
"=l" ( discard_subtrahend_i ),
|
||||
"=l" ( discard_value_i ),
|
||||
"=@cccc" ( borrow ),
|
||||
"+m" ( *value )
|
||||
: "0" ( subtrahend0 ), "1" ( value0 ),
|
||||
"l" ( size ) );
|
||||
return borrow;
|
||||
"l" ( size )
|
||||
: "cc" );
|
||||
}
|
||||
|
||||
/**
|
||||
* Shift big integer left
|
||||
* Rotate big integer left
|
||||
*
|
||||
* @v value0 Element 0 of big integer
|
||||
* @v size Number of elements
|
||||
* @ret out Bit shifted out
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
bigint_shl_raw ( uint32_t *value0, unsigned int size ) {
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_rol_raw ( uint32_t *value0, unsigned int size ) {
|
||||
bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
( ( void * ) value0 );
|
||||
uint32_t *discard_value;
|
||||
uint32_t *discard_end;
|
||||
uint32_t discard_value_i;
|
||||
int carry;
|
||||
|
||||
__asm__ __volatile__ ( "adds %1, %0, %1, lsl #2\n\t" /* clear CF */
|
||||
__asm__ __volatile__ ( "adds %1, %0, %5, lsl #2\n\t" /* clear CF */
|
||||
"\n1:\n\t"
|
||||
"ldr %2, [%0]\n\t"
|
||||
"adcs %2, %2\n\t"
|
||||
|
@ -144,29 +135,26 @@ bigint_shl_raw ( uint32_t *value0, unsigned int size ) {
|
|||
: "=l" ( discard_value ),
|
||||
"=l" ( discard_end ),
|
||||
"=l" ( discard_value_i ),
|
||||
"=@cccs" ( carry ),
|
||||
"+m" ( *value )
|
||||
: "0" ( value0 ), "1" ( size ) );
|
||||
return carry;
|
||||
: "0" ( value0 ), "1" ( size )
|
||||
: "cc" );
|
||||
}
|
||||
|
||||
/**
|
||||
* Shift big integer right
|
||||
* Rotate big integer right
|
||||
*
|
||||
* @v value0 Element 0 of big integer
|
||||
* @v size Number of elements
|
||||
* @ret out Bit shifted out
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
bigint_shr_raw ( uint32_t *value0, unsigned int size ) {
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_ror_raw ( uint32_t *value0, unsigned int size ) {
|
||||
bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
( ( void * ) value0 );
|
||||
uint32_t *discard_value;
|
||||
uint32_t *discard_end;
|
||||
uint32_t discard_value_i;
|
||||
int carry;
|
||||
|
||||
__asm__ __volatile__ ( "adds %1, %0, %1, lsl #2\n\t" /* clear CF */
|
||||
__asm__ __volatile__ ( "adds %1, %0, %5, lsl #2\n\t" /* clear CF */
|
||||
"\n1:\n\t"
|
||||
"ldmdb %1!, {%2}\n\t"
|
||||
"rrxs %2, %2\n\t"
|
||||
|
@ -176,10 +164,9 @@ bigint_shr_raw ( uint32_t *value0, unsigned int size ) {
|
|||
: "=l" ( discard_value ),
|
||||
"=l" ( discard_end ),
|
||||
"=l" ( discard_value_i ),
|
||||
"=@cccs" ( carry ),
|
||||
"+m" ( *value )
|
||||
: "0" ( value0 ), "1" ( size ) );
|
||||
return carry;
|
||||
: "0" ( value0 ), "1" ( size )
|
||||
: "cc" );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -229,6 +216,25 @@ bigint_is_geq_raw ( const uint32_t *value0, const uint32_t *reference0,
|
|||
return ( value_i >= reference_i );
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if bit is set in big integer
|
||||
*
|
||||
* @v value0 Element 0 of big integer
|
||||
* @v size Number of elements
|
||||
* @v bit Bit to test
|
||||
* @ret is_set Bit is set
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
bigint_bit_is_set_raw ( const uint32_t *value0, unsigned int size,
|
||||
unsigned int bit ) {
|
||||
const bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
( ( const void * ) value0 );
|
||||
unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) );
|
||||
unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) );
|
||||
|
||||
return ( value->element[index] & ( 1 << subindex ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Find highest bit set in big integer
|
||||
*
|
||||
|
@ -303,35 +309,8 @@ bigint_done_raw ( const uint32_t *value0, unsigned int size __unused,
|
|||
*(--out_byte) = *(value_byte++);
|
||||
}
|
||||
|
||||
/**
|
||||
* Multiply big integer elements
|
||||
*
|
||||
* @v multiplicand Multiplicand element
|
||||
* @v multiplier Multiplier element
|
||||
* @v result Result element
|
||||
* @v carry Carry element
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_multiply_one ( const uint32_t multiplicand, const uint32_t multiplier,
|
||||
uint32_t *result, uint32_t *carry ) {
|
||||
uint32_t discard_low;
|
||||
uint32_t discard_high;
|
||||
|
||||
__asm__ __volatile__ ( /* Perform multiplication */
|
||||
"umull %0, %1, %4, %5\n\t"
|
||||
/* Accumulate result */
|
||||
"adds %2, %0\n\t"
|
||||
"adc %1, #0\n\t"
|
||||
/* Accumulate carry (cannot overflow) */
|
||||
"adds %2, %3\n\t"
|
||||
"adc %3, %1, #0\n\t"
|
||||
: "=r" ( discard_low ),
|
||||
"=r" ( discard_high ),
|
||||
"+r" ( *result ),
|
||||
"+r" ( *carry )
|
||||
: "r" ( multiplicand ),
|
||||
"r" ( multiplier )
|
||||
: "cc" );
|
||||
}
|
||||
extern void bigint_multiply_raw ( const uint32_t *multiplicand0,
|
||||
const uint32_t *multiplier0,
|
||||
uint32_t *value0, unsigned int size );
|
||||
|
||||
#endif /* _BITS_BIGINT_H */
|
||||
|
|
|
@ -8,9 +8,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|||
|
||||
#ifndef ASSEMBLY
|
||||
|
||||
/** Unprefixed constant operand modifier */
|
||||
#define ASM_NO_PREFIX "c"
|
||||
|
||||
#define __asmcall
|
||||
#define __libgcc
|
||||
|
||||
|
|
|
@ -11,30 +11,19 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
extern uint32_t pmccntr_status;
|
||||
|
||||
/**
|
||||
* Get profiling timestamp
|
||||
*
|
||||
* @ret timestamp Timestamp
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) unsigned long
|
||||
static inline __attribute__ (( always_inline )) uint64_t
|
||||
profile_timestamp ( void ) {
|
||||
uint32_t cycles;
|
||||
|
||||
/* Read cycle counter */
|
||||
__asm__ __volatile__ ( /* Check PMCCNTR status */
|
||||
"tst %0, %0\n\t"
|
||||
/* Check availability if not yet known */
|
||||
"it mi\n\t"
|
||||
"blxmi pmccntr_check\n\t"
|
||||
/* Read PMCCNTR if available */
|
||||
"it ne\n\t"
|
||||
"mrcne p15, 0, %0, c9, c13, 0\n\t"
|
||||
"\n1:\n\t"
|
||||
: "=r" ( cycles )
|
||||
: "0" ( pmccntr_status )
|
||||
: "cc", "lr" );
|
||||
__asm__ __volatile__ ( "mcr p15, 0, %1, c9, c12, 0\n\t"
|
||||
"mrc p15, 0, %0, c9, c13, 0\n\t"
|
||||
: "=r" ( cycles ) : "r" ( 1 ) );
|
||||
return cycles;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
#ifndef _BITS_TCPIP_H
|
||||
#define _BITS_TCPIP_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Transport-network layer interface
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
static inline __attribute__ (( always_inline )) uint16_t
|
||||
tcpip_continue_chksum ( uint16_t partial, const void *data, size_t len ) {
|
||||
|
||||
/* Not yet optimised */
|
||||
return generic_tcpip_continue_chksum ( partial, data, len );
|
||||
}
|
||||
|
||||
#endif /* _BITS_TCPIP_H */
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Copyright (C) 2015 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
*
|
||||
* 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 2 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, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*
|
||||
* You can also choose to distribute this program under the terms of
|
||||
* the Unmodified Binary Distribution Licence (as given in the file
|
||||
* COPYING.UBDL), provided that you have satisfied its requirements.
|
||||
*/
|
||||
|
||||
#ifndef _DHCP_ARCH_H
|
||||
#define _DHCP_ARCH_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Architecture-specific DHCP options
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <ipxe/dhcp.h>
|
||||
|
||||
#define DHCP_ARCH_CLIENT_ARCHITECTURE DHCP_CLIENT_ARCHITECTURE_ARM32
|
||||
|
||||
#define DHCP_ARCH_CLIENT_NDI 1 /* UNDI */ , 3, 10 /* v3.10 */
|
||||
|
||||
#endif
|
|
@ -1,12 +1,12 @@
|
|||
#ifndef _BITS_GDBMACH_H
|
||||
#define _BITS_GDBMACH_H
|
||||
#ifndef GDBMACH_H
|
||||
#define GDBMACH_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Dummy GDB architecture specifics
|
||||
* GDB architecture specifics
|
||||
*
|
||||
* This file is included only if the architecture does not provide its
|
||||
* own version of this file.
|
||||
* This file declares functions for manipulating the machine state and
|
||||
* debugging context.
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -42,4 +42,4 @@ extern int gdbmach_set_breakpoint ( int type, unsigned long addr, size_t len,
|
|||
int enable );
|
||||
extern void gdbmach_init ( void );
|
||||
|
||||
#endif /* _BITS_GDBMACH_H */
|
||||
#endif /* GDBMACH_H */
|
|
@ -1,20 +0,0 @@
|
|||
#ifndef _IPXE_EFI_DHCPARCH_H
|
||||
#define _IPXE_EFI_DHCPARCH_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* DHCP client architecture definitions
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <ipxe/dhcp.h>
|
||||
|
||||
/** DHCP client architecture */
|
||||
#define DHCP_ARCH_CLIENT_ARCHITECTURE DHCP_CLIENT_ARCHITECTURE_ARM32
|
||||
|
||||
/** DHCP client network device interface */
|
||||
#define DHCP_ARCH_CLIENT_NDI 1 /* UNDI */ , 3, 10 /* v3.10 */
|
||||
|
||||
#endif /* _IPXE_EFI_DHCPARCH_H */
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef _BITS_SETJMP_H
|
||||
#define _BITS_SETJMP_H
|
||||
#ifndef _SETJMP_H
|
||||
#define _SETJMP_H
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
|
@ -29,4 +29,10 @@ typedef struct {
|
|||
uint32_t lr;
|
||||
} jmp_buf[1];
|
||||
|
||||
#endif /* _BITS_SETJMP_H */
|
||||
extern int __asmcall __attribute__ (( returns_twice ))
|
||||
setjmp ( jmp_buf env );
|
||||
|
||||
extern void __asmcall __attribute__ (( noreturn ))
|
||||
longjmp ( jmp_buf env, int val );
|
||||
|
||||
#endif /* _SETJMP_H */
|
|
@ -1,6 +1,6 @@
|
|||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||
|
||||
.section ".note.GNU-stack", "", %progbits
|
||||
.text
|
||||
.thumb
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||
|
||||
.section ".note.GNU-stack", "", %progbits
|
||||
.text
|
||||
.arm
|
||||
|
||||
/**
|
||||
|
|
|
@ -4,6 +4,10 @@
|
|||
#
|
||||
ELF2EFI = $(ELF2EFI64)
|
||||
|
||||
# Specify EFI boot file
|
||||
#
|
||||
EFI_BOOT_FILE = bootaa64.efi
|
||||
|
||||
# Include generic EFI Makefile
|
||||
#
|
||||
MAKEDEPS += arch/arm/Makefile.efi
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
# -*- makefile -*- : Force emacs to use Makefile mode
|
||||
|
||||
# Starting virtual address
|
||||
#
|
||||
LDFLAGS += -Ttext=0x400000
|
||||
|
||||
# Include generic Linux Makefile
|
||||
#
|
||||
MAKEDEPS += arch/arm/Makefile.linux
|
||||
include arch/arm/Makefile.linux
|
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
* Copyright (C) 2016 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
*
|
||||
* 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 2 of the
|
||||
* License, or 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, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*
|
||||
* You can also choose to distribute this program under the terms of
|
||||
* the Unmodified Binary Distribution Licence (as given in the file
|
||||
* COPYING.UBDL), provided that you have satisfied its requirements.
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <ipxe/bigint.h>
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Big integer support
|
||||
*/
|
||||
|
||||
/**
|
||||
* Multiply big integers
|
||||
*
|
||||
* @v multiplicand0 Element 0 of big integer to be multiplied
|
||||
* @v multiplier0 Element 0 of big integer to be multiplied
|
||||
* @v result0 Element 0 of big integer to hold result
|
||||
* @v size Number of elements
|
||||
*/
|
||||
void bigint_multiply_raw ( const uint64_t *multiplicand0,
|
||||
const uint64_t *multiplier0,
|
||||
uint64_t *result0, unsigned int size ) {
|
||||
const bigint_t ( size ) __attribute__ (( may_alias )) *multiplicand =
|
||||
( ( const void * ) multiplicand0 );
|
||||
const bigint_t ( size ) __attribute__ (( may_alias )) *multiplier =
|
||||
( ( const void * ) multiplier0 );
|
||||
bigint_t ( size * 2 ) __attribute__ (( may_alias )) *result =
|
||||
( ( void * ) result0 );
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
uint64_t multiplicand_element;
|
||||
uint64_t multiplier_element;
|
||||
uint64_t *result_elements;
|
||||
uint64_t discard_low;
|
||||
uint64_t discard_high;
|
||||
uint64_t discard_temp_low;
|
||||
uint64_t discard_temp_high;
|
||||
|
||||
/* Zero result */
|
||||
memset ( result, 0, sizeof ( *result ) );
|
||||
|
||||
/* Multiply integers one element at a time */
|
||||
for ( i = 0 ; i < size ; i++ ) {
|
||||
multiplicand_element = multiplicand->element[i];
|
||||
for ( j = 0 ; j < size ; j++ ) {
|
||||
multiplier_element = multiplier->element[j];
|
||||
result_elements = &result->element[ i + j ];
|
||||
/* Perform a single multiply, and add the
|
||||
* resulting double-element into the result,
|
||||
* carrying as necessary. The carry can
|
||||
* never overflow beyond the end of the
|
||||
* result, since:
|
||||
*
|
||||
* a < 2^{n}, b < 2^{n} => ab < 2^{2n}
|
||||
*/
|
||||
__asm__ __volatile__ ( "mul %1, %6, %7\n\t"
|
||||
"umulh %2, %6, %7\n\t"
|
||||
"ldp %3, %4, [%0]\n\t"
|
||||
"adds %3, %3, %1\n\t"
|
||||
"adcs %4, %4, %2\n\t"
|
||||
"stp %3, %4, [%0], #16\n\t"
|
||||
"bcc 2f\n\t"
|
||||
"\n1:\n\t"
|
||||
"ldr %3, [%0]\n\t"
|
||||
"adcs %3, %3, xzr\n\t"
|
||||
"str %3, [%0], #8\n\t"
|
||||
"bcs 1b\n\t"
|
||||
"\n2:\n\t"
|
||||
: "+r" ( result_elements ),
|
||||
"=&r" ( discard_low ),
|
||||
"=&r" ( discard_high ),
|
||||
"=r" ( discard_temp_low ),
|
||||
"=r" ( discard_temp_high ),
|
||||
"+m" ( *result )
|
||||
: "r" ( multiplicand_element ),
|
||||
"r" ( multiplier_element )
|
||||
: "cc" );
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||
|
||||
.section ".note.GNU-stack", "", %progbits
|
||||
.text
|
||||
|
||||
/* Must match jmp_buf structure layout */
|
||||
|
|
|
@ -43,9 +43,8 @@ bigint_init_raw ( uint64_t *value0, unsigned int size,
|
|||
* @v addend0 Element 0 of big integer to add
|
||||
* @v value0 Element 0 of big integer to be added to
|
||||
* @v size Number of elements
|
||||
* @ret carry Carry out
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_add_raw ( const uint64_t *addend0, uint64_t *value0,
|
||||
unsigned int size ) {
|
||||
bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
|
@ -55,7 +54,6 @@ bigint_add_raw ( const uint64_t *addend0, uint64_t *value0,
|
|||
uint64_t discard_addend_i;
|
||||
uint64_t discard_value_i;
|
||||
unsigned int discard_size;
|
||||
int carry;
|
||||
|
||||
__asm__ __volatile__ ( "cmn xzr, xzr\n\t" /* clear CF */
|
||||
"\n1:\n\t"
|
||||
|
@ -70,11 +68,9 @@ bigint_add_raw ( const uint64_t *addend0, uint64_t *value0,
|
|||
"=r" ( discard_size ),
|
||||
"=r" ( discard_addend_i ),
|
||||
"=r" ( discard_value_i ),
|
||||
"=@cccs" ( carry ),
|
||||
"+m" ( *value )
|
||||
: "0" ( addend0 ), "1" ( value0 ),
|
||||
"2" ( size ) );
|
||||
return carry;
|
||||
: "0" ( addend0 ), "1" ( value0 ), "2" ( size )
|
||||
: "cc" );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -83,9 +79,8 @@ bigint_add_raw ( const uint64_t *addend0, uint64_t *value0,
|
|||
* @v subtrahend0 Element 0 of big integer to subtract
|
||||
* @v value0 Element 0 of big integer to be subtracted from
|
||||
* @v size Number of elements
|
||||
* @ret borrow Borrow out
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_subtract_raw ( const uint64_t *subtrahend0, uint64_t *value0,
|
||||
unsigned int size ) {
|
||||
bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
|
@ -95,7 +90,6 @@ bigint_subtract_raw ( const uint64_t *subtrahend0, uint64_t *value0,
|
|||
uint64_t discard_subtrahend_i;
|
||||
uint64_t discard_value_i;
|
||||
unsigned int discard_size;
|
||||
int borrow;
|
||||
|
||||
__asm__ __volatile__ ( "cmp xzr, xzr\n\t" /* set CF */
|
||||
"\n1:\n\t"
|
||||
|
@ -110,28 +104,25 @@ bigint_subtract_raw ( const uint64_t *subtrahend0, uint64_t *value0,
|
|||
"=r" ( discard_size ),
|
||||
"=r" ( discard_subtrahend_i ),
|
||||
"=r" ( discard_value_i ),
|
||||
"=@cccc" ( borrow ),
|
||||
"+m" ( *value )
|
||||
: "0" ( subtrahend0 ), "1" ( value0 ),
|
||||
"2" ( size ) );
|
||||
return borrow;
|
||||
"2" ( size )
|
||||
: "cc" );
|
||||
}
|
||||
|
||||
/**
|
||||
* Shift big integer left
|
||||
* Rotate big integer left
|
||||
*
|
||||
* @v value0 Element 0 of big integer
|
||||
* @v size Number of elements
|
||||
* @ret out Bit shifted out
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
bigint_shl_raw ( uint64_t *value0, unsigned int size ) {
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_rol_raw ( uint64_t *value0, unsigned int size ) {
|
||||
bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
( ( void * ) value0 );
|
||||
uint64_t *discard_value;
|
||||
uint64_t discard_value_i;
|
||||
unsigned int discard_size;
|
||||
int carry;
|
||||
|
||||
__asm__ __volatile__ ( "cmn xzr, xzr\n\t" /* clear CF */
|
||||
"\n1:\n\t"
|
||||
|
@ -143,43 +134,40 @@ bigint_shl_raw ( uint64_t *value0, unsigned int size ) {
|
|||
: "=r" ( discard_value ),
|
||||
"=r" ( discard_size ),
|
||||
"=r" ( discard_value_i ),
|
||||
"=@cccs" ( carry ),
|
||||
"+m" ( *value )
|
||||
: "0" ( value0 ), "1" ( size ) );
|
||||
return carry;
|
||||
: "0" ( value0 ), "1" ( size )
|
||||
: "cc" );
|
||||
}
|
||||
|
||||
/**
|
||||
* Shift big integer right
|
||||
* Rotate big integer right
|
||||
*
|
||||
* @v value0 Element 0 of big integer
|
||||
* @v size Number of elements
|
||||
* @ret out Bit shifted out
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
bigint_shr_raw ( uint64_t *value0, unsigned int size ) {
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_ror_raw ( uint64_t *value0, unsigned int size ) {
|
||||
bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
( ( void * ) value0 );
|
||||
uint64_t *discard_value;
|
||||
uint64_t discard_high;
|
||||
uint64_t discard_value_i;
|
||||
uint64_t discard_value_j;
|
||||
unsigned int discard_size;
|
||||
uint64_t low;
|
||||
|
||||
__asm__ __volatile__ ( "mov %2, #0\n\t"
|
||||
__asm__ __volatile__ ( "mov %3, #0\n\t"
|
||||
"\n1:\n\t"
|
||||
"sub %w1, %w1, #1\n\t"
|
||||
"ldr %3, [%0, %1, lsl #3]\n\t"
|
||||
"extr %2, %2, %3, #1\n\t"
|
||||
"str %2, [%0, %1, lsl #3]\n\t"
|
||||
"mov %2, %3\n\t"
|
||||
"ldr %2, [%0, %1, lsl #3]\n\t"
|
||||
"extr %3, %3, %2, #1\n\t"
|
||||
"str %3, [%0, %1, lsl #3]\n\t"
|
||||
"mov %3, %2\n\t"
|
||||
"cbnz %w1, 1b\n\t"
|
||||
: "=r" ( discard_value ),
|
||||
"=r" ( discard_size ),
|
||||
"=r" ( discard_high ),
|
||||
"=r" ( low ),
|
||||
"=r" ( discard_value_i ),
|
||||
"=r" ( discard_value_j ),
|
||||
"+m" ( *value )
|
||||
: "0" ( value0 ), "1" ( size ) );
|
||||
return ( low & 1 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -229,6 +217,25 @@ bigint_is_geq_raw ( const uint64_t *value0, const uint64_t *reference0,
|
|||
return ( value_i >= reference_i );
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if bit is set in big integer
|
||||
*
|
||||
* @v value0 Element 0 of big integer
|
||||
* @v size Number of elements
|
||||
* @v bit Bit to test
|
||||
* @ret is_set Bit is set
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
bigint_bit_is_set_raw ( const uint64_t *value0, unsigned int size,
|
||||
unsigned int bit ) {
|
||||
const bigint_t ( size ) __attribute__ (( may_alias )) *value =
|
||||
( ( const void * ) value0 );
|
||||
unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) );
|
||||
unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) );
|
||||
|
||||
return ( !! ( value->element[index] & ( 1UL << subindex ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Find highest bit set in big integer
|
||||
*
|
||||
|
@ -303,36 +310,8 @@ bigint_done_raw ( const uint64_t *value0, unsigned int size __unused,
|
|||
*(--out_byte) = *(value_byte++);
|
||||
}
|
||||
|
||||
/**
|
||||
* Multiply big integer elements
|
||||
*
|
||||
* @v multiplicand Multiplicand element
|
||||
* @v multiplier Multiplier element
|
||||
* @v result Result element
|
||||
* @v carry Carry element
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) void
|
||||
bigint_multiply_one ( const uint64_t multiplicand, const uint64_t multiplier,
|
||||
uint64_t *result, uint64_t *carry ) {
|
||||
uint64_t discard_low;
|
||||
uint64_t discard_high;
|
||||
|
||||
__asm__ __volatile__ ( /* Perform multiplication */
|
||||
"mul %0, %4, %5\n\t"
|
||||
"umulh %1, %4, %5\n\t"
|
||||
/* Accumulate result */
|
||||
"adds %2, %2, %0\n\t"
|
||||
"adc %1, %1, xzr\n\t"
|
||||
/* Accumulate carry (cannot overflow) */
|
||||
"adds %2, %2, %3\n\t"
|
||||
"adc %3, %1, xzr\n\t"
|
||||
: "=&r" ( discard_low ),
|
||||
"=r" ( discard_high ),
|
||||
"+r" ( *result ),
|
||||
"+r" ( *carry )
|
||||
: "r" ( multiplicand ),
|
||||
"r" ( multiplier )
|
||||
: "cc" );
|
||||
}
|
||||
extern void bigint_multiply_raw ( const uint64_t *multiplicand0,
|
||||
const uint64_t *multiplier0,
|
||||
uint64_t *value0, unsigned int size );
|
||||
|
||||
#endif /* _BITS_BIGINT_H */
|
||||
|
|
|
@ -8,9 +8,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|||
|
||||
#ifndef ASSEMBLY
|
||||
|
||||
/** Unprefixed constant operand modifier */
|
||||
#define ASM_NO_PREFIX "c"
|
||||
|
||||
#define __asmcall
|
||||
#define __libgcc
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|||
*
|
||||
* @ret timestamp Timestamp
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) unsigned long
|
||||
static inline __attribute__ (( always_inline )) uint64_t
|
||||
profile_timestamp ( void ) {
|
||||
uint64_t cycles;
|
||||
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Copyright (C) 2015 Michael Brown <mbrown@fensystems.co.uk>.
|
||||
*
|
||||
* 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 2 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, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*
|
||||
* You can also choose to distribute this program under the terms of
|
||||
* the Unmodified Binary Distribution Licence (as given in the file
|
||||
* COPYING.UBDL), provided that you have satisfied its requirements.
|
||||
*/
|
||||
|
||||
#ifndef _DHCP_ARCH_H
|
||||
#define _DHCP_ARCH_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Architecture-specific DHCP options
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <ipxe/dhcp.h>
|
||||
|
||||
#define DHCP_ARCH_CLIENT_ARCHITECTURE DHCP_CLIENT_ARCHITECTURE_ARM64
|
||||
|
||||
#define DHCP_ARCH_CLIENT_NDI 1 /* UNDI */ , 3, 10 /* v3.10 */
|
||||
|
||||
#endif
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue