mirror of
				https://gitlab.com/qemu-project/ipxe.git
				synced 2025-11-03 07:59:06 +08:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			d88eb0a193
			...
			netstate
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f2c4623735 | 
							
								
								
									
										14
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@ -12,7 +12,7 @@ jobs:
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo chown $(id -un) /var/cache/apt/archives
 | 
			
		||||
      - name: Cache packages
 | 
			
		||||
        uses: actions/cache@v4
 | 
			
		||||
        uses: actions/cache@v3
 | 
			
		||||
        with:
 | 
			
		||||
          path: /var/cache/apt/archives/*.deb
 | 
			
		||||
          key: apt-cache-${{ github.run_id }}-${{ github.run_attempt }}
 | 
			
		||||
@ -32,14 +32,14 @@ jobs:
 | 
			
		||||
    needs: cache
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out code
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
      - name: Cache permissions
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo chown $(id -un) /var/cache/apt/archives
 | 
			
		||||
      - name: Cache packages
 | 
			
		||||
        uses: actions/cache/restore@v4
 | 
			
		||||
        uses: actions/cache/restore@v3
 | 
			
		||||
        with:
 | 
			
		||||
          path: /var/cache/apt/archives/*.deb
 | 
			
		||||
          key: apt-cache-${{ github.run_id }}-${{ github.run_attempt }}
 | 
			
		||||
@ -68,14 +68,14 @@ jobs:
 | 
			
		||||
    needs: cache
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out code
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
      - name: Cache permissions
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo chown $(id -un) /var/cache/apt/archives
 | 
			
		||||
      - name: Cache packages
 | 
			
		||||
        uses: actions/cache/restore@v4
 | 
			
		||||
        uses: actions/cache/restore@v3
 | 
			
		||||
        with:
 | 
			
		||||
          path: /var/cache/apt/archives/*.deb
 | 
			
		||||
          key: apt-cache-${{ github.run_id }}-${{ github.run_attempt }}
 | 
			
		||||
@ -97,14 +97,14 @@ jobs:
 | 
			
		||||
    needs: cache
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out code
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
      - name: Cache permissions
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo chown $(id -un) /var/cache/apt/archives
 | 
			
		||||
      - name: Cache packages
 | 
			
		||||
        uses: actions/cache/restore@v4
 | 
			
		||||
        uses: actions/cache/restore@v3
 | 
			
		||||
        with:
 | 
			
		||||
          path: /var/cache/apt/archives/*.deb
 | 
			
		||||
          key: apt-cache-${{ github.run_id }}-${{ github.run_attempt }}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/coverity.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/coverity.yml
									
									
									
									
										vendored
									
									
								
							@ -11,7 +11,7 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-22.04
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out code
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
      - name: Download Coverity Scan
 | 
			
		||||
        run: |
 | 
			
		||||
          curl --form token=${{ secrets.COVERITY_SCAN_TOKEN }} \
 | 
			
		||||
 | 
			
		||||
@ -22,12 +22,11 @@ def detect_architecture(image):
 | 
			
		||||
    return 'x86_64'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def create_snapshot(region, description, image, tags):
 | 
			
		||||
def create_snapshot(region, description, image):
 | 
			
		||||
    """Create an EBS snapshot"""
 | 
			
		||||
    client = boto3.client('ebs', region_name=region)
 | 
			
		||||
    snapshot = client.start_snapshot(VolumeSize=1,
 | 
			
		||||
                                     Description=description,
 | 
			
		||||
                                     Tags=tags)
 | 
			
		||||
                                     Description=description)
 | 
			
		||||
    snapshot_id = snapshot['SnapshotId']
 | 
			
		||||
    with open(image, 'rb') as fh:
 | 
			
		||||
        for block in count():
 | 
			
		||||
@ -47,42 +46,13 @@ def create_snapshot(region, description, image, tags):
 | 
			
		||||
    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):
 | 
			
		||||
def import_image(region, name, architecture, image, public):
 | 
			
		||||
    """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)
 | 
			
		||||
                                  image=image)
 | 
			
		||||
    client.get_waiter('snapshot_completed').wait(SnapshotIds=[snapshot_id])
 | 
			
		||||
    image = client.register_image(Architecture=architecture,
 | 
			
		||||
                                  BlockDeviceMappings=[{
 | 
			
		||||
@ -94,10 +64,6 @@ def import_image(region, name, family, architecture, image, public, overwrite,
 | 
			
		||||
                                  }],
 | 
			
		||||
                                  EnaSupport=True,
 | 
			
		||||
                                  Name=description,
 | 
			
		||||
                                  TagSpecifications=[{
 | 
			
		||||
                                      'ResourceType': 'image',
 | 
			
		||||
                                      'Tags': tags,
 | 
			
		||||
                                  }],
 | 
			
		||||
                                  RootDeviceName='/dev/sda1',
 | 
			
		||||
                                  SriovNetSupport='simple',
 | 
			
		||||
                                  VirtualizationType='hvm')
 | 
			
		||||
@ -120,14 +86,8 @@ def launch_link(region, image_id):
 | 
			
		||||
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',
 | 
			
		||||
@ -138,13 +98,9 @@ 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'))
 | 
			
		||||
    args.name = 'iPXE (%s)' % date.today().strftime('%Y-%m-%d')
 | 
			
		||||
 | 
			
		||||
# Use all regions if none specified
 | 
			
		||||
if not args.region:
 | 
			
		||||
@ -157,12 +113,9 @@ 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)
 | 
			
		||||
                               public=args.public): (region, image)
 | 
			
		||||
               for region, image in imports}
 | 
			
		||||
    results = {futures[future]: future.result()
 | 
			
		||||
               for future in as_completed(futures)}
 | 
			
		||||
 | 
			
		||||
@ -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,80 +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():
 | 
			
		||||
    if decoder.eof():
 | 
			
		||||
        encoder.leave()
 | 
			
		||||
        decoder.leave()
 | 
			
		||||
        stack.pop()
 | 
			
		||||
    else:
 | 
			
		||||
        tag = decoder.peek()
 | 
			
		||||
        if 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)
 | 
			
		||||
							
								
								
									
										62
									
								
								contrib/rom-o-matic/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								contrib/rom-o-matic/README
									
									
									
									
									
										Normal file
									
								
							@ -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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										62
									
								
								contrib/rom-o-matic/bottom.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								contrib/rom-o-matic/bottom.php
									
									
									
									
									
										Normal file
									
								
							@ -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>
 | 
			
		||||
							
								
								
									
										311
									
								
								contrib/rom-o-matic/build.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										311
									
								
								contrib/rom-o-matic/build.php
									
									
									
									
									
										Normal file
									
								
							@ -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:
 | 
			
		||||
 | 
			
		||||
?>
 | 
			
		||||
							
								
								
									
										69
									
								
								contrib/rom-o-matic/customize-flags.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								contrib/rom-o-matic/customize-flags.php
									
									
									
									
									
										Normal file
									
								
							@ -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:
 | 
			
		||||
?>
 | 
			
		||||
							
								
								
									
										63
									
								
								contrib/rom-o-matic/directions.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								contrib/rom-o-matic/directions.php
									
									
									
									
									
										Normal file
									
								
							@ -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>
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/AUTOBOOT_CMD.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/AUTOBOOT_CMD.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Automatic booting
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/BANNER_TIMEOUT.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/BANNER_TIMEOUT.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Tenths of a second for which the shell banner should appear
 | 
			
		||||
							
								
								
									
										3
									
								
								contrib/rom-o-matic/doc/COMCONSOLE.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								contrib/rom-o-matic/doc/COMCONSOLE.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
Serial Console I/O port address.  Common addresses are:<br>
 | 
			
		||||
COM1 =>	0x3f8, COM2 => 0x2f8, COM3 => 0x3e8, COM4 => 0x2e8
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/COMDATA.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/COMDATA.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Serial Console Data bits
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/COMPARITY.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/COMPARITY.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Serial Console Parity: 0=None, 1=Odd, 2=Even
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/COMPRESERVE.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/COMPRESERVE.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Keep settings from a previous user of the serial port
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/COMSPEED.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/COMSPEED.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Serial Console Baud rate
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/COMSTOP.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/COMSTOP.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Serial Console Stop bits
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/CONFIG_CMD.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/CONFIG_CMD.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Option configuration console
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/CONSOLE_PC_BIOS.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/CONSOLE_PC_BIOS.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Enable Default BIOS console
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/CONSOLE_SERIAL.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/CONSOLE_SERIAL.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Enable Serial port console
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/CRYPTO_80211_WEP.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/CRYPTO_80211_WEP.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Wireless WEP encryption support
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/CRYPTO_80211_WPA.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/CRYPTO_80211_WPA.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Wireless WPA encryption support
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/CRYPTO_80211_WPA2.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/CRYPTO_80211_WPA2.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Wireless WPA2 encryption support
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/DHCP_CMD.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/DHCP_CMD.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
DHCP management commands
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/DNS_RESOLVER.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/DNS_RESOLVER.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
DNS resolver
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/DOWNLOAD_PROTO_FTP.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/DOWNLOAD_PROTO_FTP.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
File Transfer Protocol
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/DOWNLOAD_PROTO_HTTP.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/DOWNLOAD_PROTO_HTTP.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Hypertext Transfer Protocol
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/DOWNLOAD_PROTO_TFTP.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/DOWNLOAD_PROTO_TFTP.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Trivial File Transfer Protocol
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/IFMGMT_CMD.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/IFMGMT_CMD.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Interface management commands
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_BZIMAGE.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_BZIMAGE.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Linux bzImage image support
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_CMD.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_CMD.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Image management commands
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_ELF.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_ELF.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
ELF image support
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_MULTIBOOT.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_MULTIBOOT.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
MultiBoot image support
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_NBI.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_NBI.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
NBI image support
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_PXE.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_PXE.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
PXE image support
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_SCRIPT.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/IMAGE_SCRIPT.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
iPXE script image support
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/IWMGMT_CMD.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/IWMGMT_CMD.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Wireless interface management commands
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/NMB_RESOLVER.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/NMB_RESOLVER.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
NMB resolver
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/NVO_CMD.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/NVO_CMD.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Non-volatile option storage commands
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/ROUTE_CMD.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/ROUTE_CMD.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Routing table management commands
 | 
			
		||||
							
								
								
									
										1
									
								
								contrib/rom-o-matic/doc/SANBOOT_CMD.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/rom-o-matic/doc/SANBOOT_CMD.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
SAN boot commands
 | 
			
		||||
							
								
								
									
										531
									
								
								contrib/rom-o-matic/flag-table.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										531
									
								
								contrib/rom-o-matic/flag-table.php
									
									
									
									
									
										Normal file
									
								
							@ -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:
 | 
			
		||||
 | 
			
		||||
?>
 | 
			
		||||
							
								
								
									
										51
									
								
								contrib/rom-o-matic/globals.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								contrib/rom-o-matic/globals.php
									
									
									
									
									
										Normal file
									
								
							@ -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:
 | 
			
		||||
 | 
			
		||||
?>
 | 
			
		||||
							
								
								
									
										47
									
								
								contrib/rom-o-matic/index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								contrib/rom-o-matic/index.php
									
									
									
									
									
										Normal file
									
								
							@ -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>
 | 
			
		||||
							
								
								
									
										684
									
								
								contrib/rom-o-matic/utils.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										684
									
								
								contrib/rom-o-matic/utils.php
									
									
									
									
									
										Normal file
									
								
							@ -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:
 | 
			
		||||
 | 
			
		||||
?>
 | 
			
		||||
							
								
								
									
										2
									
								
								src/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,4 +1,4 @@
 | 
			
		||||
.toolcheck
 | 
			
		||||
.echocheck
 | 
			
		||||
TAGS*
 | 
			
		||||
bin-*
 | 
			
		||||
bin*
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								src/Makefile
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								src/Makefile
									
									
									
									
									
								
							@ -26,16 +26,16 @@ 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
 | 
			
		||||
@ -77,7 +77,6 @@ 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
 | 
			
		||||
 | 
			
		||||
@ -23,9 +23,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
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
@ -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,56 @@ 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 __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 if $(eval ...) is available to use
 | 
			
		||||
@ -94,6 +130,74 @@ 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
 | 
			
		||||
 | 
			
		||||
# 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 +284,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 +333,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,12 +345,8 @@ 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)
 | 
			
		||||
DEFAULT_PLATFORM := pcbios
 | 
			
		||||
PLATFORM	:= $(firstword $(BIN_PLATFORM) $(DEFAULT_PLATFORM))
 | 
			
		||||
CFLAGS		+= -DPLATFORM=$(PLATFORM) -DPLATFORM_$(PLATFORM)
 | 
			
		||||
platform :
 | 
			
		||||
	@$(ECHO) $(PLATFORM)
 | 
			
		||||
@ -263,129 +358,19 @@ 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
 | 
			
		||||
 | 
			
		||||
# Include architecture-specific include path
 | 
			
		||||
ifdef ARCH
 | 
			
		||||
INCDIRS		+= arch/$(ARCH)/include
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
###############################################################################
 | 
			
		||||
#
 | 
			
		||||
# Especially ugly workarounds
 | 
			
		||||
 | 
			
		||||
@ -29,9 +29,6 @@ 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
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
@ -3,9 +3,9 @@
 | 
			
		||||
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
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/arm/include/bits/acpi.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/arm/include/bits/acpi.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/arm/include/bits/hyperv.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/arm/include/bits/hyperv.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/arm/include/bits/iomap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/arm/include/bits/iomap.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/arm/include/bits/pci_io.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/arm/include/bits/pci_io.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
#ifndef _BITS_PCI_IO_H
 | 
			
		||||
#define _BITS_PCI_IO_H
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * ARM PCI I/O API implementations
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 | 
			
		||||
 | 
			
		||||
#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 */
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/arm/include/bits/sanboot.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/arm/include/bits/sanboot.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/arm/include/bits/smbios.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/arm/include/bits/smbios.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/arm/include/bits/time.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/arm/include/bits/time.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/arm/include/bits/uaccess.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/arm/include/bits/uaccess.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/arm/include/bits/uart.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/arm/include/bits/uart.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
							
								
								
									
										18
									
								
								src/arch/arm/include/ipxe/efi/efiarm_nap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/arch/arm/include/ipxe/efi/efiarm_nap.h
									
									
									
									
									
										Normal file
									
								
							@ -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) 2024 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,34 +23,31 @@
 | 
			
		||||
 | 
			
		||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 | 
			
		||||
 | 
			
		||||
#include <ipxe/nap.h>
 | 
			
		||||
#include <ipxe/efi/efi.h>
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * MNP driver
 | 
			
		||||
 * iPXE CPU sleeping API for EFI
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <ipxe/efi/efi.h>
 | 
			
		||||
#include <ipxe/efi/efi_driver.h>
 | 
			
		||||
#include <ipxe/efi/mnpnet.h>
 | 
			
		||||
#include "snpnet.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check to see if driver supports a device
 | 
			
		||||
 * Sleep until next interrupt
 | 
			
		||||
 *
 | 
			
		||||
 * @v device		EFI device handle
 | 
			
		||||
 * @ret rc		Return status code
 | 
			
		||||
 */
 | 
			
		||||
static int mnp_supported ( EFI_HANDLE device ) {
 | 
			
		||||
	EFI_GUID *binding = &efi_managed_network_service_binding_protocol_guid;
 | 
			
		||||
 | 
			
		||||
	return snpnet_supported ( device, binding );
 | 
			
		||||
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" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** EFI MNP driver */
 | 
			
		||||
struct efi_driver mnp_driver __efi_driver ( EFI_DRIVER_NORMAL ) = {
 | 
			
		||||
	.name = "MNP",
 | 
			
		||||
	.supported = mnp_supported,
 | 
			
		||||
	.start = mnpnet_start,
 | 
			
		||||
	.stop = mnpnet_stop,
 | 
			
		||||
};
 | 
			
		||||
PROVIDE_NAP ( efiarm, cpu_nap, efiarm_cpu_nap );
 | 
			
		||||
@ -8,6 +8,10 @@ CFLAGS		+= -mfloat-abi=soft
 | 
			
		||||
#
 | 
			
		||||
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
 | 
			
		||||
							
								
								
									
										102
									
								
								src/arch/arm32/core/arm32_bigint.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								src/arch/arm32/core/arm32_bigint.c
									
									
									
									
									
										Normal file
									
								
							@ -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
 | 
			
		||||
@ -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,21 +105,20 @@ 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
 | 
			
		||||
 */
 | 
			
		||||
static inline __attribute__ (( always_inline )) void
 | 
			
		||||
bigint_shl_raw ( uint32_t *value0, unsigned int size ) {
 | 
			
		||||
bigint_rol_raw ( uint32_t *value0, unsigned int size ) {
 | 
			
		||||
	bigint_t ( size ) __attribute__ (( may_alias )) *value =
 | 
			
		||||
		( ( void * ) value0 );
 | 
			
		||||
	uint32_t *discard_value;
 | 
			
		||||
@ -148,13 +141,13 @@ bigint_shl_raw ( uint32_t *value0, unsigned int size ) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Shift big integer right
 | 
			
		||||
 * Rotate big integer right
 | 
			
		||||
 *
 | 
			
		||||
 * @v value0		Element 0 of big integer
 | 
			
		||||
 * @v size		Number of elements
 | 
			
		||||
 */
 | 
			
		||||
static inline __attribute__ (( always_inline )) void
 | 
			
		||||
bigint_shr_raw ( uint32_t *value0, unsigned int size ) {
 | 
			
		||||
bigint_ror_raw ( uint32_t *value0, unsigned int size ) {
 | 
			
		||||
	bigint_t ( size ) __attribute__ (( may_alias )) *value =
 | 
			
		||||
		( ( void * ) value0 );
 | 
			
		||||
	uint32_t *discard_value;
 | 
			
		||||
@ -223,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
 | 
			
		||||
 *
 | 
			
		||||
@ -297,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 */
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								src/arch/arm32/include/bits/tcpip.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/arch/arm32/include/bits/tcpip.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
@ -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,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,7 @@
 | 
			
		||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 | 
			
		||||
 | 
			
		||||
	.section ".note.GNU-stack", "", %progbits
 | 
			
		||||
	.text
 | 
			
		||||
	.thumb
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										103
									
								
								src/arch/arm64/core/arm64_bigint.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								src/arch/arm64/core/arm64_bigint.c
									
									
									
									
									
										Normal file
									
								
							@ -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" );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -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,21 +104,20 @@ 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
 | 
			
		||||
 */
 | 
			
		||||
static inline __attribute__ (( always_inline )) void
 | 
			
		||||
bigint_shl_raw ( uint64_t *value0, unsigned int size ) {
 | 
			
		||||
bigint_rol_raw ( uint64_t *value0, unsigned int size ) {
 | 
			
		||||
	bigint_t ( size ) __attribute__ (( may_alias )) *value =
 | 
			
		||||
		( ( void * ) value0 );
 | 
			
		||||
	uint64_t *discard_value;
 | 
			
		||||
@ -147,13 +140,13 @@ bigint_shl_raw ( uint64_t *value0, unsigned int size ) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Shift big integer right
 | 
			
		||||
 * Rotate big integer right
 | 
			
		||||
 *
 | 
			
		||||
 * @v value0		Element 0 of big integer
 | 
			
		||||
 * @v size		Number of elements
 | 
			
		||||
 */
 | 
			
		||||
static inline __attribute__ (( always_inline )) void
 | 
			
		||||
bigint_shr_raw ( uint64_t *value0, unsigned int size ) {
 | 
			
		||||
bigint_ror_raw ( uint64_t *value0, unsigned int size ) {
 | 
			
		||||
	bigint_t ( size ) __attribute__ (( may_alias )) *value =
 | 
			
		||||
		( ( void * ) value0 );
 | 
			
		||||
	uint64_t *discard_value;
 | 
			
		||||
@ -224,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
 | 
			
		||||
 *
 | 
			
		||||
@ -298,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 */
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										45
									
								
								src/arch/arm64/include/gdbmach.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/arch/arm64/include/gdbmach.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,45 @@
 | 
			
		||||
#ifndef GDBMACH_H
 | 
			
		||||
#define GDBMACH_H
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * GDB architecture specifics
 | 
			
		||||
 *
 | 
			
		||||
 * This file declares functions for manipulating the machine state and
 | 
			
		||||
 * debugging context.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
typedef unsigned long gdbreg_t;
 | 
			
		||||
 | 
			
		||||
/* Register snapshot */
 | 
			
		||||
enum {
 | 
			
		||||
	/* Not yet implemented */
 | 
			
		||||
	GDBMACH_NREGS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define GDBMACH_SIZEOF_REGS ( GDBMACH_NREGS * sizeof ( gdbreg_t ) )
 | 
			
		||||
 | 
			
		||||
static inline void gdbmach_set_pc ( gdbreg_t *regs, gdbreg_t pc ) {
 | 
			
		||||
	/* Not yet implemented */
 | 
			
		||||
	( void ) regs;
 | 
			
		||||
	( void ) pc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void gdbmach_set_single_step ( gdbreg_t *regs, int step ) {
 | 
			
		||||
	/* Not yet implemented */
 | 
			
		||||
	( void ) regs;
 | 
			
		||||
	( void ) step;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void gdbmach_breakpoint ( void ) {
 | 
			
		||||
	/* Not yet implemented */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extern int gdbmach_set_breakpoint ( int type, unsigned long addr, size_t len,
 | 
			
		||||
				    int enable );
 | 
			
		||||
extern void gdbmach_init ( void );
 | 
			
		||||
 | 
			
		||||
#endif /* GDBMACH_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 );
 | 
			
		||||
 | 
			
		||||
@ -35,4 +35,10 @@ typedef struct {
 | 
			
		||||
	uint64_t sp;
 | 
			
		||||
} 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 */
 | 
			
		||||
@ -8,6 +8,10 @@ ELF2EFI		= $(ELF2EFI32)
 | 
			
		||||
#
 | 
			
		||||
CFLAGS		+= -malign-double
 | 
			
		||||
 | 
			
		||||
# Specify EFI boot file
 | 
			
		||||
#
 | 
			
		||||
EFI_BOOT_FILE	= bootia32.efi
 | 
			
		||||
 | 
			
		||||
# Include generic EFI Makefile
 | 
			
		||||
#
 | 
			
		||||
MAKEDEPS	+= arch/x86/Makefile.efi
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,8 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 | 
			
		||||
 | 
			
		||||
	.section ".note.GNU-stack", "", @progbits
 | 
			
		||||
	.text
 | 
			
		||||
	.code32
 | 
			
		||||
	.arch i386
 | 
			
		||||
	.code32
 | 
			
		||||
 | 
			
		||||
	/* Must match jmp_buf structure layout */
 | 
			
		||||
	.struct	0
 | 
			
		||||
 | 
			
		||||
@ -16,12 +16,12 @@ 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 ) {
 | 
			
		||||
	uint32_t tsc;
 | 
			
		||||
	uint64_t tsc;
 | 
			
		||||
 | 
			
		||||
	/* Read timestamp counter */
 | 
			
		||||
	__asm__ __volatile__ ( "rdtsc" : "=a" ( tsc ) : : "edx" );
 | 
			
		||||
	__asm__ __volatile__ ( "rdtsc" : "=A" ( tsc ) );
 | 
			
		||||
	return tsc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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 );
 | 
			
		||||
 | 
			
		||||
@ -21,4 +21,10 @@ typedef struct {
 | 
			
		||||
	uint32_t ebp;
 | 
			
		||||
} 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,5 +1,4 @@
 | 
			
		||||
	.section ".note.GNU-stack", "", @progbits
 | 
			
		||||
	.code32
 | 
			
		||||
	.arch i386
 | 
			
		||||
 | 
			
		||||
	.section ".data", "aw", @progbits
 | 
			
		||||
 | 
			
		||||
@ -18,9 +18,6 @@ endif
 | 
			
		||||
# EFI requires -fshort-wchar, and nothing else currently uses wchar_t
 | 
			
		||||
CFLAGS		+= -fshort-wchar
 | 
			
		||||
 | 
			
		||||
# Include LoongArch64-specific headers
 | 
			
		||||
INCDIRS		:= arch/$(ARCH)/include $(INCDIRS)
 | 
			
		||||
 | 
			
		||||
# LoongArch64-specific directories containing source files
 | 
			
		||||
SRCDIRS		+= arch/loong64/core
 | 
			
		||||
SRCDIRS		+= arch/loong64/interface/efi
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,10 @@
 | 
			
		||||
#
 | 
			
		||||
ELF2EFI		= $(ELF2EFI64)
 | 
			
		||||
 | 
			
		||||
# Specify EFI boot file
 | 
			
		||||
#
 | 
			
		||||
EFI_BOOT_FILE	= bootloongarch64.efi
 | 
			
		||||
 | 
			
		||||
# Include generic EFI Makefile
 | 
			
		||||
#
 | 
			
		||||
MAKEDEPS	+= Makefile.efi
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										120
									
								
								src/arch/loong64/core/loong64_bigint.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								src/arch/loong64/core/loong64_bigint.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,120 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
 | 
			
		||||
 * Copyright (c) 2023, Xiaotian Wu <wuxiaotian@loongson.cn>
 | 
			
		||||
 *
 | 
			
		||||
 * 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.d   %1, %6, %7\n\t"
 | 
			
		||||
					       "mulh.du %2, %6, %7\n\t"
 | 
			
		||||
 | 
			
		||||
					       "ld.d    %3, %0, 0\n\t"
 | 
			
		||||
					       "ld.d    %4, %0, 8\n\t"
 | 
			
		||||
 | 
			
		||||
					       "add.d   %3, %3, %1\n\t"
 | 
			
		||||
					       "sltu    $t0, %3, %1\n\t"
 | 
			
		||||
 | 
			
		||||
					       "add.d   %4, %4, %2\n\t"
 | 
			
		||||
					       "sltu    $t1, %4, %2\n\t"
 | 
			
		||||
 | 
			
		||||
					       "add.d   %4, %4, $t0\n\t"
 | 
			
		||||
					       "sltu    $t0, %4, $t0\n\t"
 | 
			
		||||
					       "or      $t0, $t0, $t1\n\t"
 | 
			
		||||
 | 
			
		||||
					       "st.d    %3,  %0, 0\n\t"
 | 
			
		||||
					       "st.d    %4,  %0, 8\n\t"
 | 
			
		||||
 | 
			
		||||
					       "addi.d  %0,  %0, 16\n\t"
 | 
			
		||||
					       "beqz    $t0, 2f\n"
 | 
			
		||||
					       "1:\n\t"
 | 
			
		||||
					       "ld.d    %3,  %0, 0\n\t"
 | 
			
		||||
					       "add.d   %3,  %3, $t0\n\t"
 | 
			
		||||
					       "sltu    $t0, %3, $t0\n\t"
 | 
			
		||||
					       "st.d    %3,  %0, 0\n\t"
 | 
			
		||||
					       "addi.d  %0, %0, 8\n\t"
 | 
			
		||||
					       "bnez    $t0, 1b\n"
 | 
			
		||||
					       "2:"
 | 
			
		||||
					       : "+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 )
 | 
			
		||||
					       : "t0", "t1" );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/loong64/include/bits/acpi.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/loong64/include/bits/acpi.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
#ifndef _BITS_ACPI_H
 | 
			
		||||
#define _BITS_ACPI_H
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * LoongArch64-specific ACPI API implementations
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 | 
			
		||||
 | 
			
		||||
#endif /* _BITS_ACPI_H */
 | 
			
		||||
@ -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 =
 | 
			
		||||
@ -54,38 +53,34 @@ bigint_add_raw ( const uint64_t *addend0, uint64_t *value0,
 | 
			
		||||
	uint64_t *discard_value;
 | 
			
		||||
	uint64_t discard_addend_i;
 | 
			
		||||
	uint64_t discard_value_i;
 | 
			
		||||
	uint64_t discard_temp;
 | 
			
		||||
	unsigned int discard_size;
 | 
			
		||||
	uint64_t carry;
 | 
			
		||||
 | 
			
		||||
	__asm__ __volatile__ ( "\n1:\n\t"
 | 
			
		||||
			       /* Load addend[i] and value[i] */
 | 
			
		||||
			       "ld.d %3, %0, 0\n\t"
 | 
			
		||||
			       "ld.d %4, %1, 0\n\t"
 | 
			
		||||
			       /* Add carry flag and addend */
 | 
			
		||||
			       "add.d %4, %4, %6\n\t"
 | 
			
		||||
			       "sltu %5, %4, %6\n\t"
 | 
			
		||||
			       "add.d %4, %4, %3\n\t"
 | 
			
		||||
			       "sltu %6, %4, %3\n\t"
 | 
			
		||||
			       "or %6, %5, %6\n\t"
 | 
			
		||||
			       /* Store value[i] */
 | 
			
		||||
			       "st.d %4, %1, 0\n\t"
 | 
			
		||||
			       /* Loop */
 | 
			
		||||
	__asm__ __volatile__ ( "move   $t0, $zero\n"
 | 
			
		||||
			       "1:\n\t"
 | 
			
		||||
			       "ld.d   %3, %0, 0\n\t"
 | 
			
		||||
			       "addi.d %0, %0, 8\n\t"
 | 
			
		||||
			       "ld.d   %4, %1, 0\n\t"
 | 
			
		||||
 | 
			
		||||
			       "add.d  %4, %4, $t0\n\t"
 | 
			
		||||
			       "sltu   $t0, %4, $t0\n\t"
 | 
			
		||||
 | 
			
		||||
			       "add.d  %4, %4, %3\n\t"
 | 
			
		||||
			       "sltu   $t1, %4, %3\n\t"
 | 
			
		||||
 | 
			
		||||
			       "or     $t0, $t0, $t1\n\t"
 | 
			
		||||
			       "st.d   %4,  %1, 0\n\t"
 | 
			
		||||
			       "addi.d %1, %1, 8\n\t"
 | 
			
		||||
			       "addi.w %2, %2, -1\n\t"
 | 
			
		||||
			       "bnez %2, 1b\n\t"
 | 
			
		||||
			       "bnez   %2, 1b"
 | 
			
		||||
			       : "=r" ( discard_addend ),
 | 
			
		||||
				 "=r" ( discard_value ),
 | 
			
		||||
				 "=r" ( discard_size ),
 | 
			
		||||
				 "=r" ( discard_addend_i ),
 | 
			
		||||
				 "=r" ( discard_value_i ),
 | 
			
		||||
				 "=r" ( discard_temp ),
 | 
			
		||||
				 "=r" ( carry ),
 | 
			
		||||
				 "+m" ( *value )
 | 
			
		||||
			       : "0" ( addend0 ), "1" ( value0 ),
 | 
			
		||||
				 "2" ( size ), "6" ( 0 ) );
 | 
			
		||||
	return carry;
 | 
			
		||||
			       : "0" ( addend0 ),
 | 
			
		||||
				 "1" ( value0 ),
 | 
			
		||||
				 "2" ( size )
 | 
			
		||||
			       : "t0", "t1" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -94,131 +89,104 @@ 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 =
 | 
			
		||||
		( ( void * ) value0 );
 | 
			
		||||
	uint64_t *discard_subtrahend;
 | 
			
		||||
	uint64_t *discard_value;
 | 
			
		||||
	uint64_t discard_subtrahend_i;
 | 
			
		||||
	uint64_t discard_value_i;
 | 
			
		||||
	uint64_t discard_temp;
 | 
			
		||||
	unsigned int discard_size;
 | 
			
		||||
	uint64_t borrow;
 | 
			
		||||
	unsigned int flag = 0;
 | 
			
		||||
 | 
			
		||||
	__asm__ __volatile__ ( "\n1:\n\t"
 | 
			
		||||
			       /* Load subtrahend[i] and value[i] */
 | 
			
		||||
			       "ld.d %3, %0, 0\n\t"
 | 
			
		||||
			       "ld.d %4, %1, 0\n\t"
 | 
			
		||||
			       /* Subtract carry flag and subtrahend */
 | 
			
		||||
			       "sltu %5, %4, %6\n\t"
 | 
			
		||||
			       "sub.d %4, %4, %6\n\t"
 | 
			
		||||
			       "sltu %6, %4, %3\n\t"
 | 
			
		||||
			       "sub.d %4, %4, %3\n\t"
 | 
			
		||||
			       "or %6, %5, %6\n\t"
 | 
			
		||||
			       /* Store value[i] */
 | 
			
		||||
			       "st.d %4, %1, 0\n\t"
 | 
			
		||||
			       /* Loop */
 | 
			
		||||
			       "addi.d %0, %0, 8\n\t"
 | 
			
		||||
			       "addi.d %1, %1, 8\n\t"
 | 
			
		||||
			       "addi.w %2, %2, -1\n\t"
 | 
			
		||||
			       "bnez %2, 1b\n\t"
 | 
			
		||||
			       : "=r" ( discard_subtrahend ),
 | 
			
		||||
				 "=r" ( discard_value ),
 | 
			
		||||
				 "=r" ( discard_size ),
 | 
			
		||||
				 "=r" ( discard_subtrahend_i ),
 | 
			
		||||
				 "=r" ( discard_value_i ),
 | 
			
		||||
				 "=r" ( discard_temp ),
 | 
			
		||||
				 "=r" ( borrow ),
 | 
			
		||||
				 "+m" ( *value )
 | 
			
		||||
			       : "0" ( subtrahend0 ), "1" ( value0 ),
 | 
			
		||||
				 "2" ( size ), "6" ( 0 ) );
 | 
			
		||||
	return borrow;
 | 
			
		||||
	discard_subtrahend = (uint64_t*) subtrahend0;
 | 
			
		||||
	discard_value = value0;
 | 
			
		||||
	discard_size = size;
 | 
			
		||||
 | 
			
		||||
	do {
 | 
			
		||||
		discard_subtrahend_i = *discard_subtrahend;
 | 
			
		||||
		discard_subtrahend++;
 | 
			
		||||
		discard_value_i = *discard_value;
 | 
			
		||||
 | 
			
		||||
		discard_value_i = discard_value_i - discard_subtrahend_i - flag;
 | 
			
		||||
 | 
			
		||||
		if ( *discard_value < (discard_subtrahend_i + flag)) {
 | 
			
		||||
			flag = 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			flag = 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		*discard_value = discard_value_i;
 | 
			
		||||
 | 
			
		||||
		discard_value++;
 | 
			
		||||
		discard_size -= 1;
 | 
			
		||||
	} while (discard_size != 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Shift big integer left
 | 
			
		||||
 * Rotate big integer left
 | 
			
		||||
 *
 | 
			
		||||
 * @v value0		Element 0 of big integer
 | 
			
		||||
 * @v size		Number of elements
 | 
			
		||||
 */
 | 
			
		||||
static inline __attribute__ (( always_inline )) void
 | 
			
		||||
bigint_shl_raw ( uint64_t *value0, unsigned int size ) {
 | 
			
		||||
	bigint_t ( size ) __attribute__ (( may_alias )) *value =
 | 
			
		||||
		( ( void * ) value0 );
 | 
			
		||||
bigint_rol_raw ( uint64_t *value0, unsigned int size ) {
 | 
			
		||||
	uint64_t *discard_value;
 | 
			
		||||
	uint64_t discard_value_i;
 | 
			
		||||
	uint64_t discard_carry;
 | 
			
		||||
	uint64_t discard_temp;
 | 
			
		||||
	unsigned int discard_size;
 | 
			
		||||
	uint64_t current_value_i;
 | 
			
		||||
	unsigned int flag = 0;
 | 
			
		||||
 | 
			
		||||
	__asm__ __volatile__ ( "\n1:\n\t"
 | 
			
		||||
			       /* Load value[i] */
 | 
			
		||||
			       "ld.d %2, %0, 0\n\t"
 | 
			
		||||
			       /* Shift left */
 | 
			
		||||
			       "rotri.d %2, %2, 63\n\t"
 | 
			
		||||
			       "andi %4, %2, 1\n\t"
 | 
			
		||||
			       "xor %2, %2, %4\n\t"
 | 
			
		||||
			       "or %2, %2, %3\n\t"
 | 
			
		||||
			       "move %3, %4\n\t"
 | 
			
		||||
			       /* Store value[i] */
 | 
			
		||||
			       "st.d %2, %0, 0\n\t"
 | 
			
		||||
			       /* Loop  */
 | 
			
		||||
			       "addi.d %0, %0, 8\n\t"
 | 
			
		||||
			       "addi.w %1, %1, -1\n\t"
 | 
			
		||||
			       "bnez %1, 1b\n\t"
 | 
			
		||||
			       : "=r" ( discard_value ),
 | 
			
		||||
				 "=r" ( discard_size ),
 | 
			
		||||
				 "=r" ( discard_value_i ),
 | 
			
		||||
				 "=r" ( discard_carry ),
 | 
			
		||||
				 "=r" ( discard_temp ),
 | 
			
		||||
				 "+m" ( *value )
 | 
			
		||||
			       : "0" ( value0 ), "1" ( size ), "3" ( 0 )
 | 
			
		||||
			       : "cc" );
 | 
			
		||||
	discard_value = value0;
 | 
			
		||||
	discard_size = size;
 | 
			
		||||
	do {
 | 
			
		||||
		discard_value_i = *discard_value;
 | 
			
		||||
		current_value_i = discard_value_i;
 | 
			
		||||
 | 
			
		||||
		discard_value_i += discard_value_i + flag;
 | 
			
		||||
 | 
			
		||||
		if (discard_value_i < current_value_i) {
 | 
			
		||||
			flag = 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			flag = 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		*discard_value = discard_value_i;
 | 
			
		||||
		discard_value++;
 | 
			
		||||
		discard_size -= 1;
 | 
			
		||||
	} while ( discard_size != 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Shift big integer right
 | 
			
		||||
 * Rotate big integer right
 | 
			
		||||
 *
 | 
			
		||||
 * @v value0		Element 0 of big integer
 | 
			
		||||
 * @v size		Number of elements
 | 
			
		||||
 */
 | 
			
		||||
static inline __attribute__ (( always_inline )) void
 | 
			
		||||
bigint_shr_raw ( uint64_t *value0, unsigned int size ) {
 | 
			
		||||
	bigint_t ( size ) __attribute__ (( may_alias )) *value =
 | 
			
		||||
		( ( void * ) value0 );
 | 
			
		||||
bigint_ror_raw ( uint64_t *value0, unsigned int size ) {
 | 
			
		||||
	uint64_t *discard_value;
 | 
			
		||||
	uint64_t discard_value_i;
 | 
			
		||||
	uint64_t discard_carry;
 | 
			
		||||
	uint64_t discard_temp;
 | 
			
		||||
	uint64_t discard_value_j;
 | 
			
		||||
	unsigned int discard_size;
 | 
			
		||||
 | 
			
		||||
	__asm__ __volatile__ ( "\n1:\n\t"
 | 
			
		||||
			       /* Load value[i] */
 | 
			
		||||
			       "ld.d %2, %0, -8\n\t"
 | 
			
		||||
			       /* Shift right */
 | 
			
		||||
			       "andi %4, %2, 1\n\t"
 | 
			
		||||
			       "xor %2, %2, %4\n\t"
 | 
			
		||||
			       "or %2, %2, %3\n\t"
 | 
			
		||||
			       "move %3, %4\n\t"
 | 
			
		||||
			       "rotri.d %2, %2, 1\n\t"
 | 
			
		||||
			       /* Store value[i] */
 | 
			
		||||
			       "st.d %2, %0, -8\n\t"
 | 
			
		||||
			       /* Loop  */
 | 
			
		||||
			       "addi.d %0, %0, -8\n\t"
 | 
			
		||||
			       "addi.w %1, %1, -1\n\t"
 | 
			
		||||
			       "bnez %1, 1b\n\t"
 | 
			
		||||
			       : "=r" ( discard_value ),
 | 
			
		||||
				 "=r" ( discard_size ),
 | 
			
		||||
				 "=r" ( discard_value_i ),
 | 
			
		||||
				 "=r" ( discard_carry ),
 | 
			
		||||
				 "=r" ( discard_temp ),
 | 
			
		||||
				 "+m" ( *value )
 | 
			
		||||
			       : "0" ( value0 + size ), "1" ( size ), "3" ( 0 )
 | 
			
		||||
			       : "cc" );
 | 
			
		||||
	discard_value = value0;
 | 
			
		||||
	discard_size = size;
 | 
			
		||||
 | 
			
		||||
	discard_value_j = 0;
 | 
			
		||||
 | 
			
		||||
	do {
 | 
			
		||||
		discard_size -= 1;
 | 
			
		||||
 | 
			
		||||
		discard_value_i = *(discard_value + discard_size);
 | 
			
		||||
 | 
			
		||||
		discard_value_j = (discard_value_j << 63) | (discard_value_i >> 1);
 | 
			
		||||
 | 
			
		||||
		*(discard_value + discard_size) = discard_value_j;
 | 
			
		||||
 | 
			
		||||
		discard_value_j = discard_value_i;
 | 
			
		||||
	} while ( discard_size > 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -268,6 +236,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
 | 
			
		||||
 *
 | 
			
		||||
@ -342,39 +329,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;
 | 
			
		||||
	uint64_t discard_carry;
 | 
			
		||||
 | 
			
		||||
	__asm__ __volatile__ ( /* Perform multiplication */
 | 
			
		||||
			       "mul.d %0, %5, %6\n\t"
 | 
			
		||||
			       "mulh.du %1, %5, %6\n\t"
 | 
			
		||||
			       /* Accumulate low half */
 | 
			
		||||
			       "add.d %3, %3, %0\n\t"
 | 
			
		||||
			       "sltu %2, %3, %0\n\t"
 | 
			
		||||
			       "add.d %1, %1, %2\n\t"
 | 
			
		||||
			       /* Accumulate carry (cannot overflow) */
 | 
			
		||||
			       "add.d %3, %3, %4\n\t"
 | 
			
		||||
			       "sltu %2, %3, %4\n\t"
 | 
			
		||||
			       "add.d %4, %1, %2\n\t"
 | 
			
		||||
			       : "=&r" ( discard_low ),
 | 
			
		||||
				 "=r" ( discard_high ),
 | 
			
		||||
				 "=r" ( discard_carry ),
 | 
			
		||||
				 "+r" ( *result ),
 | 
			
		||||
				 "+r" ( *carry )
 | 
			
		||||
			       : "r" ( multiplicand ),
 | 
			
		||||
				 "r" ( multiplier ) );
 | 
			
		||||
}
 | 
			
		||||
extern void bigint_multiply_raw ( const uint64_t *multiplicand0,
 | 
			
		||||
				  const uint64_t *multiplier0,
 | 
			
		||||
				  uint64_t *value0, unsigned int size );
 | 
			
		||||
 | 
			
		||||
#endif /* _BITS_BIGINT_H */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/loong64/include/bits/hyperv.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/loong64/include/bits/hyperv.h
									
									
									
									
									
										Normal file
									
								
							@ -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 */
 | 
			
		||||
							
								
								
									
										12
									
								
								src/arch/loong64/include/bits/iomap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/arch/loong64/include/bits/iomap.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
#ifndef _BITS_IOMAP_H
 | 
			
		||||
#define _BITS_IOMAP_H
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * LoongArch64-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__ ( "idle 0" );
 | 
			
		||||
}
 | 
			
		||||
#include <ipxe/efi/efiloong64_nap.h>
 | 
			
		||||
 | 
			
		||||
#endif /* _BITS_NAP_H */
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user