diff --git a/gnu/packages/emulators.scm b/gnu/packages/emulators.scm
index 2486485805..08af04ccfe 100644
--- a/gnu/packages/emulators.scm
+++ b/gnu/packages/emulators.scm
@@ -2632,6 +2632,10 @@ (define-public retroarch-minimal
               (variable "LIBRETRO_AUTOCONFIG_DIRECTORY")
               (separator #f)            ;single entry
               (files '("share/libretro/autoconfig")))
+             (search-path-specification
+              (variable "LIBRETRO_SYSTEM_DIRECTORY")
+              (separator #f)            ;single entry
+              (files '("share/libretro/system")))
              (search-path-specification
               (variable "LIBRETRO_VIDEO_FILTER_DIRECTORY")
               (separator #f)            ;single entry
diff --git a/gnu/packages/patches/retroarch-improved-search-paths.patch b/gnu/packages/patches/retroarch-improved-search-paths.patch
index 6fcd4745ac..8d70514bd8 100644
--- a/gnu/packages/patches/retroarch-improved-search-paths.patch
+++ b/gnu/packages/patches/retroarch-improved-search-paths.patch
@@ -4,22 +4,23 @@ variable.
 Upstream-status: https://github.com/libretro/RetroArch/pull/17054
 
 diff --git a/configuration.c b/configuration.c
-index 5808a3f21c..0cc2909102 100644
+index 5808a3f21c..2bc9abf11c 100644
 --- a/configuration.c
 +++ b/configuration.c
-@@ -3573,6 +3573,11 @@ static bool config_load_file(global_t *global,
+@@ -3573,6 +3573,12 @@ static bool config_load_file(global_t *global,
  {
     unsigned i;
     char tmp_str[PATH_MAX_LENGTH];
 +   char* libretro_directory                        = NULL;
 +   char* libretro_assets_directory                 = NULL;
 +   char* libretro_autoconfig_directory             = NULL;
++   char* libretro_system_directory                 = NULL;
 +   char* libretro_video_filter_directory           = NULL;
 +   char* libretro_video_shader_directory           = NULL;
     static bool first_load                          = true;
     bool without_overrides                          = false;
     unsigned msg_color                              = 0;
-@@ -3848,12 +3853,6 @@ static bool config_load_file(global_t *global,
+@@ -3848,12 +3854,6 @@ static bool config_load_file(global_t *global,
           strlcpy(path_settings[i].ptr, tmp_str, PATH_MAX_LENGTH);
     }
  
@@ -32,7 +33,7 @@ index 5808a3f21c..0cc2909102 100644
  #ifdef RARCH_CONSOLE
     if (conf)
        video_driver_load_settings(global, conf);
-@@ -3861,6 +3860,20 @@ static bool config_load_file(global_t *global,
+@@ -3861,6 +3861,26 @@ static bool config_load_file(global_t *global,
  
     /* Post-settings load */
  
@@ -49,11 +50,17 @@ index 5808a3f21c..0cc2909102 100644
 +       configuration_set_string(settings,
 +				settings->paths.directory_autoconfig,
 +				libretro_autoconfig_directory);
++
++   libretro_system_directory = getenv("LIBRETRO_SYSTEM_DIRECTORY");
++   if (libretro_system_directory)
++       configuration_set_string(settings,
++				settings->paths.directory_system,
++				libretro_system_directory);
 +
     if (     (rarch_flags & RARCH_FLAGS_HAS_SET_USERNAME)
           && (override_username))
     {
-@@ -4032,15 +4045,27 @@ static bool config_load_file(global_t *global,
+@@ -4032,15 +4052,27 @@ static bool config_load_file(global_t *global,
        *settings->paths.path_menu_wallpaper = '\0';
     if (string_is_equal(settings->paths.path_rgui_theme_preset, "default"))
        *settings->paths.path_rgui_theme_preset = '\0';
@@ -85,18 +92,18 @@ index 5808a3f21c..0cc2909102 100644
  #ifdef _3DS
     if (string_is_equal(settings->paths.directory_bottom_assets, "default"))
 diff --git a/docs/retroarch.6 b/docs/retroarch.6
-index 7478040e17..f864e0e0d5 100644
+index 7478040e17..bc1ac8dfff 100644
 --- a/docs/retroarch.6
 +++ b/docs/retroarch.6
 @@ -1,6 +1,6 @@
  .\" retroarch.6:
  
 -.TH  "RETROARCH" "6" "November 1, 2011" "RETROARCH" "System Manager's Manual: retroarch"
-+.TH  "RETROARCH" "6" "September 28, 2024" "RETROARCH" "System Manager's Manual: retroarch"
++.TH  "RETROARCH" "6" "January 16, 2025" "RETROARCH" "System Manager's Manual: retroarch"
  
  .SH NAME
  
-@@ -239,3 +239,36 @@ Disables all kinds of content patching.
+@@ -239,3 +239,42 @@ Disables all kinds of content patching.
  .TP
  \fB-D, --detach\fR
  Detach from the current console. This is currently only relevant for Microsoft Windows.
@@ -123,6 +130,12 @@ index 7478040e17..f864e0e0d5 100644
 +"joypad_autoconfig_dir" configuration file option.
 +
 +.TP
++\fBLIBRETRO_SYSTEM_DIRECTORY\fR
++Specify the directory where RetroArch looks for system files,
++overriding the value of the "system_directory" configuration file
++option.
++
++.TP
 +\fBLIBRETRO_VIDEO_FILTER_DIRECTORY\fR
 +Specify the directory where RetroArch looks for video filters,
 +overriding the value of the "video_filter_dir" configuration file
@@ -134,21 +147,22 @@ index 7478040e17..f864e0e0d5 100644
 +overriding the value of the "video_shader_dir" configuration file
 +option.
 diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c
-index c157d355a1..ddf0b5ca87 100644
+index c157d355a1..a8e957c7c2 100644
 --- a/frontend/drivers/platform_unix.c
 +++ b/frontend/drivers/platform_unix.c
-@@ -1324,6 +1324,10 @@ static void frontend_unix_get_env(int *argc,
+@@ -1324,6 +1324,11 @@ static void frontend_unix_get_env(int *argc,
  {
     unsigned i;
     const char* libretro_directory = getenv("LIBRETRO_DIRECTORY");
 +   const char* libretro_assets_directory = getenv("LIBRETRO_ASSETS_DIRECTORY");
 +   const char* libretro_autoconfig_directory = getenv("LIBRETRO_AUTOCONFIG_DIRECTORY");
++   const char* libretro_system_directory = getenv("LIBRETRO_SYSTEM_DIRECTORY");
 +   const char* libretro_video_filter_directory = getenv("LIBRETRO_VIDEO_FILTER_DIRECTORY");
 +   const char* libretro_video_shader_directory = getenv("LIBRETRO_VIDEO_SHADER_DIRECTORY");
  #ifdef ANDROID
     int32_t major, minor, rel;
     char device_model[PROP_VALUE_MAX]  = {0};
-@@ -1765,12 +1769,20 @@ static void frontend_unix_get_env(int *argc,
+@@ -1765,12 +1770,20 @@ static void frontend_unix_get_env(int *argc,
              "cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
     else
  #endif
@@ -174,7 +188,7 @@ index c157d355a1..ddf0b5ca87 100644
  #ifdef ASSETS_DIR
     if (path_is_directory(ASSETS_DIR "/assets"))
        fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS],
-@@ -1778,7 +1790,10 @@ static void frontend_unix_get_env(int *argc,
+@@ -1778,7 +1791,10 @@ static void frontend_unix_get_env(int *argc,
              "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
     else
  #endif
@@ -186,7 +200,7 @@ index c157d355a1..ddf0b5ca87 100644
        fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS],
              "/usr/local/share/retroarch",
              "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
-@@ -1838,7 +1853,11 @@ static void frontend_unix_get_env(int *argc,
+@@ -1838,7 +1854,11 @@ static void frontend_unix_get_env(int *argc,
              "filters/video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
     else
  #endif
@@ -199,7 +213,7 @@ index c157d355a1..ddf0b5ca87 100644
        fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER],
              "/usr/local/share/retroarch",
              "filters/video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
-@@ -1872,8 +1891,13 @@ static void frontend_unix_get_env(int *argc,
+@@ -1872,8 +1892,13 @@ static void frontend_unix_get_env(int *argc,
           "records", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT]));
     fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], base_path,
           "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
@@ -215,16 +229,33 @@ index c157d355a1..ddf0b5ca87 100644
     fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], base_path,
           "cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS]));
     fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_OVERLAY], base_path,
+@@ -1892,8 +1917,13 @@ static void frontend_unix_get_env(int *argc,
+          "saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM]));
+    fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], base_path,
+          "states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE]));
+-   fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], base_path,
+-         "system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
++   if (!string_is_empty(libretro_system_directory))
++       strlcpy(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
++	       libretro_system_directory,
++	       sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
++   else
++       fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], base_path,
++             "system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
+ #endif
+ 
+ #ifndef IS_SALAMANDER
 diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c
-index 26ed25c04f..0cc9a9dc95 100644
+index a1e5a93a32..0a51bc8df6 100644
 --- a/frontend/drivers/platform_win32.c
 +++ b/frontend/drivers/platform_win32.c
-@@ -565,24 +565,38 @@ static void frontend_win32_env_get(int *argc, char *argv[],
+@@ -565,18 +565,33 @@ static void frontend_win32_env_get(int *argc, char *argv[],
  {
     const char *tmp_dir = getenv("TMP");
     const char *libretro_directory = getenv("LIBRETRO_DIRECTORY");
 +   const char *libretro_assets_directory = getenv("LIBRETRO_ASSETS_DIRECTORY");
 +   const char* libretro_autoconfig_directory = getenv("LIBRETRO_AUTOCONFIG_DIRECTORY");
++   const char* libretro_system_directory = getenv("LIBRETRO_SYSTEM_DIRECTORY");
 +   const char* libretro_video_filter_directory = getenv("LIBRETRO_VIDEO_FILTER_DIRECTORY");
 +   const char* libretro_video_shader_directory = getenv("LIBRETRO_VIDEO_SHADER_DIRECTORY");
     if (!string_is_empty(tmp_dir))
@@ -256,14 +287,7 @@ index 26ed25c04f..0cc9a9dc95 100644
     fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS],
        ":\\cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS]));
     fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE],
-       ":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
-    fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST],
--      ":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
-+      ":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST]));
-    fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG],
-       ":\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG]));
-    fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT],
-@@ -605,12 +619,26 @@ static void frontend_win32_env_get(int *argc, char *argv[],
+@@ -605,12 +620,26 @@ static void frontend_win32_env_get(int *argc, char *argv[],
     else
        fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE],
              ":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE]));
@@ -296,3 +320,19 @@ index 26ed25c04f..0cc9a9dc95 100644
     fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS],
        ":\\downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS]));
     fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT],
+@@ -619,8 +648,13 @@ static void frontend_win32_env_get(int *argc, char *argv[],
+       ":\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM]));
+    fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE],
+       ":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE]));
+-   fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
+-      ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
++   if (!string_is_empty(libretro_system_directory))
++       strlcpy(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
++	       libretro_system_directory,
++	       sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
++   else
++       fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
++             ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
+    fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_LOGS],
+       ":\\logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS]));
+ 
