@@ -17,13 +17,20 @@ package nvproxy
17
17
import (
18
18
"fmt"
19
19
"reflect"
20
+ "runtime"
20
21
"sort"
21
22
22
23
"gvisor.dev/gvisor/pkg/abi/nvgpu"
23
24
"gvisor.dev/gvisor/pkg/sentry/devices/nvproxy/nvconf"
24
25
"gvisor.dev/gvisor/pkg/sync"
25
26
)
26
27
28
+ const (
29
+ // ChecksumNoDriver is a special value that indicates that the driver runfile does not exist. This
30
+ // is mostly for ARM drivers that NVIDIA does not provide a driver installer.
31
+ ChecksumNoDriver = "NO_DRIVER"
32
+ )
33
+
27
34
// A driverABIFunc constructs and returns a driverABI.
28
35
// This indirection exists to avoid memory usage from unused driver ABIs.
29
36
type driverABIFunc func () * driverABI
@@ -32,11 +39,49 @@ type driverABIFunc func() *driverABI
32
39
// This indirection exists to avoid the memory usage from struct name maps if they are not used.
33
40
type driverABIStructsFunc func () * driverABIStructs
34
41
42
+ // Checksums is a struct containing the SHA256 checksum of the linux .run driver installer file from
43
+ // NVIDIA.
44
+ type Checksums struct {
45
+ checksumX86_64 string
46
+ checksumARM64 string
47
+ }
48
+
49
+ // NewChecksums creates a new Checksums struct.
50
+ func NewChecksums (checksumX86_64 , checksumARM64 string ) * Checksums {
51
+ return & Checksums {
52
+ checksumX86_64 : checksumX86_64 ,
53
+ checksumARM64 : checksumARM64 ,
54
+ }
55
+ }
56
+
57
+ // Checksum returns the SHA256 checksum of the linux .run driver installer file from NVIDIA for the
58
+ // given architecture.
59
+ func (c * Checksums ) Checksum () (string , error ) {
60
+ switch runtime .GOARCH {
61
+ case "amd64" :
62
+ return c .checksumX86_64 , nil
63
+ case "arm64" :
64
+ return c .checksumARM64 , nil
65
+ default :
66
+ return "" , nil
67
+ }
68
+ }
69
+
70
+ // X86_64 returns the SHA256 checksum of the linux .run driver installer file from NVIDIA for X86_64.
71
+ func (c * Checksums ) X86_64 () string {
72
+ return c .checksumX86_64
73
+ }
74
+
75
+ // Arm64 returns the SHA256 checksum of the linux .run driver installer file from NVIDIA for ARM64.
76
+ func (c * Checksums ) Arm64 () string {
77
+ return c .checksumARM64
78
+ }
79
+
35
80
// abiConAndChecksum couples the driver's abiConstructor to the SHA256 checksum of its linux .run
36
81
// driver installer file from NVIDIA.
37
82
type abiConAndChecksum struct {
38
- cons driverABIFunc
39
- checksum string
83
+ cons driverABIFunc
84
+ checksums * Checksums
40
85
}
41
86
42
87
// driverABI defines the Nvidia kernel driver ABI proxied at a given version.
@@ -89,12 +134,15 @@ var abisOnce sync.Once
89
134
// nvidia.
90
135
// To add a new version, add in support as normal and add the "addDriverABI" call for your version.
91
136
// Run `make sudo TARGETS=//tools/gpu:main ARGS="checksum --version={}"` to get checksum.
92
- func addDriverABI (major , minor , patch int , runfileChecksum string , cons driverABIFunc ) driverABIFunc {
137
+ func addDriverABI (major , minor , patch int , checksumX86_64 , checksumARM64 string , cons driverABIFunc ) driverABIFunc {
93
138
if abis == nil {
94
139
abis = make (map [nvconf.DriverVersion ]abiConAndChecksum )
95
140
}
96
141
version := nvconf .NewDriverVersion (major , minor , patch )
97
- abis [version ] = abiConAndChecksum {cons : cons , checksum : runfileChecksum }
142
+ abis [version ] = abiConAndChecksum {
143
+ cons : cons ,
144
+ checksums : NewChecksums (checksumX86_64 , checksumARM64 ),
145
+ }
98
146
return cons
99
147
}
100
148
@@ -634,12 +682,12 @@ func Init() {
634
682
635
683
// The following exist on the "535" branch. They branched off the main
636
684
// branch at 535.113.01.
637
- v535_129_03 := addDriverABI (535 , 129 , 03 , "e6dca5626a2608c6bb2a046cfcb7c1af338b9e961a7dd90ac09bb8a126ff002e" , v535_113_01 )
638
- v535_183_01 := addDriverABI (535 , 183 , 01 , "f6707afbdda9407e3cbc2e5128e60bcbcdbf02fae29958c72fafb5d405e8b883" , v535_129_03 )
639
- v535_183_06 := addDriverABI (535 , 183 , 06 , "c7bb0a0569c5347845479ed4e3e4d885c6ee3b8adf068c3401cdf754d5ba3d3b" , v535_183_01 )
640
- v535_216_01 := addDriverABI (535 , 216 , 01 , "5ddea1147810012e33967c3181341bcd6624bd3d654c63f845df833b4ece6af7" , v535_183_06 )
641
- v535_230_02 := addDriverABI (535 , 230 , 02 , "20cca9118083fcc8083158466e9cb2b616a7922206bcb7296b1fa5cc9af2e0fd" , v535_216_01 )
642
- _ = addDriverABI (535 , 247 , 01 , "c250e686494cb0c1b5eeea58ba2003707510b2766df05b06ba20b11b3445466b" , v535_230_02 )
685
+ v535_129_03 := addDriverABI (535 , 129 , 03 , "e6dca5626a2608c6bb2a046cfcb7c1af338b9e961a7dd90ac09bb8a126ff002e" , "8ba8d961457a241bcdf91b76d6fe2f36cb473c8bbdb02fb6650a622ce2e85b33" , v535_113_01 )
686
+ v535_183_01 := addDriverABI (535 , 183 , 01 , "f6707afbdda9407e3cbc2e5128e60bcbcdbf02fae29958c72fafb5d405e8b883" , "c9d13b6250d24b76ef87a49b179f234564184a9f6d6414184668958b7f6d21e6" , v535_129_03 )
687
+ v535_183_06 := addDriverABI (535 , 183 , 06 , "c7bb0a0569c5347845479ed4e3e4d885c6ee3b8adf068c3401cdf754d5ba3d3b" , ChecksumNoDriver , v535_183_01 )
688
+ v535_216_01 := addDriverABI (535 , 216 , 01 , "5ddea1147810012e33967c3181341bcd6624bd3d654c63f845df833b4ece6af7" , "4869ae0345b5892b2a50aed566c8226d3e07813d1190aa466feba5e9e21b33b9" , v535_183_06 )
689
+ v535_230_02 := addDriverABI (535 , 230 , 02 , "20cca9118083fcc8083158466e9cb2b616a7922206bcb7296b1fa5cc9af2e0fd" , "ea000e6ff481f55e9bfedbea93b739368c635fe4be6156fdad560524ac7f363b" , v535_216_01 )
690
+ _ = addDriverABI (535 , 247 , 01 , "c250e686494cb0c1b5eeea58ba2003707510b2766df05b06ba20b11b3445466b" , "bd8ea5c3747a588ff1a29b4f59300d2eba69402a605cb95fce10a30f535993d0" , v535_230_02 )
643
691
644
692
// 545.23.06 is an intermediate unqualified version from the main branch.
645
693
v545_23_06 := func () * driverABI {
@@ -703,7 +751,7 @@ func Init() {
703
751
return abi
704
752
}
705
753
706
- v550_54_14 := addDriverABI (550 , 54 , 14 , "8c497ff1cfc7c310fb875149bc30faa4fd26d2237b2cba6cd2e8b0780157cfe3" , func () * driverABI {
754
+ v550_54_14 := addDriverABI (550 , 54 , 14 , "8c497ff1cfc7c310fb875149bc30faa4fd26d2237b2cba6cd2e8b0780157cfe3" , "b0fae8061633885c24f6b0c047649b46249a3bb44cadffbf658af28f80642c1d" , func () * driverABI {
707
755
abi := v550_40_07 ()
708
756
abi .uvmIoctl [nvgpu .UVM_ALLOC_SEMAPHORE_POOL ] = uvmHandler (uvmIoctlSimple [nvgpu .UVM_ALLOC_SEMAPHORE_POOL_PARAMS_V550 ], compUtil )
709
757
abi .uvmIoctl [nvgpu .UVM_MAP_EXTERNAL_ALLOCATION ] = uvmHandler (uvmIoctlHasFrontendFD [nvgpu .UVM_MAP_EXTERNAL_ALLOCATION_PARAMS_V550 ], compUtil )
@@ -719,9 +767,9 @@ func Init() {
719
767
return abi
720
768
})
721
769
722
- v550_54_15 := addDriverABI (550 , 54 , 15 , "2e859ae5f912a9a47aaa9b2d40a94a14f6f486b5d3b67c0ddf8b72c1c9650385" , v550_54_14 )
770
+ v550_54_15 := addDriverABI (550 , 54 , 15 , "2e859ae5f912a9a47aaa9b2d40a94a14f6f486b5d3b67c0ddf8b72c1c9650385" , ChecksumNoDriver , v550_54_14 )
723
771
724
- v550_90_07 := addDriverABI (550 , 90 , 07 , "51acf579d5a9884f573a1d3f522e7fafa5e7841e22a9cec0b4bbeae31b0b9733" , func () * driverABI {
772
+ v550_90_07 := addDriverABI (550 , 90 , 07 , "51acf579d5a9884f573a1d3f522e7fafa5e7841e22a9cec0b4bbeae31b0b9733" , "b896b76ae465307afc5b269c40bd8ccb279e6ea7d3ecae95534a91ecb1971572" , func () * driverABI {
725
773
abi := v550_54_15 ()
726
774
abi .controlCmd [nvgpu .NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE ] = ctrlHandler (rmControlSimple , compUtil )
727
775
@@ -736,14 +784,14 @@ func Init() {
736
784
})
737
785
738
786
// This version does not belong on any branch, but it is a child of 550.90.07.
739
- _ = addDriverABI (550 , 90 , 12 , "391883846713b9e700af2ae87f8ac671f5527508ce3f9f60058deb363e05162a" , v550_90_07 )
787
+ _ = addDriverABI (550 , 90 , 12 , "391883846713b9e700af2ae87f8ac671f5527508ce3f9f60058deb363e05162a" , ChecksumNoDriver , v550_90_07 )
740
788
741
789
// 550.100 is an intermediate unqualified version from the main branch.
742
790
v550_100 := v550_90_07
743
791
744
792
// The following exist on the "550" branch. They branched off the main
745
793
// branch at 550.100.
746
- _ = addDriverABI (550 , 127 , 05 , "d384f34f5d2a896bd7536d3deb6a6d973d8094a3ad485a1c2ee3bf5192086ae9" , v550_100 )
794
+ _ = addDriverABI (550 , 127 , 05 , "d384f34f5d2a896bd7536d3deb6a6d973d8094a3ad485a1c2ee3bf5192086ae9" , "df0b06a89bc37fc8a8e2a152a9ba5a7de1c70636dab0ae62fd6f94e937847816" , v550_100 )
747
795
748
796
// 555.42.02 is an intermediate unqualified version.
749
797
v555_42_02 := func () * driverABI {
@@ -785,10 +833,10 @@ func Init() {
785
833
return abi
786
834
}
787
835
788
- v560_35_03 := addDriverABI (560 , 35 , 03 , "f2932c92fadd43c5b2341be453fc4f73f0ad7185c26bb7a43fbde81ae29f1fe3" , v560_28_03 )
789
- v565_57_01 := addDriverABI (565 , 57 , 01 , "6eebe94e585e385e8804f5a74152df414887bf819cc21bd95b72acd0fb182c7a" , v560_35_03 )
836
+ v560_35_03 := addDriverABI (560 , 35 , 03 , "f2932c92fadd43c5b2341be453fc4f73f0ad7185c26bb7a43fbde81ae29f1fe3" , "b3c64054abd1357a63c5162a337139a2cb3915da96fadbf5a900b6a438df1beb" , v560_28_03 )
837
+ v565_57_01 := addDriverABI (565 , 57 , 01 , "6eebe94e585e385e8804f5a74152df414887bf819cc21bd95b72acd0fb182c7a" , "68355cdec3531b83b7cbebca5bcee6c3e8bd02a5c2636f4656a108525b2f61f1" , v560_35_03 )
790
838
791
- v570_86_15 := addDriverABI (570 , 86 , 15 , "87709c19c7401243136bc0ec9e7f147c6803070a11449ae8f0819dee7963f76b" , func () * driverABI {
839
+ v570_86_15 := addDriverABI (570 , 86 , 15 , "87709c19c7401243136bc0ec9e7f147c6803070a11449ae8f0819dee7963f76b" , ChecksumNoDriver , func () * driverABI {
792
840
abi := v565_57_01 ()
793
841
abi .controlCmd [nvgpu .NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT ] = ctrlHandler (rmControlSimple , compUtil )
794
842
abi .allocationClass [nvgpu .TURING_CHANNEL_GPFIFO_A ] = allocHandler (rmAllocChannelV570 , compUtil )
@@ -816,8 +864,8 @@ func Init() {
816
864
return abi
817
865
})
818
866
819
- v570_124_06 := addDriverABI (570 , 124 , 06 , "1818c90657d17e510de9fa032385ff7e99063e848e901cb4636ee71c8b339313" , v570_86_15 )
820
- v570_133_20 := addDriverABI (570 , 133 , 20 , "1253d17b1528e8a24bf1f34a8ac6591c924b98ad7a32344bde253aa622ac1605" , v570_124_06 )
867
+ v570_124_06 := addDriverABI (570 , 124 , 06 , "1818c90657d17e510de9fa032385ff7e99063e848e901cb4636ee71c8b339313" , ChecksumNoDriver , v570_86_15 )
868
+ v570_133_20 := addDriverABI (570 , 133 , 20 , "1253d17b1528e8a24bf1f34a8ac6591c924b98ad7a32344bde253aa622ac1605" , ChecksumNoDriver , v570_124_06 )
821
869
822
870
// 575.51.02 is an intermediate unqualified version from the main branch.
823
871
v575_51_02 := func () * driverABI {
@@ -832,7 +880,7 @@ func Init() {
832
880
return abi
833
881
}
834
882
835
- _ = addDriverABI (575 , 57 , 8 , "2aa701dac180a7b20a6e578cccd901ded8d44e57d60580f08f9d28dd1fffc6f2" , v575_51_02 )
883
+ _ = addDriverABI (575 , 57 , 8 , "2aa701dac180a7b20a6e578cccd901ded8d44e57d60580f08f9d28dd1fffc6f2" , "549e73e4f7402f66275ee665b6e3a2ae5d7bf57296b743b824d713f205203bdf" , v575_51_02 )
836
884
})
837
885
}
838
886
@@ -878,9 +926,10 @@ func newDriverStruct(paramType reflect.Type, name string) DriverStruct {
878
926
879
927
// ForEachSupportDriver calls f on all supported drivers.
880
928
// Precondition: Init() must have been called.
881
- func ForEachSupportDriver (f func (version nvconf.DriverVersion , checksum string )) {
929
+ func ForEachSupportDriver (f func (version nvconf.DriverVersion , checksums * Checksums )) {
882
930
for version , abi := range abis {
883
- f (version , abi .checksum )
931
+ var c Checksums = * abi .checksums
932
+ f (version , & c )
884
933
}
885
934
}
886
935
@@ -911,12 +960,13 @@ func SupportedDrivers() []nvconf.DriverVersion {
911
960
912
961
// ExpectedDriverChecksum returns the expected checksum for a given version.
913
962
// Precondition: Init() must have been called.
914
- func ExpectedDriverChecksum (version nvconf.DriverVersion ) (string , bool ) {
963
+ func ExpectedDriverChecksum (version nvconf.DriverVersion ) (* Checksums , bool ) {
915
964
abi , ok := abis [version ]
916
965
if ! ok {
917
- return "" , false
966
+ return nil , false
918
967
}
919
- return abi .checksum , true
968
+ var c Checksums = * abi .checksums
969
+ return & c , true
920
970
}
921
971
922
972
// SupportedIoctls returns the ioctl numbers that are supported by nvproxy at
0 commit comments