summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2018-09-29 15:57:40 -0400
committerGravatar Lioncash2018-09-29 16:00:03 -0400
commita63e6f9dfd75f89841817a0185d606da52c7a4a6 (patch)
tree5ebf817e2c5ce6736d89e938769be3f73fbb30f4 /src
parentMerge pull request #1388 from FearlessTobi/port-4258 (diff)
downloadyuzu-a63e6f9dfd75f89841817a0185d606da52c7a4a6.tar.gz
yuzu-a63e6f9dfd75f89841817a0185d606da52c7a4a6.tar.xz
yuzu-a63e6f9dfd75f89841817a0185d606da52c7a4a6.zip
loader: Make the Load() function take a process as a regular reference, not a SharedPtr
A process should never require being reference counted in this situation. If the handle to a process is freed before this function is called, it's definitely a bug with our lifetime management, so we can put the requirement in place for the API that the process must be a valid instance.
Diffstat (limited to 'src')
-rw-r--r--src/core/core.cpp2
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp9
-rw-r--r--src/core/loader/deconstructed_rom_directory.h3
-rw-r--r--src/core/loader/elf.cpp8
-rw-r--r--src/core/loader/elf.h5
-rw-r--r--src/core/loader/loader.h3
-rw-r--r--src/core/loader/nax.cpp2
-rw-r--r--src/core/loader/nax.h2
-rw-r--r--src/core/loader/nca.cpp2
-rw-r--r--src/core/loader/nca.h3
-rw-r--r--src/core/loader/nro.cpp6
-rw-r--r--src/core/loader/nro.h3
-rw-r--r--src/core/loader/nso.cpp6
-rw-r--r--src/core/loader/nso.h4
-rw-r--r--src/core/loader/nsp.cpp4
-rw-r--r--src/core/loader/nsp.h2
-rw-r--r--src/core/loader/xci.cpp4
-rw-r--r--src/core/loader/xci.h2
18 files changed, 28 insertions, 42 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 7666354dc..b6acfb3e4 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -202,7 +202,7 @@ struct System::Impl {
202 return init_result; 202 return init_result;
203 } 203 }
204 204
205 const Loader::ResultStatus load_result{app_loader->Load(kernel.CurrentProcess())}; 205 const Loader::ResultStatus load_result{app_loader->Load(*kernel.CurrentProcess())};
206 if (load_result != Loader::ResultStatus::Success) { 206 if (load_result != Loader::ResultStatus::Success) {
207 LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result)); 207 LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result));
208 Shutdown(); 208 Shutdown();
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp
index 7e8035d0f..1b198cc5c 100644
--- a/src/core/loader/deconstructed_rom_directory.cpp
+++ b/src/core/loader/deconstructed_rom_directory.cpp
@@ -86,8 +86,7 @@ FileType AppLoader_DeconstructedRomDirectory::IdentifyType(const FileSys::Virtua
86 return FileType::Error; 86 return FileType::Error;
87} 87}
88 88
89ResultStatus AppLoader_DeconstructedRomDirectory::Load( 89ResultStatus AppLoader_DeconstructedRomDirectory::Load(Kernel::Process& process) {
90 Kernel::SharedPtr<Kernel::Process>& process) {
91 if (is_loaded) { 90 if (is_loaded) {
92 return ResultStatus::ErrorAlreadyLoaded; 91 return ResultStatus::ErrorAlreadyLoaded;
93 } 92 }
@@ -130,10 +129,10 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(
130 return ResultStatus::Error32BitISA; 129 return ResultStatus::Error32BitISA;
131 } 130 }
132 131
133 process->LoadFromMetadata(metadata); 132 process.LoadFromMetadata(metadata);
134 133
135 // Load NSO modules 134 // Load NSO modules
136 const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress(); 135 const VAddr base_address = process.vm_manager.GetCodeRegionBaseAddress();
137 VAddr next_load_addr = base_address; 136 VAddr next_load_addr = base_address;
138 for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3", 137 for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3",
139 "subsdk4", "subsdk5", "subsdk6", "subsdk7", "sdk"}) { 138 "subsdk4", "subsdk5", "subsdk6", "subsdk7", "sdk"}) {
@@ -147,7 +146,7 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(
147 } 146 }
148 } 147 }
149 148
150 process->Run(base_address, metadata.GetMainThreadPriority(), metadata.GetMainThreadStackSize()); 149 process.Run(base_address, metadata.GetMainThreadPriority(), metadata.GetMainThreadStackSize());
151 150
152 // Find the RomFS by searching for a ".romfs" file in this directory 151 // Find the RomFS by searching for a ".romfs" file in this directory
153 const auto& files = dir->GetFiles(); 152 const auto& files = dir->GetFiles();
diff --git a/src/core/loader/deconstructed_rom_directory.h b/src/core/loader/deconstructed_rom_directory.h
index 8a0dc1b1e..d109ed2b5 100644
--- a/src/core/loader/deconstructed_rom_directory.h
+++ b/src/core/loader/deconstructed_rom_directory.h
@@ -7,7 +7,6 @@
7#include <string> 7#include <string>
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "core/file_sys/program_metadata.h" 9#include "core/file_sys/program_metadata.h"
10#include "core/hle/kernel/object.h"
11#include "core/loader/loader.h" 10#include "core/loader/loader.h"
12 11
13namespace Loader { 12namespace Loader {
@@ -38,7 +37,7 @@ public:
38 return IdentifyType(file); 37 return IdentifyType(file);
39 } 38 }
40 39
41 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; 40 ResultStatus Load(Kernel::Process& process) override;
42 41
43 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; 42 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override;
44 ResultStatus ReadIcon(std::vector<u8>& buffer) override; 43 ResultStatus ReadIcon(std::vector<u8>& buffer) override;
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index ff1221574..5712a2a11 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -387,7 +387,7 @@ FileType AppLoader_ELF::IdentifyType(const FileSys::VirtualFile& file) {
387 return FileType::Error; 387 return FileType::Error;
388} 388}
389 389
390ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) { 390ResultStatus AppLoader_ELF::Load(Kernel::Process& process) {
391 if (is_loaded) 391 if (is_loaded)
392 return ResultStatus::ErrorAlreadyLoaded; 392 return ResultStatus::ErrorAlreadyLoaded;
393 393
@@ -395,13 +395,13 @@ ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) {
395 if (buffer.size() != file->GetSize()) 395 if (buffer.size() != file->GetSize())
396 return ResultStatus::ErrorIncorrectELFFileSize; 396 return ResultStatus::ErrorIncorrectELFFileSize;
397 397
398 const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress(); 398 const VAddr base_address = process.vm_manager.GetCodeRegionBaseAddress();
399 ElfReader elf_reader(&buffer[0]); 399 ElfReader elf_reader(&buffer[0]);
400 SharedPtr<CodeSet> codeset = elf_reader.LoadInto(base_address); 400 SharedPtr<CodeSet> codeset = elf_reader.LoadInto(base_address);
401 codeset->name = file->GetName(); 401 codeset->name = file->GetName();
402 402
403 process->LoadModule(codeset, codeset->entrypoint); 403 process.LoadModule(codeset, codeset->entrypoint);
404 process->Run(codeset->entrypoint, 48, Memory::DEFAULT_STACK_SIZE); 404 process.Run(codeset->entrypoint, 48, Memory::DEFAULT_STACK_SIZE);
405 405
406 is_loaded = true; 406 is_loaded = true;
407 return ResultStatus::Success; 407 return ResultStatus::Success;
diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h
index b8fb982d0..6af76441c 100644
--- a/src/core/loader/elf.h
+++ b/src/core/loader/elf.h
@@ -8,9 +8,6 @@
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "core/loader/loader.h" 9#include "core/loader/loader.h"
10 10
11////////////////////////////////////////////////////////////////////////////////////////////////////
12// Loader namespace
13
14namespace Loader { 11namespace Loader {
15 12
16/// Loads an ELF/AXF file 13/// Loads an ELF/AXF file
@@ -29,7 +26,7 @@ public:
29 return IdentifyType(file); 26 return IdentifyType(file);
30 } 27 }
31 28
32 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; 29 ResultStatus Load(Kernel::Process& process) override;
33}; 30};
34 31
35} // namespace Loader 32} // namespace Loader
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h
index 843c4bb91..20e66109b 100644
--- a/src/core/loader/loader.h
+++ b/src/core/loader/loader.h
@@ -12,7 +12,6 @@
12#include <boost/optional.hpp> 12#include <boost/optional.hpp>
13#include "common/common_types.h" 13#include "common/common_types.h"
14#include "core/file_sys/vfs.h" 14#include "core/file_sys/vfs.h"
15#include "core/hle/kernel/object.h"
16 15
17namespace Kernel { 16namespace Kernel {
18struct AddressMapping; 17struct AddressMapping;
@@ -136,7 +135,7 @@ public:
136 * @param process The newly created process. 135 * @param process The newly created process.
137 * @return The status result of the operation. 136 * @return The status result of the operation.
138 */ 137 */
139 virtual ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) = 0; 138 virtual ResultStatus Load(Kernel::Process& process) = 0;
140 139
141 /** 140 /**
142 * Loads the system mode that this application needs. 141 * Loads the system mode that this application needs.
diff --git a/src/core/loader/nax.cpp b/src/core/loader/nax.cpp
index 5d4380684..073fb9d2f 100644
--- a/src/core/loader/nax.cpp
+++ b/src/core/loader/nax.cpp
@@ -41,7 +41,7 @@ FileType AppLoader_NAX::GetFileType() {
41 return IdentifyTypeImpl(*nax); 41 return IdentifyTypeImpl(*nax);
42} 42}
43 43
44ResultStatus AppLoader_NAX::Load(Kernel::SharedPtr<Kernel::Process>& process) { 44ResultStatus AppLoader_NAX::Load(Kernel::Process& process) {
45 if (is_loaded) { 45 if (is_loaded) {
46 return ResultStatus::ErrorAlreadyLoaded; 46 return ResultStatus::ErrorAlreadyLoaded;
47 } 47 }
diff --git a/src/core/loader/nax.h b/src/core/loader/nax.h
index 56605fe45..fc3c01876 100644
--- a/src/core/loader/nax.h
+++ b/src/core/loader/nax.h
@@ -33,7 +33,7 @@ public:
33 33
34 FileType GetFileType() override; 34 FileType GetFileType() override;
35 35
36 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; 36 ResultStatus Load(Kernel::Process& process) override;
37 37
38 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; 38 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override;
39 ResultStatus ReadProgramId(u64& out_program_id) override; 39 ResultStatus ReadProgramId(u64& out_program_id) override;
diff --git a/src/core/loader/nca.cpp b/src/core/loader/nca.cpp
index 6aaffae59..7e1b0d84f 100644
--- a/src/core/loader/nca.cpp
+++ b/src/core/loader/nca.cpp
@@ -30,7 +30,7 @@ FileType AppLoader_NCA::IdentifyType(const FileSys::VirtualFile& file) {
30 return FileType::Error; 30 return FileType::Error;
31} 31}
32 32
33ResultStatus AppLoader_NCA::Load(Kernel::SharedPtr<Kernel::Process>& process) { 33ResultStatus AppLoader_NCA::Load(Kernel::Process& process) {
34 if (is_loaded) { 34 if (is_loaded) {
35 return ResultStatus::ErrorAlreadyLoaded; 35 return ResultStatus::ErrorAlreadyLoaded;
36 } 36 }
diff --git a/src/core/loader/nca.h b/src/core/loader/nca.h
index 10be197c4..95d9b73a1 100644
--- a/src/core/loader/nca.h
+++ b/src/core/loader/nca.h
@@ -6,7 +6,6 @@
6 6
7#include "common/common_types.h" 7#include "common/common_types.h"
8#include "core/file_sys/vfs.h" 8#include "core/file_sys/vfs.h"
9#include "core/hle/kernel/object.h"
10#include "core/loader/loader.h" 9#include "core/loader/loader.h"
11 10
12namespace FileSys { 11namespace FileSys {
@@ -34,7 +33,7 @@ public:
34 return IdentifyType(file); 33 return IdentifyType(file);
35 } 34 }
36 35
37 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; 36 ResultStatus Load(Kernel::Process& process) override;
38 37
39 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; 38 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override;
40 u64 ReadRomFSIVFCOffset() const override; 39 u64 ReadRomFSIVFCOffset() const override;
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index b72871efa..8ad973c3a 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -175,19 +175,19 @@ bool AppLoader_NRO::LoadNro(FileSys::VirtualFile file, VAddr load_base) {
175 return true; 175 return true;
176} 176}
177 177
178ResultStatus AppLoader_NRO::Load(Kernel::SharedPtr<Kernel::Process>& process) { 178ResultStatus AppLoader_NRO::Load(Kernel::Process& process) {
179 if (is_loaded) { 179 if (is_loaded) {
180 return ResultStatus::ErrorAlreadyLoaded; 180 return ResultStatus::ErrorAlreadyLoaded;
181 } 181 }
182 182
183 // Load NRO 183 // Load NRO
184 const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress(); 184 const VAddr base_address = process.vm_manager.GetCodeRegionBaseAddress();
185 185
186 if (!LoadNro(file, base_address)) { 186 if (!LoadNro(file, base_address)) {
187 return ResultStatus::ErrorLoadingNRO; 187 return ResultStatus::ErrorLoadingNRO;
188 } 188 }
189 189
190 process->Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE); 190 process.Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE);
191 191
192 is_loaded = true; 192 is_loaded = true;
193 return ResultStatus::Success; 193 return ResultStatus::Success;
diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h
index 96d2de305..04b46119a 100644
--- a/src/core/loader/nro.h
+++ b/src/core/loader/nro.h
@@ -6,7 +6,6 @@
6 6
7#include <string> 7#include <string>
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "core/hle/kernel/object.h"
10#include "core/loader/linker.h" 9#include "core/loader/linker.h"
11#include "core/loader/loader.h" 10#include "core/loader/loader.h"
12 11
@@ -33,7 +32,7 @@ public:
33 return IdentifyType(file); 32 return IdentifyType(file);
34 } 33 }
35 34
36 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; 35 ResultStatus Load(Kernel::Process& process) override;
37 36
38 ResultStatus ReadIcon(std::vector<u8>& buffer) override; 37 ResultStatus ReadIcon(std::vector<u8>& buffer) override;
39 ResultStatus ReadProgramId(u64& out_program_id) override; 38 ResultStatus ReadProgramId(u64& out_program_id) override;
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index 1a6876a22..6fe3e17a7 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -153,17 +153,17 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base) {
153 return load_base + image_size; 153 return load_base + image_size;
154} 154}
155 155
156ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) { 156ResultStatus AppLoader_NSO::Load(Kernel::Process& process) {
157 if (is_loaded) { 157 if (is_loaded) {
158 return ResultStatus::ErrorAlreadyLoaded; 158 return ResultStatus::ErrorAlreadyLoaded;
159 } 159 }
160 160
161 // Load module 161 // Load module
162 const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress(); 162 const VAddr base_address = process.vm_manager.GetCodeRegionBaseAddress();
163 LoadModule(file, base_address); 163 LoadModule(file, base_address);
164 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), base_address); 164 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), base_address);
165 165
166 process->Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE); 166 process.Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE);
167 167
168 is_loaded = true; 168 is_loaded = true;
169 return ResultStatus::Success; 169 return ResultStatus::Success;
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h
index aaeb1f2a9..7f142405b 100644
--- a/src/core/loader/nso.h
+++ b/src/core/loader/nso.h
@@ -4,9 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <string>
8#include "common/common_types.h" 7#include "common/common_types.h"
9#include "core/hle/kernel/object.h"
10#include "core/loader/linker.h" 8#include "core/loader/linker.h"
11#include "core/loader/loader.h" 9#include "core/loader/loader.h"
12 10
@@ -30,7 +28,7 @@ public:
30 28
31 static VAddr LoadModule(FileSys::VirtualFile file, VAddr load_base); 29 static VAddr LoadModule(FileSys::VirtualFile file, VAddr load_base);
32 30
33 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; 31 ResultStatus Load(Kernel::Process& process) override;
34}; 32};
35 33
36} // namespace Loader 34} // namespace Loader
diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp
index 291a9876d..b7ba77ef4 100644
--- a/src/core/loader/nsp.cpp
+++ b/src/core/loader/nsp.cpp
@@ -10,8 +10,6 @@
10#include "core/file_sys/control_metadata.h" 10#include "core/file_sys/control_metadata.h"
11#include "core/file_sys/nca_metadata.h" 11#include "core/file_sys/nca_metadata.h"
12#include "core/file_sys/patch_manager.h" 12#include "core/file_sys/patch_manager.h"
13#include "core/file_sys/registered_cache.h"
14#include "core/file_sys/romfs.h"
15#include "core/file_sys/submission_package.h" 13#include "core/file_sys/submission_package.h"
16#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
17#include "core/loader/deconstructed_rom_directory.h" 15#include "core/loader/deconstructed_rom_directory.h"
@@ -62,7 +60,7 @@ FileType AppLoader_NSP::IdentifyType(const FileSys::VirtualFile& file) {
62 return FileType::Error; 60 return FileType::Error;
63} 61}
64 62
65ResultStatus AppLoader_NSP::Load(Kernel::SharedPtr<Kernel::Process>& process) { 63ResultStatus AppLoader_NSP::Load(Kernel::Process& process) {
66 if (is_loaded) { 64 if (is_loaded) {
67 return ResultStatus::ErrorAlreadyLoaded; 65 return ResultStatus::ErrorAlreadyLoaded;
68 } 66 }
diff --git a/src/core/loader/nsp.h b/src/core/loader/nsp.h
index 7ef810499..eac9b819a 100644
--- a/src/core/loader/nsp.h
+++ b/src/core/loader/nsp.h
@@ -35,7 +35,7 @@ public:
35 return IdentifyType(file); 35 return IdentifyType(file);
36 } 36 }
37 37
38 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; 38 ResultStatus Load(Kernel::Process& process) override;
39 39
40 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; 40 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override;
41 ResultStatus ReadProgramId(u64& out_program_id) override; 41 ResultStatus ReadProgramId(u64& out_program_id) override;
diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp
index 16509229f..eda67a8c8 100644
--- a/src/core/loader/xci.cpp
+++ b/src/core/loader/xci.cpp
@@ -9,8 +9,6 @@
9#include "core/file_sys/content_archive.h" 9#include "core/file_sys/content_archive.h"
10#include "core/file_sys/control_metadata.h" 10#include "core/file_sys/control_metadata.h"
11#include "core/file_sys/patch_manager.h" 11#include "core/file_sys/patch_manager.h"
12#include "core/file_sys/romfs.h"
13#include "core/file_sys/submission_package.h"
14#include "core/hle/kernel/process.h" 12#include "core/hle/kernel/process.h"
15#include "core/loader/nca.h" 13#include "core/loader/nca.h"
16#include "core/loader/xci.h" 14#include "core/loader/xci.h"
@@ -46,7 +44,7 @@ FileType AppLoader_XCI::IdentifyType(const FileSys::VirtualFile& file) {
46 return FileType::Error; 44 return FileType::Error;
47} 45}
48 46
49ResultStatus AppLoader_XCI::Load(Kernel::SharedPtr<Kernel::Process>& process) { 47ResultStatus AppLoader_XCI::Load(Kernel::Process& process) {
50 if (is_loaded) { 48 if (is_loaded) {
51 return ResultStatus::ErrorAlreadyLoaded; 49 return ResultStatus::ErrorAlreadyLoaded;
52 } 50 }
diff --git a/src/core/loader/xci.h b/src/core/loader/xci.h
index cc4287e17..17e47b658 100644
--- a/src/core/loader/xci.h
+++ b/src/core/loader/xci.h
@@ -35,7 +35,7 @@ public:
35 return IdentifyType(file); 35 return IdentifyType(file);
36 } 36 }
37 37
38 ResultStatus Load(Kernel::SharedPtr<Kernel::Process>& process) override; 38 ResultStatus Load(Kernel::Process& process) override;
39 39
40 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; 40 ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override;
41 ResultStatus ReadProgramId(u64& out_program_id) override; 41 ResultStatus ReadProgramId(u64& out_program_id) override;