Add the current OS source tree, build scripts, system image layout, and development notes covering DMA page allocation, e1000 bring-up, net API dispatch, and DHCP work in progress.
106 lines
3.6 KiB
PowerShell
106 lines
3.6 KiB
PowerShell
$ErrorActionPreference = 'Stop'
|
|
|
|
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
$Root = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $ScriptDir))
|
|
$Source = Join-Path $Root 'CODE\DKM\stub_driver\stub_driver.c'
|
|
$Manifest = Join-Path $Root 'SYSTEM\driver\manifest.json'
|
|
$SystemDriver = Join-Path $Root 'SYSTEM\driver'
|
|
$BuildDir = Join-Path $Root '.build_tmp\drivers'
|
|
|
|
function Find-Tool($Name, $ExtraNames = @()) {
|
|
$names = @($Name) + $ExtraNames
|
|
foreach ($n in $names) {
|
|
$cmd = Get-Command $n -ErrorAction SilentlyContinue
|
|
if ($cmd) { return $cmd.Source }
|
|
}
|
|
$dirs = @(
|
|
'C:\Program Files\LLVM\bin',
|
|
'C:\Program Files (x86)\LLVM\bin',
|
|
'C:\LLVM\bin',
|
|
'D:\LLVM\bin',
|
|
'D:\Program Files\LLVM\bin',
|
|
'D:\Code\LLVM\bin',
|
|
'C:\msys64\clang64\bin',
|
|
'C:\msys64\mingw64\bin',
|
|
'C:\mingw64\bin'
|
|
)
|
|
foreach ($dir in $dirs) {
|
|
foreach ($n in $names) {
|
|
$candidate = Join-Path $dir $n
|
|
if (Test-Path $candidate) { return $candidate }
|
|
if (-not $n.EndsWith('.exe')) {
|
|
$candidateExe = Join-Path $dir "$n.exe"
|
|
if (Test-Path $candidateExe) { return $candidateExe }
|
|
}
|
|
}
|
|
}
|
|
return $null
|
|
}
|
|
|
|
function Get-DriverClassValue([string]$Class) {
|
|
switch ($Class) {
|
|
'platform' { return 1 }
|
|
'bus' { return 2 }
|
|
'interrupt' { return 3 }
|
|
'timer' { return 4 }
|
|
'console' { return 5 }
|
|
'storage' { return 6 }
|
|
'fs' { return 7 }
|
|
'fs-core' { return 8 }
|
|
'net' { return 9 }
|
|
'input' { return 10 }
|
|
'gpu' { return 11 }
|
|
default { return 0 }
|
|
}
|
|
}
|
|
|
|
$clang = Find-Tool 'clang'
|
|
$lld = Find-Tool 'ld.lld'
|
|
if (-not $clang) {
|
|
throw 'clang was not found. Install LLVM/Clang.'
|
|
}
|
|
if (-not $lld) {
|
|
throw 'ld.lld was not found. Install LLVM lld.'
|
|
}
|
|
|
|
New-Item -ItemType Directory -Force -Path $BuildDir | Out-Null
|
|
$manifestData = Get-Content -Raw -LiteralPath $Manifest | ConvertFrom-Json
|
|
$count = 0
|
|
|
|
foreach ($stage in $manifestData.stages) {
|
|
foreach ($driver in $stage.drivers) {
|
|
$relative = [string]$driver.path
|
|
if (-not $relative.StartsWith('driver/')) {
|
|
throw "Unexpected driver path: $relative"
|
|
}
|
|
|
|
$destRelative = $relative.Substring('driver/'.Length).Replace('/', '\')
|
|
$dest = Join-Path $SystemDriver $destRelative
|
|
$destDir = Split-Path -Parent $dest
|
|
New-Item -ItemType Directory -Force -Path $destDir | Out-Null
|
|
|
|
$name = [string]$driver.name
|
|
$classValue = Get-DriverClassValue ([string]$driver.class)
|
|
$stageValue = [int]$stage.id
|
|
$flags = 0
|
|
if ([bool]$driver.required) { $flags = $flags -bor 1 }
|
|
if ($stageValue -le 1) { $flags = $flags -bor 2 }
|
|
|
|
$obj = Join-Path $BuildDir "$name.o"
|
|
$drv = Join-Path $BuildDir "$name.drv"
|
|
$driverNameDefine = 'DRIVER_NAME=' + $name
|
|
|
|
& $clang -target x86_64-unknown-none -std=c11 -ffreestanding -fno-stack-protector -fno-pic -fno-pie -mno-red-zone -Wall -Wextra -O2 -c $Source -o $obj "-D$driverNameDefine" "-DDRIVER_CLASS=$classValue" "-DDRIVER_STAGE=$stageValue" "-DDRIVER_FLAGS=$flags"
|
|
if ($LASTEXITCODE -ne 0) { throw "failed to compile stub driver: $name" }
|
|
|
|
& $lld -r -o $drv $obj
|
|
if ($LASTEXITCODE -ne 0) { throw "failed to link stub driver: $name" }
|
|
|
|
Copy-Item -LiteralPath $drv -Destination $dest -Force
|
|
Write-Host "[drivers] installed $relative"
|
|
$count++
|
|
}
|
|
}
|
|
|
|
Write-Host "[drivers] installed $count DKM stub drivers"
|