diff --git a/components/bootloader/subproject/main/esp8266.bootloader.ld b/components/bootloader/subproject/main/esp8266.bootloader.ld
index 72c5c29a..17572a53 100644
--- a/components/bootloader/subproject/main/esp8266.bootloader.ld
+++ b/components/bootloader/subproject/main/esp8266.bootloader.ld
@@ -124,3 +124,5 @@ SECTIONS
     _heap_start = ABSOLUTE(.);
   } >dram_seg
 }
+
+PROVIDE ( rtc_sys_info = 0x60001100 );
diff --git a/components/bootloader_support/src/bootloader_utility.c b/components/bootloader_support/src/bootloader_utility.c
index d0631844..de4c6663 100644
--- a/components/bootloader_support/src/bootloader_utility.c
+++ b/components/bootloader_support/src/bootloader_utility.c
@@ -493,6 +493,7 @@ static void set_cache_and_start_app(
 #include "esp_log.h"
 
 #include "esp_flash_partitions.h"
+#include "internal/esp_system_internal.h"
 
 #ifdef CONFIG_SOC_FULL_ICACHE
 #define SOC_CACHE_SIZE 1 // 32KB
@@ -512,6 +513,7 @@ bool bootloader_utility_load_partition_table(bootloader_state_t* bs)
     esp_err_t err;
     int num_partitions;
 
+    rtc_sys_info.old_sysconf_addr = 0;
 #ifdef CONFIG_ESP8266_OTA_FROM_OLD
     if (esp_patition_table_init_location()) {
         ESP_LOGE(TAG, "Failed to update partition table location");
diff --git a/components/esp8266/include/internal/esp_system_internal.h b/components/esp8266/include/internal/esp_system_internal.h
index 591d0216..b90f19ac 100644
--- a/components/esp8266/include/internal/esp_system_internal.h
+++ b/components/esp8266/include/internal/esp_system_internal.h
@@ -23,11 +23,33 @@ extern "C" {
 
 #define RTC_SYS_RAM_SIZE            256
 
+/**
+ * @brief Station's AP base information of old SDK
+ */
+struct old_ap_ssid {
+    uint32_t                    len;                    //!< SSID length
+    uint8_t                     ssid[32];               //!< SSID data
+    uint8_t                     passwd[64];             //!< password data
+} __attribute__((packed));
+
+/**
+ * @brief System information of old SDK
+ */
+struct old_sysconf {
+    uint8_t                     reserved_1[0x13C];      //!< reserved data
+    uint8_t                     ap_number;              //!< number of stored AP
+    uint8_t                     ap_index;               //!< index of current used AP
+    uint8_t                     reserved_2[0x2];        //!< reserved data
+    struct old_ap_ssid          ap_ssid[5];             //!< station's AP base information
+} __attribute__((packed));
+
 /**
  * The size of structure must not be larger than 256 bytes and all member varible must be uint32_t type
  */
 struct _rtc_sys_info {
     uint32_t        hint;   // software reset reason
+    uint32_t        old_sysconf_addr;   /*<! old SDK system configuration parameters base address, 
+                                             if your bootloader is older than v3.2, please don't use this */
 };
 
 extern struct _rtc_sys_info rtc_sys_info;
@@ -56,6 +78,13 @@ void esp_reset_reason_set_hint(esp_reset_reason_t hint);
  */
 esp_reset_reason_t esp_reset_reason_early(void);
 
+/**
+ * @brief Get old SDK configuration parameters base address
+ *
+ * @return 0 if it is not upgraded from old SDK or the absolute address of the flash 
+ */
+uint32_t esp_get_old_sysconf_addr(void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/components/esp8266/source/reset_reason.c b/components/esp8266/source/reset_reason.c
index e0f1c0c9..e47d4d5a 100644
--- a/components/esp8266/source/reset_reason.c
+++ b/components/esp8266/source/reset_reason.c
@@ -41,12 +41,8 @@ static inline void esp_reset_reason_clear_hint()
 
 static inline uint32_t esp_reset_reason_get_hint(uint32_t hw_reset)
 {
-    if (hw_reset == POWERON_RESET && rtc_sys_info.hint != ESP_RST_SW) {
-        uint32_t *p = (uint32_t *)&rtc_sys_info;
-
-        for (int i = 0; i < RTC_SYS_RAM_SIZE / sizeof(uint32_t); i++)
-            *p++ = 0;
-    }
+    if (hw_reset == POWERON_RESET && rtc_sys_info.hint != ESP_RST_SW)
+        rtc_sys_info.hint = 0;
 
     return rtc_sys_info.hint;
 }
diff --git a/components/esp8266/source/system_api.c b/components/esp8266/source/system_api.c
index e8437cf5..92f1bb28 100644
--- a/components/esp8266/source/system_api.c
+++ b/components/esp8266/source/system_api.c
@@ -17,6 +17,7 @@
 
 #include "esp_log.h"
 #include "esp_system.h"
+#include "internal/esp_system_internal.h"
 
 #include "crc.h"
 
@@ -352,3 +353,11 @@ uint32_t esp_get_minimum_free_heap_size(void)
 {
     return heap_caps_get_minimum_free_size(MALLOC_CAP_32BIT);
 }
+
+/**
+ * @brief Get old SDK configuration parameters base address
+ */
+uint32_t esp_get_old_sysconf_addr(void)
+{
+    return rtc_sys_info.old_sysconf_addr;
+}
diff --git a/components/spi_flash/port/port.c b/components/spi_flash/port/port.c
index 13816c0d..7c3011d9 100644
--- a/components/spi_flash/port/port.c
+++ b/components/spi_flash/port/port.c
@@ -27,6 +27,7 @@
 #include "esp8266/rom_functions.h"
 #include "esp8266/eagle_soc.h"
 #include "internal/phy_init_data.h"
+#include "internal/esp_system_internal.h"
 
 #define PARTITION_DATA_OFFSET   (s_v2_flash_bin_size / 2)
 
@@ -60,7 +61,7 @@ typedef union s_boot_param {
         uint8_t enhance_boot_flag : 1;
     } boot_base;
 
-    ROM_FLASH_BUF_DECLARE(__data, 32);
+    ROM_FLASH_BUF_DECLARE(__data, 1280); // To copy all old SDK configuration data
 } boot_param_t;
 
 static const char *TAG = "partition_port";
@@ -241,6 +242,9 @@ static uint32_t esp_get_updated_partition_table_addr(void)
 
     offset = s_sys_param.flag ? 1 : 0;
 
+    rtc_sys_info.old_sysconf_addr = ((s_sys_param.flag ? 0 : 1)  + sect) * SPI_FLASH_SEC_SIZE;
+    ESP_LOGD(TAG, "Set old SDK system parameter address is %x @ %p", rtc_sys_info.old_sysconf_addr, &rtc_sys_info.old_sysconf_addr);
+
     ret = spi_flash_read_data((sect + offset) * SPI_FLASH_SEC_SIZE, &s_boot_param, sizeof(boot_param_t));
     if (ret) {
         ESP_LOGE(TAG, "read V2 boot param error %d", ret);
@@ -527,11 +531,18 @@ int esp_patition_table_init_data(void *partition_info)
     const bootloader_state_t *bs = (const bootloader_state_t *)partition_info;
     const uint32_t boot_size = bs->ota[0].offset + bs->ota[0].size - boot_base;
 
+    ESP_LOGD(TAG, "OTA partition table %x %x\n", bs->ota[0].offset, bs->ota[0].size);
+
+    if (boot_size >= 0x10000000) {
+        ESP_LOGE(TAG, "OTA partition table data is error %x %x\n", bs->ota[0].offset, bs->ota[0].size);
+        return -1;
+    }
+
     if (!esp_sdk_update_from_v2())
         return 0;
 
     if (esp_get_updated_partition_table_addr() != CONFIG_PARTITION_TABLE_OFFSET) {
-        ESP_LOGD(TAG, "Copy firmware1 from %d total %d", boot_base + PARTITION_DATA_OFFSET, boot_size);
+        ESP_LOGD(TAG, "Copy firmware1 from 0x%x total %d", boot_base + PARTITION_DATA_OFFSET, boot_size);
 
         ESP_LOGI(TAG, "Start unpacking V3 firmware ...");