@@ -28,6 +28,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
2828#include < cpu/ppc/ppcemu.h>
2929#include < cpu/ppc/ppcmmu.h>
3030#include < debugger/debugger.h>
31+ #include < devices/common/ofnvram.h>
3132#include < machines/machinebase.h>
3233#include < machines/machinefactory.h>
3334#include < utils/profiler.h>
@@ -94,6 +95,7 @@ const WorkingDirectoryValidator WorkingDirectory;
9495
9596void run_machine (
9697 std::string machine_str, char *rom_data, size_t rom_size, uint32_t execution_mode
98+ ,const std::vector<std::string> &env_vars
9799 ,uint32_t profiling_interval_ms
98100);
99101
@@ -110,7 +112,7 @@ int main(int argc, char** argv) {
110112 string keyboard_string = " Eng_USA" ;
111113
112114 const std::map<std::string, int > kbd_map{
113- {" Eng_USA" , 0 }, {" Eng_GBR" , 1 }, {" Fra_FRA" , 10 }, {" Deu_DEU" , 20 },
115+ {" Eng_USA" , 0 }, {" Eng_GBR" , 1 }, {" Fra_FRA" , 10 }, {" Deu_DEU" , 20 },
114116 {" Ita_ITA" , 30 },{" Spa_ESP" , 40 }, {" Jpn_JPN" , 80 },
115117 };
116118
@@ -142,6 +144,10 @@ int main(int argc, char** argv) {
142144 app.add_flag (" --log-no-uptime" , log_no_uptime,
143145 " Disable the uptime preamble of logged messages" );
144146
147+ std::vector<std::string> env_vars;
148+ app.add_option (" --setenv" , env_vars, " Set OpenFirmware variables at startup" )
149+ ->take_all ();
150+
145151 uint32_t profiling_interval_ms = 0 ;
146152#ifdef CPU_PROFILING
147153 app.add_option (" --profiling-interval-ms" , profiling_interval_ms,
@@ -280,6 +286,7 @@ int main(int argc, char** argv) {
280286 &rom_data[0 ],
281287 rom_size,
282288 execution_mode,
289+ env_vars,
283290 profiling_interval_ms);
284291 if (power_off_reason == po_restarting) {
285292 LOG_F (INFO, " Restarting..." );
@@ -306,6 +313,7 @@ int main(int argc, char** argv) {
306313void run_machine (std::string machine_str, char * rom_data,
307314 size_t rom_size,
308315 uint32_t execution_mode,
316+ const std::vector<std::string> &env_vars,
309317 uint32_t
310318#ifdef CPU_PROFILING
311319 profiling_interval_ms
@@ -315,6 +323,28 @@ void run_machine(std::string machine_str, char* rom_data,
315323 return ;
316324 }
317325
326+ if (!env_vars.empty ()) {
327+ OfConfigUtils ofnvram;
328+ if (!ofnvram.init ()) {
329+ for (const auto &env_var : env_vars) {
330+ auto pos = env_var.find (' =' );
331+ if (pos != std::string::npos) {
332+ std::string name = env_var.substr (0 , pos);
333+ std::string value = env_var.substr (pos + 1 );
334+ if (ofnvram.setenv (name, value)) {
335+ LOG_F (INFO, " Set OpenFirmware variable %ss to %s" , name.c_str (), value.c_str ());
336+ } else {
337+ LOG_F (WARNING, " Cannot set OpenFirmware variable %s to %s" , name.c_str (), value.c_str ());
338+ }
339+ } else {
340+ LOG_F (WARNING, " Invalid format for --setenv: %s" , env_var.c_str ());
341+ }
342+ }
343+ } else {
344+ LOG_F (WARNING, " Cannot initialize NVRAM wrapper, will not set OpenFirmware variables" );
345+ }
346+ }
347+
318348 uint32_t deterministic_timer;
319349 if (is_deterministic) {
320350 EventManager::get_instance ()->disable_input_handlers ();
@@ -332,7 +362,7 @@ void run_machine(std::string machine_str, char* rom_data,
332362
333363 // set up system wide event polling using
334364 // default Macintosh polling rate of 11 ms
335- uint32_t event_timer = TimerManager::get_instance ()->add_cyclic_timer (MSECS_TO_NSECS (11 ), [] {
365+ uint32_t event_timer = TimerManager::get_instance ()->add_cyclic_timer (MSECS_TO_NSECS (11 ), [] {
336366 EventManager::get_instance ()->poll_events (keyboard_id);
337367 });
338368
0 commit comments