zte's code,first commit

Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_arch.h b/cp/ps/plat/src/oss/sup/inc/ramdump_arch.h
new file mode 100644
index 0000000..fe5fca7
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_arch.h
@@ -0,0 +1,48 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_arch.h
+* Îļþ±êʶ:     ramdump_arch.h
+* ÄÚÈÝÕªÒª:     ramdump´¦ÀíÆ÷Ïà¹Ø½Ó¿Ú/Êý¾Ý½á¹¹¶¨ÒåÍ·Îļþ
+* ʹÓ÷½·¨:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_ARCH_H
+#define _RAMDUMP_ARCH_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+extern void ramdump_arch_clean_caches(void);
+extern void ramdump_arch_clean_and_invalid_caches(void);
+extern char *ramdump_arch_store_modes_regs(char *mem);
+extern char *ramdump_arch_store_mm_regs(char *mem);
+extern void ramdump_arch_save_all_regs(void);
+
+#endif  //#ifndef _RAMDUMP_ARCH_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_collect_server.h b/cp/ps/plat/src/oss/sup/inc/ramdump_collect_server.h
new file mode 100644
index 0000000..2fea030
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_collect_server.h
@@ -0,0 +1,51 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_collect_server.h
+* Îļþ±êʶ:     ramdump_collect_server.h
+* ÄÚÈÝÕªÒª:     ramdump collect server¶ÔÍâ½Ó¿ÚÍ·Îļþ
+* ʹÓ÷½·¨:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_COLLECT_SERVER_H
+#define _RAMDUMP_COLLECT_SERVER_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+/* first except cpu id */
+extern unsigned long ramdump_except_cpu_id;
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+extern int ramdump_collect_server_icp_init(void);
+extern void ramdump_collect_server_notify_clients_dump(void);
+extern void ramdump_get_collect_server_ram_conf(
+                ramdump_ram_config_sync_msg_t *msg);
+extern unsigned long * ramdump_get_first_dump_cpu_id(void);
+extern unsigned long * ramdump_get_client_init_rsp(void);
+
+#endif  //#ifndef _RAMDUMP_COLLECT_SERVER_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_oss.h b/cp/ps/plat/src/oss/sup/inc/ramdump_oss.h
new file mode 100644
index 0000000..a208fd9
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_oss.h
@@ -0,0 +1,149 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_oss.h
+* Îļþ±êʶ:     ramdump_oss.h
+* ÄÚÈÝÕªÒª:     ramdump²Ù×÷ϵͳÒÀÀµ½Ó¿Ú/Êý¾Ý½á¹¹¶¨ÒåÍ·Îļþ
+* ʹÓ÷½·¨:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_OSS_H
+#define _RAMDUMP_OSS_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+
+#ifdef _OS_LINUX 
+#include <linux/soc/zte/rpm/rpmsg.h>
+#include <asm/io.h>
+#include <asm/current.h>
+#include <linux/string.h>
+#include <linux/sched.h>
+#include <asm/memory.h>
+#include <linux/irqflags.h>
+#include <asm/setup.h>
+#include <linux/kthread.h>
+#include <linux/bug.h>
+#include <linux/kernel.h>
+#include <asm/barrier.h>
+#include <asm/outercache.h>
+#elif defined (_OS_TOS)
+#include "oss_api.h"
+#include "drvs_rpmsg.h"
+#include "drvs_usbPoll.h"
+#include "drvs_icp.h"
+#include "ps_ephy_interface.h"
+#include "drv_api.h"
+#include <cyg/hal/tos_arm_mmu.h>
+#include <cyg/hal/tos_cache.h>
+#include "rpmsg_channel.h"
+#endif
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+#define OSS_MMAP(addr,size) ramdump_oss_mmap(addr,size)
+
+#ifdef _OS_LINUX
+
+#define OSS_PANIC(val)      panic(val)
+#define OSS_LOCK(flag)      local_irq_disable()
+#define OSS_UNLOCK(flag)    local_irq_enable()
+#define OSS_SLEEP(val)      msleep(val)
+
+#define OSS_PHY_TO_VIRT(addr) phys_to_virt(addr)
+#define OSS_VIRT_TO_PHY(addr) virt_to_phys(addr)
+#define OSS_PHY_TO_PFN(addr)  __phys_to_pfn(addr)
+#define OSS_PFN_VALID(pfn)    pfn_valid(pfn)
+
+/*
+ * to make sure ramdump init after icp device init
+ */
+#define OSS_INIT(fn) late_initcall(fn)
+#define OSS_PRINTF printk
+
+#elif defined (_OS_TOS)
+
+#define OSS_PANIC(val)                  zOss_ASSERT(0)
+#define OSS_LOCK(flag)                  ZOSS_SAVE_IRQ(flag)
+#define OSS_UNLOCK(flag)                ZOSS_RESTORE_IRQ(flag)
+#define OSS_SLEEP(val)                  zOss_Sleep(val)
+#define OSS_CREATE_THREAD(name,entry)   ramdump_oss_create_thread(name,entry)
+#define OSS_PHY_TO_VIRT(addr)           (addr)
+
+#define OSS_INIT(fn)
+#define OSS_PRINTF(fmt...) zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, fmt)
+
+#endif //#ifdef _OS_LINUX 
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+typedef ramdump_msg_t ramdump_oss_msg_t;
+
+#ifdef _OS_LINUX 
+
+typedef T_ZDrvRpMsg_ActorID ramdump_oss_icp_actorid;
+typedef T_ZDrvRpMsg_ChID ramdump_oss_icp_channelid;
+typedef T_ZDrvRpMsg_CallbackFunction ramdump_oss_icp_callback;
+typedef T_ZDrvRpMsg_Msg ramdump_oss_icp_msg;
+typedef void (*ramdump_oss_thread_entry_t)(unsigned long arg);
+
+#elif defined (_OS_TOS) //#ifdef _OS_LINUX 
+
+typedef T_ZDrvRpMsg_MsgActor ramdump_oss_icp_actorid;
+typedef T_ZDrvRpMsg_ChID ramdump_oss_icp_channelid;
+typedef T_ZDrvRpMsg_CallbackFunction ramdump_oss_icp_callback;
+typedef T_ZDrvRpMsg_Msg ramdump_oss_icp_msg;
+typedef void (*ramdump_oss_thread_entry_t)(SINT32 arg);
+
+#endif //#ifdef _OS_LINUX 
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+extern int ramdump_oss_icp_create_channel(
+            ramdump_oss_icp_actorid actorID, 
+            ramdump_oss_icp_channelid chID, 
+            unsigned int size);
+extern int ramdump_oss_icp_regcallback(
+            ramdump_oss_icp_actorid actorID, 
+            unsigned int chID, 
+            ramdump_oss_icp_callback callback);
+extern int ramdump_oss_icp_write(const ramdump_oss_icp_msg *pMsg);
+extern void ramdump_oss_data_trans_init(void);
+extern void ramdump_oss_data_trans_read (
+                unsigned char *buffer, 
+                unsigned int size);
+extern void ramdump_oss_data_trans_write(
+                unsigned char *buffer, 
+                unsigned int size);
+extern void ramdump_oss_data_trans_done(void);
+extern void ramdump_oss_error_log_creat(char *buf);
+extern int ramdump_oss_icp_send(
+            ramdump_oss_msg_t *icp_msg, 
+            unsigned int client_id,
+            unsigned int ch_id);
+extern void ramdump_oss_create_thread(
+                char *name, 
+                ramdump_oss_thread_entry_t entry);
+extern unsigned long ramdump_oss_mmap(
+                        unsigned long addr, 
+                        unsigned long size);
+
+#endif  //#ifndef _RAMDUMP_OSS_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_pub.h b/cp/ps/plat/src/oss/sup/inc/ramdump_pub.h
new file mode 100644
index 0000000..9e9d769
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_pub.h
@@ -0,0 +1,178 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_pub.h
+* Îļþ±êʶ:     ramdump_pub.h
+* ÄÚÈÝÕªÒª:     ramdump¹«¹²Í·Îļþ
+* ʹÓ÷½·¨:     #include "ramdump_pub.h"
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_PUB_H
+#define _RAMDUMP_PUB_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump.h"
+#include "ramdump_arch.h"
+#include "ramdump_soc.h"
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+#define RAMDUMP_SUCCESS (0)
+#define RAMDUMP_FAILED  (-1)
+
+#define RAMDUMP_ICP_SUCCESS (RAMDUMP_SUCCESS)
+#define RAMDUMP_ICP_FAILED  (RAMDUMP_FAILED)
+
+#define RAMDUMP_TRUE    (1)
+#define RAMDUMP_FALSE   (0)
+
+#define RAMDUMP_SYNC_RESET              (0x73787384) /* 73:I 78:N 73:I 84:T */
+#define RAMDUMP_SYNC_RAM_CONFIG_DONE    (0x68696576) /* 68:D 69:E 65:A 76:L */
+#define RAMDUMP_SYNC_RAM_CONTENT_DONE   (0x68797869) /* 68:D 79:O 78:N 69:E */
+
+#define RAMDUMP_ICP_MSG_DATA_RAMCONF_SIZE    (40)  //sizeof(ramdump_ram_conf_table_entry)
+#define RAMDUMP_RAMCONF_TABLE_MAX_ENTRYS  (RAMDUMP_RAMCONF_TABLE_MAXSIZE/RAMDUMP_ICP_MSG_DATA_RAMCONF_SIZE)
+
+/* adapt diff printf fun*/
+#define RAMDUMP_PRINTF OSS_PRINTF
+
+#define RAMDUMP_ARRAY_NR(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+#define RAMDUMP_WAIT_TIMELEN (200) /* like before,just a value roughly */
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+typedef unsigned long ramdump_msg_id_t;
+typedef unsigned long ramdump_cpu_id_t;
+typedef unsigned long *ramdump_client_done_flag_t;
+
+/*
+ * ICP MSG struct collect server with 
+ * clients and trans server.
+ */
+enum
+{
+    RAMDUMP_MSG_INIT_REQ,
+    RAMDUMP_MSG_INIT_RSP,
+    RAMDUMP_MSG_SYNC,
+    RAMDUMP_MSG_EXCEPT,
+};
+
+/* 
+ * ramdump client id 
+ * collect server : RAMDUMP_CPU_0
+ * trans server : RAMDUMP_CPU_1
+ * client1 : RAMDUMP_CPU_2
+ * client2 : RAMDUMP_CPU_3
+ */
+enum
+{
+/* 
+ * collect server/client0 : RAMDUMP_CPU_0
+ * trans server : RAMDUMP_CPU_1
+ * client1 : RAMDUMP_CPU_2
+ */
+    RAMDUMP_CPU_0,
+    RAMDUMP_CPU_1,
+    RAMDUMP_CPU_2,
+    RAMDUMP_CPU_MAX
+};
+
+/* client and server icp ram conf data */
+typedef struct
+{
+    char            name[RAMDUMP_RAMCONF_FILENAME_MAXLEN];
+    unsigned long   phy;
+    unsigned long   vir;
+    unsigned long   size;
+
+    unsigned long       flag;       /* RAMDUMP_FLAG_XXX         */
+    unsigned long       copy;       /* Copy destination address */
+    unsigned long       exter;      /* External address         */
+    ramdump_callback_t  callback;   /* Callback funtion         */
+} ramdump_ram_config_t;
+
+/* client and server icp init msg */
+typedef struct
+{
+    ramdump_ram_config_t        *array;
+    unsigned long               nr;
+    ramdump_client_done_flag_t  done_flag;
+} ramdump_ram_config_msg_t;
+
+/* collect to trans server icp msginfo */
+typedef struct
+{
+    ramdump_ram_config_msg_t    *array;
+    unsigned long               nr;
+} ramdump_ram_config_sync_msg_t;
+
+/* client and server message define */
+typedef struct
+{
+    ramdump_cpu_id_t    cpu_id;
+    ramdump_msg_id_t    msg_id;
+
+    union
+    {
+        ramdump_ram_config_msg_t        ram_config;
+        ramdump_ram_config_sync_msg_t   ram_config_sync;
+    } msg_data_t;
+} ramdump_msg_t;
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+/* 
+ * ramdump assign id array, records the true cpu id value.
+ */
+extern unsigned long ramdump_cpu_id[RAMDUMP_CPU_MAX];
+extern unsigned long ramdump_cpu_ch[RAMDUMP_CPU_MAX];
+extern char *ramdump_cpu_name[RAMDUMP_CPU_MAX];
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ÄÚÁªº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_wait_client_dump_delay
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  ms:   µÈ´ýMSÊý
+                addr: µØÖ·
+                flag: µÈ´ý±êÖ¾
+*   (´«³ö²ÎÊý)  
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     This function is used to delay certain seconds
+*******************************************************************************/
+static inline void ramdump_wait_done_delay(
+                        unsigned long           ms, 
+                        volatile unsigned long *addr, 
+                        unsigned long           flag)
+{
+    int j = 0;
+    int i = 0;
+    for (j = 0; j < RAMDUMP_DELAY_MS_COUNT; j++)
+        for (i = 0; i < ms; i++)
+            if (*addr == flag)
+                return;
+}
+
+#endif  //#ifndef _RAMDUMP_PUB_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_soc.h b/cp/ps/plat/src/oss/sup/inc/ramdump_soc.h
new file mode 100644
index 0000000..dc4db7b
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_soc.h
@@ -0,0 +1,79 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_soc.h
+* Îļþ±êʶ:     ramdump_soc.h
+* ÄÚÈÝÕªÒª:     ramdump´¦ÀíÆ÷¾ßÌåÓ²¼þSOCƽ̨Ïà¹ØÍ·Îļþ£¬Æ½Ì¨¸ü»»ºóÐèÊÊÅä
+* ʹÓ÷½·¨:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_SOC_H
+#define _RAMDUMP_SOC_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/* ramdump max file len, estimated */
+#define RAMDUMP_RAMCONF_FILENAME_MAXLEN (32)
+/* cpu name max len (string) */
+#define RAMDUMP_CPU_NAME_MAXLEN (RAMDUMP_RAMCONF_FILENAME_MAXLEN)
+/* 
+ * dump file table contens at least 60 item, 
+ * refer to all the ddr + iram + tcm sections in zx297520v2 chip menual,
+ * these sections are just what we can dump.
+ */
+#define RAMDUMP_RAMCONF_TABLE_MAXSIZE    (2400) /* 2k about, estimated */
+
+/* ramdump cmm scripts size, estimated */
+#define RAMDUMP_CMM_SIZE     (0x2000) /* 4K */
+
+/* ramdump cmm scripts size, estimated */
+#define RAMDUMP_ERROR_LOG_SIZE     (1024) 
+
+/* statics 2500 per ms, estimated */
+#define RAMDUMP_DELAY_MS_COUNT  (2500) 
+
+#ifdef __USE_RAMDUMP_TRANS_SERVER__
+/* ramdump channel number & size, estimated */
+#define RAMDUMP_CHANNEL_SIZE    (0x100) /* 4K */   //0x2000
+#define RAMDUMP_CHANNEL         (ICP_CHANNEL_RAMDUMP)
+
+/* zx297520V2 AP ram config */
+#define RAMDUMP_SERVER_DDR_BASE  (PLAT_PHYS_OFFSET) //(0x22000000) //TODO! ramconf.h
+#define RAMDUMP_SERVER_DDR_SIZE  (PLAT_PHYS_SIZE)
+
+#elif defined (__USE_RAMDUMP_CLIENT__)
+/* ramdump channel number & size, estimated */
+#define RAMDUMP_CHANNEL_SIZE    (0x100) /* 4K */ //0x2000
+#define RAMDUMP_CHANNEL         (RAMDUMP)
+
+#endif
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+#endif  //#ifndef _RAMDUMP_SOC_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/sup.h b/cp/ps/plat/src/oss/sup/inc/sup.h
new file mode 100644
index 0000000..da4dc33
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup.h
@@ -0,0 +1,114 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : supÄÚ²¿Í·Îļþ,¶¨ÒåÄÚ²¿¸÷Ä£¿é¹«¹²Êý¾Ý½á¹¹µÈ

+* ×÷    Õß : hongkun

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-10-25

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/ 

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+

+#ifndef _SUP_H

+#define _SUP_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define CHANNEL_CFG_NUM                 30

+

+#define SUP_THREAD_LIVE_BIT             1

+#define SUP_THREAD_LAZY_BIT             2

+#define SUP_THREAD_STATISTIC_INFO_BIT   4

+

+#ifdef _OS_TOS

+#define TOS_STATISTIC_TIMESLICE

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* ÄÚ´æ¹ÜÀíÄ£¿é */

+typedef struct 

+{

+    T_ZOss_Node     node;               /* Á´±í¿ØÖƽṹ     */

+    VOID            *mem;               /* ÄÚ´æÖ¸Õë         */

+    UINT32          mem_size;           /* ÄÚ´æ´óС         */

+    CHAR            name[12];           /* ÉêÇëλÖÃÎļþ     */

+    UINT32          line;               /* ÉêÇëλÖÃÐкŠ    */

+    ZOSS_THREAD_ID  thread_id;          /* ÉêÇëÏ̺߳Š      */

+    ZOSS_TASK_ID    task_id;            /* ÉêÇëÈÎÎñºÅ       */

+    UINT32          apply_time_tick;    /* ÉêÇëʱ¼ä(TICK)   */

+}T_Mem_MemNodeInfo;                     /* ϵͳÄÚ´æÐÅÏ¢     */

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+UINT32 TIMER_Init(VOID);

+UINT32 TEST_Init(VOID);

+UINT32 PSM_Init(VOID);

+UINT32 NV_Init(VOID);

+#ifdef TOS_STATISTIC_TIMESLICE

+void zOss_StatisticTimesliceStart(UINT32 time_len, UINT32 type);

+#endif

+/*ÈÎÎñ¹ÜÀíÄ£¿é */

+UINT32 SCHE_Init(VOID);

+UINT32 zOss_TaskSendDataEx(T_ZOss_TaskMsgHead *buf);

+UINT32 Sche_TaskSend(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID s_task_id, ZOSS_TASK_ID t_task_id);

+UINT32 Sche_TaskSendData(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID s_task_id, ZOSS_TASK_ID t_task_id);

+UINT32 Sche_InterruptTaskSend(UINT32 msg_id, T_ZOss_TaskMsgHead *pMsg, UINT16 msg_len, ZOSS_TASK_ID task_id);

+VOID *Sche_getBufPoint(T_ZOss_TaskMsgHead *phead);

+UINT32 Sche_getBufLength(T_ZOss_TaskMsgHead *phead);

+UINT32 Sche_DeadLoop(ZOSS_TASK_ID *task_id_arr);

+

+/* ÄÚ´æ¹ÜÀíÄ£¿é */

+UINT32 MEM_Init(VOID);

+VOID FS_Init(VOID);

+UINT32 Mem_GetSysMemDebugInfo(T_ZOss_List *mem_debug_info_lst);

+UINT32 Mem_GetUBUseInfo(T_Mem_UBPoolGrpInfo *ub_pool_grp_info, UINT8 num);

+UINT32 Mem_CheckUBLeak(T_Mem_UBLeakInfo *ub_leak_info, UINT32 ub_leak_time, UINT8 poolNum, UINT32 size);

+UINT32 Mem_ThreadUBInfo(ZOSS_THREAD_ID threadId, T_Mem_UBBlockInfo *threadUbInfo, UINT32 num, UINT8 poolNum);

+UINT32 Mem_TaskUBInfo(ZOSS_TASK_ID taskId, T_Mem_UBBlockInfo *taskUbInfo, UINT32 num, UINT8 poolNum);

+

+/* Òì³£¹ÜÀíÄ£¿é */

+UINT32 EXCEP_Init(VOID);

+VOID Excep_DaemonTask(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data);

+

+/* Ê¡µç¹³×Óº¯Êý*/

+VOID zOss_ThreadSwapInPsmHook(T_ZOsa_ThreadUserArea *user_area);

+VOID zOss_ThreadSwapOutPsmHook(T_ZOsa_ThreadUserArea *user_area);

+VOID zOss_RecordPsmLastSwapTime(VOID);

+VOID zOss_ClearSleepTime(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_H */

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent.h b/cp/ps/plat/src/oss/sup/inc/sup_agent.h
new file mode 100644
index 0000000..58e737e
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent.h
@@ -0,0 +1,77 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifndef OSAGT_H

+#define OSAGT_H

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+//¹¤¾ß×Ô¶¨ÒåµÄʼþºÅ

+#define PC_AGT_ACK                      100

+#define PC_AGT_SET_VARIABLE             101

+#define PC_AGT_GET_VARIABLE             102

+#define PC_AGT_SNAPSHOT                 103

+#define PC_AGT_STOP                     104

+#define PC_AGT_START                    105

+

+#define AGT_PC_ACK                      50

+#define AGT_PC_WINDOW_INFO_THREAD       0

+#define AGT_PC_WINDOW_INFO_EVENT        1

+#define AGT_PC_WINDOW_INFO_TIMER        2

+#define AGT_PC_WINDOW_INFO_TASK         3

+#define AGT_PC_WINDOW_INFO_RAMLOG       4

+#define AGT_PC_WINDOW_INFO_POOL         5

+#define AGT_PC_WINDOW_INFO_MMU          6

+#define AGT_PC_WINDOW_INFO_MSG          7

+#define AGT_PC_WINDOW_INFO_POOLLEAK     8

+#define AGT_PC_WINDOW_INFO_VARIABLE     9

+#define AGT_PC_WINDOW_INFO_MEM          10

+#define AGT_PC_WINDOW_INFO_CPU          11

+#define PC_WINDOW_NUM                   12

+

+#define WINDOW_OS_MAP_MAX_NUM           3

+

+//PC²à´°¿Ú±àºÅ

+#define PC_TOOL_WINDOW_THREAD           AGT_PC_WINDOW_INFO_THREAD

+#define PC_TOOL_WINDOW_EVENT            AGT_PC_WINDOW_INFO_EVENT

+#define PC_TOOL_WINDOW_TIMER            AGT_PC_WINDOW_INFO_TIMER

+#define PC_TOOL_WINDOW_TASK             AGT_PC_WINDOW_INFO_TASK

+#define PC_TOOL_WINDOW_RAMLOG           AGT_PC_WINDOW_INFO_RAMLOG

+#define PC_TOOL_WINDOW_POOL             AGT_PC_WINDOW_INFO_POOL

+#define PC_TOOL_WINDOW_MMU              AGT_PC_WINDOW_INFO_MMU

+#define PC_TOOL_WINDOW_MSG              AGT_PC_WINDOW_INFO_MSG

+#define PC_TOOL_WINDOW_POOLLEAK         AGT_PC_WINDOW_INFO_POOLLEAK

+#define PC_TOOL_WINDOW_VARIABLE         AGT_PC_WINDOW_INFO_VARIABLE

+#define PC_TOOL_WINDOW_MEM              AGT_PC_WINDOW_INFO_MEM

+#define PC_TOOL_WINDOW_CPU              AGT_PC_WINDOW_INFO_CPU

+

+//Ä¿±êÄ£¿éÃû

+#define OS_TASK_NAME               "OssMonitor"

+#endif

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_osinfopack.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_osinfopack.h
new file mode 100644
index 0000000..cf61e49
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_osinfopack.h
@@ -0,0 +1,181 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifndef OSINFOPACK_H

+#define OSINFOPACK_H

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+#include "oss_monitor.h"

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+#define NUMERIC_LEN                    4

+#define VERSION_LEN                    32

+#define FILE_LEN                       128

+#define THREAD_NAME_LEN                64

+#define TASK_NAME_LEN                  64

+#define EVENT_NAME_LEN                 64

+#define TICKSTAMP_LEN                  8

+#define MMU_NAME_LEN                   64

+#define OWNER_NAME_LEN                 64

+#define SENDER_NAME_LEN                64

+#define RECEIVER_NAME_LEN              64

+#define TIMER_EXPIRY_NUM               2

+#define TIMER_EXPIRY_LEN               4

+#define EVENT_NUM                      4

+#define EVENT_LEN                      16

+#define TASK_STATUS_NUM                4

+#define TASK_STATUS_LEN                8

+#define MMU_PERMISSION_NUM             6

+#define MMU_PERMISSION_LEN             16

+#define THREAD_STATUS_NUM              3

+#define THREAD_STATUS_LEN              8

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef struct

+{

+	char version[VERSION_LEN];

+}T_Version;

+

+typedef struct

+{

+	BYTE feq[NUMERIC_LEN];

+}T_Frequency;

+

+typedef struct

+{

+	BYTE load[NUMERIC_LEN];

+}T_CpuLoad;

+

+typedef struct

+{

+	BYTE size[NUMERIC_LEN];

+	BYTE total[NUMERIC_LEN];

+	BYTE used[NUMERIC_LEN];

+	BYTE maxUsed[NUMERIC_LEN];

+}T_Pool_Ele;

+

+typedef struct

+{

+	BYTE address[NUMERIC_LEN];

+	BYTE owner[NUMERIC_LEN];

+	BYTE timeStamp[NUMERIC_LEN];

+	char file[FILE_LEN];

+	BYTE line[NUMERIC_LEN];

+}T_Pool_Alloc_Ele, T_Pool_Leak_Ele;

+

+typedef struct

+{

+    BYTE base[NUMERIC_LEN];

+    BYTE size[NUMERIC_LEN];

+    BYTE used[NUMERIC_LEN];

+}T_Heap;

+

+typedef struct//modified by zyn

+{

+    char name[THREAD_NAME_LEN];

+    BYTE handle[NUMERIC_LEN];

+    BYTE msg_no[NUMERIC_LEN];

+    char status[THREAD_STATUS_LEN];

+    BYTE priority[NUMERIC_LEN];

+    BYTE stack_used[NUMERIC_LEN];

+    BYTE stack_max_used[NUMERIC_LEN];

+    BYTE cpu_load[NUMERIC_LEN];

+	

+}T_Thread_Ele;

+

+typedef struct //modified by zyn

+{

+    char name[TASK_NAME_LEN];

+    BYTE handle[NUMERIC_LEN];

+    BYTE thread_handle[NUMERIC_LEN];

+    char status[TASK_STATUS_LEN];

+	

+}T_Task_Ele;

+

+typedef struct //modified by zyn

+{

+    char name[EVENT_NAME_LEN];

+    char event[EVENT_LEN];

+    BYTE handle[NUMERIC_LEN];

+    BYTE tickstamp[TICKSTAMP_LEN];

+	

+}T_Event_Ele;

+

+typedef struct

+{

+	BYTE msgId[NUMERIC_LEN];

+    BYTE address[NUMERIC_LEN]; //ÆðʼµØÖ·

+	BYTE size[NUMERIC_LEN];    //³¤¶È

+    char sender[SENDER_NAME_LEN];

+    char receiver[RECEIVER_NAME_LEN];

+    BYTE timestamp[NUMERIC_LEN];

+}T_Msg_Ele;

+

+typedef struct //modified by zyn

+{

+    BYTE handle[NUMERIC_LEN];

+    BYTE start_time[NUMERIC_LEN];

+    BYTE expire_time[NUMERIC_LEN];

+    BYTE callback_func[NUMERIC_LEN];

+    char is_period[TIMER_EXPIRY_LEN];

+}T_Timer_Ele;

+

+typedef struct

+{

+	char name[MMU_NAME_LEN];

+    BYTE vir_addr[NUMERIC_LEN];

+    BYTE phy_addr[NUMERIC_LEN];

+    BYTE size[NUMERIC_LEN];

+    char attr[MMU_PERMISSION_LEN]; /* permission and access */

+}T_Mmu_Ele;

+

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_PackVersion(UINT8* code, T_ZOss_Mon_Version* version); 

+VOID zOss_MonitorAgt_PackFrequency(UINT8* code, T_ZOss_Mon_Cpu_Frequency* frequency); 

+VOID zOss_MonitorAgt_PackCpuLoad(UINT8* code, T_ZOss_Mon_Cpu_Load* cpuLoad); 

+VOID zOss_MonitorAgt_PackPoolEle(UINT8* code, T_ZOss_Mon_Pool_Ele* pool_ele);

+VOID zOss_MonitorAgt_PackPoolAllocEle(UINT8* code, T_ZOss_Mon_Pool_Alloc_Ele* pool_alloc_ele);

+VOID zOss_MonitorAgt_PackPoolLeakEle(UINT8* code, T_ZOss_Mon_Pool_Leak_Ele* pool_leak_ele);

+VOID zOss_MonitorAgt_PackHeap(UINT8* code, T_ZOss_Mon_Heap* heap);

+VOID zOss_MonitorAgt_PackThreadEle(UINT8* code, T_ZOss_Mon_Thread_Ele* thread_ele);

+VOID zOss_MonitorAgt_PackTaskEle(UINT8* code, T_ZOss_Mon_Task_Ele* task_ele);

+VOID zOss_MonitorAgt_PackEventEle(UINT8* code, T_ZOss_Mon_Event_Ele* event_ele);

+VOID zOss_MonitorAgt_PackMsgEle(UINT8* code, T_ZOss_Mon_Msg_Ele* msg_ele);

+VOID zOss_MonitorAgt_PackTimerEle(UINT8* code, T_ZOss_Mon_Timer_Ele* timer_ele);

+VOID zOss_MonitorAgt_PackMmuEle(UINT8* code, T_ZOss_Mon_Mmu_Ele* mmu_ele);

+

+#endif

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_pcmessage.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_pcmessage.h
new file mode 100644
index 0000000..6562d2f
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_pcmessage.h
@@ -0,0 +1,47 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifndef OSAGT_PCMESSAGE_H

+#define OSAGT_PCMESSAGE_H

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_PcAckReq(VOID);

+#ifdef _USE_WINCOMM_SERVER

+VOID zOss_MonitorAgt_PcSetValueReq(UINT32 len, BYTE* buf);

+VOID zOss_MonitorAgt_PcGetValueReq(UINT32 len, BYTE* buf);

+#else

+VOID zOss_MonitorAgt_PcSetValueReq(UINT16 len, BYTE* buf);

+VOID zOss_MonitorAgt_PcGetValueReq(UINT16 len, BYTE* buf);

+#endif

+VOID zOss_MonitorAgt_PcSnapshotReq(UINT8 msgId);

+VOID zOss_MonitorAgt_PcStop(VOID);

+VOID zOss_MonitorAgt_PcStart(VOID);

+

+#endif

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_status.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_status.h
new file mode 100644
index 0000000..bbdb884
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_status.h
@@ -0,0 +1,52 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+#ifndef OSAGT_STATUS_H

+#define OSAGT_STATUS_H

+#ifdef _USE_MONITOR

+

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef enum

+{

+	OsAgt_Status_Error = 0,

+    OsAgt_Status_Ok

+

+}OsAgt_Status;

+

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+OsAgt_Status zOss_MonitorAgt_CheckReceiveMessage(UINT32 msgId);

+OsAgt_Status zOss_MonitorAgt_CheckReplyMessage(UINT32 msgId);

+

+#endif

+#endif/*__OS_AGENT_STATUS_H__*/

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_toolkit.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_toolkit.h
new file mode 100644
index 0000000..b21a23f
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_toolkit.h
@@ -0,0 +1,45 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+#ifndef OSAGT_TOOLKIT_H

+#define OSAGT_TOOLKIT_H

+#ifdef _USE_MONITOR

+

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_SendMsgToOs(UINT32 id, UINT16 len, UINT8* buf);

+VOID zOss_MonitorAgt_SendDataToPcTool(UINT8* buf, UINT32 len);

+VOID zOss_MonitorAgt_CharToByteArray(char* array, const char* charStr, DWORD maxLen);

+VOID zOss_MonitorAgt_FileNameToByteArray(char* array, const char* charStr, DWORD maxLen);

+VOID zOss_MonitorAgt_SetOsTaskId(ZOSS_TASK_ID taskId);

+

+#endif

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_uemessage.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_uemessage.h
new file mode 100644
index 0000000..ec09226
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_uemessage.h
@@ -0,0 +1,45 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifndef OSAGT_UEMESSAGE_H

+#define OSAGT_UEMESSAGE_H

+#ifdef _USE_MONITOR

+

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+#include "oss_monitor.h"

+

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_InitUeMessage(VOID);

+//handle all message

+VOID zOss_MonitorAgt_UeMessageHandler(UINT32 msgId, UINT8 *buf);

+

+#endif

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_except.h b/cp/ps/plat/src/oss/sup/inc/sup_except.h
new file mode 100644
index 0000000..2530330
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_except.h
@@ -0,0 +1,92 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_except.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : P96AÒì³£¹ÜÀíÄ£¿éÍ·Îļþ

+* ×÷    Õß : ÖܹúÆÂ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007/09/04

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _SUP_EXCEP_H

+#define _SUP_EXCEP_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef  _OS_WIN

+#define snprintf                _snprintf       /* vcÊÇ_snprintf        */

+#endif

+

+#define EXCEP_DAEMONTASKNAME    "zOss_ExcepDaemonTask"

+

+#ifdef _OS_LINUX

+#       define EXCEP_IDLETHREADNAME  "swapper"

+#else

+# ifdef _USE_PSM

+#       define EXCEP_IDLETHREADNAME  "zOss_ThreadPsm"

+# else

+#   ifdef _OS_TOS

+#       define EXCEP_IDLETHREADNAME  "tos_idle_thread"

+#   else

+#       define EXCEP_IDLETHREADNAME  "zOss_ExcepIdleThread"

+#   endif

+# endif

+#endif

+

+/* ÏûÏ¢ */

+#define EV_ZOSS_EXCEP_WDT_SET       (EV_ZOSS_EXCEP_BASE + 0x10) /* ÉèÖÿ´ÃŹ·               */

+#define EV_ZOSS_EXCEP_DEADLOOPCHECK (EV_ZOSS_EXCEP_BASE + 0x13) /* ËÀÑ­»·¼ì²â               */

+#define EV_ZOSS_EXCEP_UPDATECPUTIME (EV_ZOSS_EXCEP_BASE + 0x15) /* ÉèÖøüÐÂCPUʹÓÃÂÊʱ¼ä    */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+UINT32 Excep_ErrlogWrite(const CHAR *buf, UINT32 buf_len);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_EXCEP_H */

+

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_nvm.h b/cp/ps/plat/src/oss/sup/inc/sup_nvm.h
new file mode 100644
index 0000000..2a7cafb
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_nvm.h
@@ -0,0 +1,81 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_NV

+* ÎÄ ¼þ Ãû : sup_nvm.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : NVÊý¾Ý¹ÜÀíÄ£¿é

+* ×÷    Õß : ¬л¼ª

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012-09-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é  EC:617001781798

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é   EC:617001781846 

+**************************************************************************/

+#ifndef _SUP_NVM_H

+#define _SUP_NVM_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/* NVÁ´±í½Úµã½á¹¹Ìå */

+typedef struct 

+{

+    T_ZOss_Node Node;          /* ͨÓÃÁ´±í½Úµã  */

+    T_ZOss_List Child_List;    /* ×ÓÁ´±í        */

+    UINT32      Block_Addr;    /* ¿éµØÖ·        */

+}T_NV_MAIN_NODE;               /* NVÁ´±íÖ÷½Úµã  */

+

+

+typedef struct 

+{

+    T_ZOss_Node Node;          /* ͨÓÃÁ´±í½Úµã  */

+    UINT32      Addr;          /* µØÖ·          */

+    UINT32      Len;           /* ³¤¶È          */

+}T_NV_CHILD_NODE;              /* NVÁ´±í×Ó½Úµã  */

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+UINT32 Nvram_Finish(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_NVM_H */

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_ramdump.h b/cp/ps/plat/src/oss/sup/inc/sup_ramdump.h
new file mode 100644
index 0000000..60ba364
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_ramdump.h
@@ -0,0 +1,276 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÌṩramdumpÏûÏ¢½á¹¹Ìå

+* ×÷    Õß : gaohuafeng

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2013/10/29

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+

+#ifndef _SUP_RAMDUMP_H

+#define _SUP_RAMDUMP_H

+

+#ifdef _USE_MULTI_CORE_RAMDUMP

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "drvs_icp.h"

+#include "ram_config.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* Ö¸ÁÒå */

+#define ZOSS_RAMDUMP_FILE_LINK_REQ              1   /*ͬ²½ÇëÇó*/

+#define ZOSS_RAMDUMP_FILE_LINK_RSP              2   /*ͬ²½ÇëÇóÓ¦´ð,´«ÊäramdumpµÄÎļþÊýÄ¿*/

+#define ZOSS_RAMDUMP_FILE_FILE_REQ              3   /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢*/

+#define ZOSS_RAMDUMP_FILE_FILE_RSP              4   /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢µÄÓ¦´ð£¬´«ÊäÎļþÃû¼°´óС*/

+#define ZOSS_RAMDUMP_FILE_READ_REQ              5   /*ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈÝ*/

+#define ZOSS_RAMDUMP_FILE_READ_RSP              6   /*ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈݵÄÓ¦´ð£¬´«ÊäÎļþÄÚÈÝ*/

+#define ZOSS_RAMDUMP_FILE_END_REQ               7   /*´«Êä½áÊø*/

+#define ZOSS_RAMDUMP_FILE_END_RSP               8   /*´«Êä½áÊøÓ¦´ð*/  

+

+/* ramdump×î´óÎļþÃû³¤¶È */

+#define ZOSS_RAMDUMP_FILENAME_LEN               32  

+

+/* RamdumpÎļþµÄÃû×Ö */

+#define ZOSS_RAMDUMP_DIR_NAME                   "ramdump_dir"

+

+/* ´íÎóÀàÐÍ */        

+#define ZOSS_RAMDUMP_FILE_CMD_FAIL              9   /*Ö¸Áî´íÎó*/

+#define ZOSS_RAMDUMP_FILE_NO_FAIL               10  /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅ´í*/

+#define ZOSS_RAMDUMP_FILE_LEN_FAIL              11  /*ÇëÇó´«µÝÖ¸¶¨ÎļþλÖôóС´í*/

+#define ZOSS_RAMDUMP_CMD_BUFFER_LEN             16  /*Ö¸ÁîÖ¡³¤¶È */

+

+/* ramdumpÄÚ´æ¿é´óСÅäÖÃ,ÐÞ¸ÄÅäÖÃʱעÒâÐÞ¸ÄserverºÍclientµÄ×ܹ²±ÈÀý´óС*/

+#define ZOSS_RAMDUMP_CMM_INFO_RATE               4

+#define ZOSS_RAMDUMP_CONFIGURED_REGION_RATE      4

+#define ZOSS_RAMDUMP_PARSED_REGION_RATE          4

+#define ZOSS_RAMDUMP_FILE_INFO_RATE              4

+#define ZOSS_RAMDUMP_AGENT_FILE_INFO_RATE        4

+#define ZOSS_RAMDUMP_ERR_INFO_RATE               1

+#define ZOSS_RAMDUMP_IO_READBUF_RATE             1

+#define ZOSS_RAMDUMP_IO_WRITEBUF_RATE            1

+#define ZOSS_RAMDUMP_SERVER_TOTAL_RATE          23

+#define ZOSS_RAMDUMP_CLIENT_TOTAL_RATE          17                                    

+

+#define ZOSS_RAMDUMP_FLAG_SIZE                  4

+#define ZOSS_RAMDUMP_FLAG_FIRST_VALUE           0x11111111

+#define ZOSS_RAMDUMP_FLAG_SECOND_VALUE          0x22222222

+#define ZOSS_RAMDUMP_FLAG_THIRD_VALUE           0x33333333

+#define ZOSS_RAMDUMP_FLAG_FOUR_VALUE            0x44444444

+

+/* ÏûÏ¢½»»¥ÀàÐÍ */

+#define ZOSS_RAMDUMP_INIT_TYPE                  0

+#define ZOSS_RAMDUMP_EXCPT_TYPE                 1

+#define ZOSS_RAMDUMP_DATA_READY_TYPE            2

+#define ZOSS_RAMDUMP_TEST_EXCPT_TYPE            3

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT32 cmmFileSize;

+    UINT32 cmmFileMaxSize;

+    CHAR   cmmFileBuffer[0];    /* cmmÎļþ»º³å£¬ºóÃæ»¹Óпռä */

+} T_zOss_RamdumpCmmFileInfo;

+

+typedef struct

+{

+    UINT32          srcModId;

+    UINT32          desModId;

+    T_HalIcp_Dword  intInfo;

+} T_zOss_RamdumpIcpInfo;

+

+typedef struct

+{

+    UINT32  clientId; 

+    CHAR    *pRamdumpStartAddr;

+    UINT32  ramdumpSize;  

+} T_zOss_RamdumpClientConInfo;

+

+typedef struct

+{

+    CHAR    fileName[ZOSS_RAMDUMP_FILENAME_LEN];    /* ÎļþÃû                 */

+    UINT32  baseforServer;                          /* server¶Ë¿ÉÒÔ·ÃÎʵĵØÖ· */

+    UINT32  size;                                   /* ´óС                   */

+} T_zOss_RamdumpFile;

+

+typedef struct

+{

+    UINT32              fileNum;        /* Îļþ¸öÊý         */

+    UINT32              fileMaxNum;     /* ÎļþµÄ×î´ó¸öÊý   */

+    T_zOss_RamdumpFile  fileInfo[0];    /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+} T_zOss_RamdumpFileInfo;

+

+typedef struct

+{

+    UINT32              buffLen;        /* buffµÄ´óС  */

+    CHAR                *pBuff;         /* buff µÄÖ¸Õë */

+} T_zOss_RamdumpBuffInfo;

+

+typedef struct

+{

+    UINT32  serverId; 

+    CHAR    *pRamdumpStartAddr;

+    UINT32  ramdumpSize;

+} T_zOss_RamdumpServerConInfo;

+

+/* ramdumpÏûÏ¢½á¹¹Ìå */

+typedef struct

+{

+   UINT32               regionNum;

+   UINT32               regionMaxNum;

+   T_zOss_RamdumpRegion regions[0];     /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+} T_zOss_RamdumpRegionInfo;

+

+typedef struct

+{

+    UINT32  msgType;

+    UINT32  Identifier;

+} T_zOss_RamdumpAgentMsgInfo;

+

+/* ͬ²½ÇëÇóÓ¦´ð             */

+typedef struct

+{

+    UINT32  fileNum;                    /* Òª´«ÊäµÄÎļþ¸öÊý */

+} T_zOss_RamumpFileLinkRsp;

+

+/* ¿ªÊ¼Îļþ´«ÊäÇëÇóÏûÏ¢Ìå   */

+typedef struct

+{

+    UINT32  fileNo;                     /* Îļþ±àºÅ,0¿ªÊ¼ */

+} T_zOss_RamdumpFileFileReq;

+

+/* ¿ªÊ¼Îļþ´«Ê仨ӦÏûÏ¢Ìå   */

+typedef struct

+{

+    CHAR   fileName[ZOSS_RAMDUMP_FILENAME_LEN]; /* ÎļþÃû   */

+    UINT32 size;                                /* Îļþ´óС */

+} T_zOss_RamdumpFileFileRsp;

+

+/* ¶ÁÊý¾ÝÇëÇóÏûÏ¢Ìå         */

+typedef struct

+{

+    UINT32 fileNo;      /* Îļþ±àºÅ         */

+    UINT32 offset;      /* offsetΪÊý¾ÝÆ«ÒÆ */

+    UINT32 length;      /* lengthΪÊý¾Ý³¤¶È */

+} T_zOss_RamdumpFileReadReq;

+

+typedef struct

+{

+    UINT32  msgType;

+    UINT32  srcModId;

+    CHAR    *pRamdumpStartAddr;

+    UINT32  ramdumpSize;

+} T_zOss_RamdumpClientMsgInfo;   /* ·¢ËÍÏûÏ¢ÀàÐÍ */

+

+typedef struct

+{

+    UINT32  msgType;

+    VOID    *pServerConInfo;

+} T_zOss_RamdumpServerMsgInfo;

+

+typedef struct

+{

+    UINT32                      clientId; 

+    T_zOss_RamdumpCmmFileInfo   *pCmmInfo;

+    T_zOss_RamdumpRegionInfo    *pConfigureInfo;

+    T_zOss_RamdumpRegionInfo    *pParsedInfo;

+    T_zOss_RamdumpBuffInfo      *pErrInfo;

+    volatile UINT32             clientFlagBase;                    

+} T_zOss_RamdumpClientInfo;

+

+typedef struct

+{

+    UINT32                      clientId; 

+    T_zOss_RamdumpCmmFileInfo   *pCmmInfo;

+    T_zOss_RamdumpRegionInfo    *pConfigureInfo;

+    T_zOss_RamdumpRegionInfo    *pParsedInfo;

+    T_zOss_RamdumpFileInfo      *pFileInfo;

+    T_zOss_RamdumpFileInfo      *pAgentFileInfo;

+    T_zOss_RamdumpBuffInfo      *pErrInfo;

+    T_zOss_RamdumpBuffInfo      *pIoReadbuf;

+    T_zOss_RamdumpBuffInfo      *pIoWritebuf;

+    BOOL                        *pWaitMsgFlag;

+} T_zOss_RamdumpServerInfo;

+

+typedef struct

+{

+    BOOL    exceptFlag;           /* ÊÇ·ñ·¢Éú¹ýÒì³£ */

+    UINT32  exceptCore;           /* ·¢ÉúÒì³£µÄºË   */    

+} T_zOss_RamdumpExceptInfo;       /* Òì³£ÐÅÏ¢½á¹¹Ìå */

+

+#ifdef _USE_ARM1_RAMDUMP

+typedef struct

+{

+   UINT32   startAddr;

+   UINT32   endAddr;

+   UINT32   mapAddr;

+   UINT32   copyAddr;

+} T_zOss_RamdumpArm1Region;

+

+typedef struct

+{

+  UINT32                   regionNum;

+  T_zOss_RamdumpArm1Region regions[0];

+} T_zOss_RadmumpArm1RegionInfo;

+#endif

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+VOID    zOss_RamdumpEncodeError(CHAR *pBuff, UINT16 user_called, UINT16 ecode, UINT16 extra);

+VOID    zOss_RamdumpCreateCmmFile(T_zOss_RamdumpCmmFileInfo  *pCmmFileInfo);

+CHAR    *zOss_RamdumpCreateRegionsCmmFile(CHAR *address);

+VOID    zOss_RamdumpSaveRegisters(VOID);

+UINT32  zOss_CleanCache(VOID);

+VOID    zOss_RamdumpInit(VOID);

+UINT32  zOss_RamdumpForceClientException(UINT32 coreId);

+VOID    zOss_RamdumpHandle(UINT16 user_called, UINT16 ecode, UINT16 extra);

+VOID    zOss_RamdumpSaveRegisters(VOID);

+UINT32  zOss_Cp15ReadControlRegister(VOID);

+UINT32  zOss_ReadCpsr(VOID);

+VOID    zOss_RamdumpSetUsbOpt(VOID);

+VOID    zOss_RamdumpSetIcpOpt(VOID);

+VOID    zOss_RamdumpUsbInit(VOID);

+VOID    zOss_RamdumpUsbReadData(UINT8 *buffer, UINT32 size);

+VOID    zOss_RamdumpUsbWriteData(UINT8 *buffer, UINT32 size);

+VOID    zOss_RamdumpUsbFinish(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+extern T_zOss_RamdumpOpt g_zRamdump_Optfunc;

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _USE_MULTI_CORE_RAMDUMP */

+#endif  /* _SUP_RAMDUMP_H */

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_shell.h b/cp/ps/plat/src/oss/sup/inc/sup_shell.h
new file mode 100644
index 0000000..7c5f054
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_shell.h
@@ -0,0 +1,76 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : shell¿ò¼ÜÍ·Îļþ

+* ×÷    Õß : ÖܹúÆÂ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2008-04-21 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+#ifndef _SUP_SHELL_H

+#define _SUP_SHELL_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _OS_WIN

+#define __FUNCTION__  "FUNCTION"

+#endif

+    

+#define SHELL_THREAD_NAME      "zOss_ShellThread"     /* ²âÊÔÏß³ÌÃû³Æ */

+#define T_Test_CommandMessage  T_Shell_CommandMessage

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct 

+{

+    CHAR        *cmd;

+    Shell_Func  func;

+    CHAR        *desc;

+}T_Shell_Cmd;       /* ÃüÁî½á¹¹ */

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+SINT32 Shell_StrisNumber(const CHAR *pStr);

+SINT32 Shell_isIdentifier(const CHAR *pStr);

+UINT32 Shell_GetWintracePrintFlag(VOID);

+UINT32 Shell_SetPrintFlag(UINT32 WintraceFlag);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_SHELL_H */

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_shell_cmd.h b/cp/ps/plat/src/oss/sup/inc/sup_shell_cmd.h
new file mode 100644
index 0000000..9591a61
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_shell_cmd.h
@@ -0,0 +1,118 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_cmd.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÖܹúÆÂ

+* °æ    ±¾ : v1.0

+* Íê³ÉÈÕÆÚ : 2008-04-21

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+#ifndef _SUP_SHELL_CMD_H

+#define _SUP_SHELL_CMD_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#ifdef _OS_LINUX

+#include <linux/ctype.h>

+#else

+#include <ctype.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ³£Á¿¶¨ÒåÇø

+**************************************************************************/

+#define CHAR_PRT(c)     (isgraph(c) ? (c) : '.')

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+/* »ù±¾ÃüÁî */

+extern VOID OSS_DbgShowBootInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSetWintracePrintFlag(T_Shell_CommandMessage *CmdMsg);

+

+/* ÄÚ´æ¹Û²ì */

+extern VOID OSS_DbgShowMemInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowUbInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowThreadUbInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowTaskUbInfo(T_Shell_CommandMessage *CmdMsg);

+

+/* NV */

+extern VOID OSS_DbgShowNvInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgReadNv(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgWriteNv(T_Shell_CommandMessage *CmdMsg);

+

+/* µ÷¶ÈͨѶ */

+extern VOID OSS_DbgShowThreadInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSuspendThread(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgResumeThread(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSetThreadPri(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowTaskInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowMsg(T_Shell_CommandMessage *CmdMsg);

+

+/* Òì³£ */

+extern VOID OSS_DbgDisplayThreadExecInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgDisplayThreadsExecInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSetUpdateCPUTime(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgThreadSetFlag(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgGetSysCPU(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowRegInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgRamdumpConfigRegionInfo(T_Shell_CommandMessage *CmdMsg);

+

+/* µ×²ãµ÷ÊÔÖ¸Áî */

+extern VOID OSS_DbgGetMem(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSetMem(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgReboot(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_SetUBDbgSwitch(T_Shell_CommandMessage *CmdMsg);

+extern  VOID OSA_DbgMem(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_ForceRamdump(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_DbgMemTimeLeakInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_DbgMemInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_DbgUbInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_SetMemDbgSwitch(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_DbgTrace(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgProfile(T_Shell_CommandMessage * CmdMsg);

+extern VOID OSS_OpenTraceSwitch(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_SetAssertLevel(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_StartDaemonTask(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_PsmTraceInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DfmTraceInfo(T_Shell_CommandMessage *CmdMsg);

+VOID Shell_ShowPoolInfo(T_Shell_CommandMessage *CmdMsg);

+VOID Shell_ShowProcSig(T_Shell_CommandMessage *CmdMsg);

+

+/**************************************************************************

+* È«¾Ö±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_SHELL_CMD_H */

+

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_task.h b/cp/ps/plat/src/oss/sup/inc/sup_task.h
new file mode 100644
index 0000000..37d3ed8
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_task.h
@@ -0,0 +1,116 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_task.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ¹¨Òí

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-09-12

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+#ifndef _SUP_TASK_H

+#define _SUP_TASK_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ³£Á¿¶¨ÒåÇø

+**************************************************************************/

+#define SCHE_MSG_MONI_ON        (UINT8)1            /* ÈÎÎñÏûÏ¢¼à¿Ø     */

+#define SCHE_MSG_MONI_OFF       (UINT8)0            /* ÈÎÎñÏûÏ¢²»¼à¿Ø   */ 

+#define SCHE_MAX_TICK           (UINT32)0xffffffff  /* ϵͳ×î´óTickÊý   */

+

+/* ÈÎÎñÀàÐÍ */

+#define SCHE_OSS_TASK           1                   /* ƽ̨ÈÎÎñ         */

+#define SCHE_SDL_TASK           2                   /* SDLÈÎÎñ          */

+

+#ifdef _OS_WIN

+#define SCHE_printf             printf

+#else

+#define _SUBMDL_                SUBMDL_SCHE

+#define _PRINT_LEVEL_           PRINT_LEVEL_NORMAL

+#define SCHE_printf(...)        zOss_Printf(_SUBMDL_, _PRINT_LEVEL_, ##__VA_ARGS__)

+#endif

+

+#define ZOSS_CAPT_MSG       0

+#define ZOSS_SELF_MIMO      0

+

+/* ÏûÏ¢³¤¶È */

+#define SCHE_M_TASKMSGHEAD_LEN  sizeof(T_ZOss_TaskMsgHead)  /* ÏûϢͷ³¤¶È   */

+#define SCHE_M_TASKMSGEX_LEN    sizeof(T_ZOss_TaskMsg)      /* ÏûÏ¢Ì峤¶È   */

+

+/* µ÷¶ÈÏ̵߳ǼDZí */

+#define SCHE_THREAD_TAB                                                                     \

+/*          Ïß³ÌÃû              Ïß³ÌID      Ïß³ÌÓÅÏȼ¶   ¶ÀÕ¼±êÖ¾ */                        \

+  {{0},    "zOss_ScheThread1",    NULL,       10,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread2",    NULL,       11,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread3",    NULL,       12,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread4",    NULL,       13,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread5",    NULL,       14,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread6",    NULL,       15,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread7",    NULL,       16,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread8",    NULL,       17,         1,      {0},     {0},     {0}}

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* SDLÏà¹Ø»Øµ÷º¯ÊýÀàÐÍ */

+typedef UINT32 (*Task_SEND_HOOK)(UINT32 msg_id, const VOID *buf, UINT16 msg_len, ZOSS_TASK_ID task_id, ZOSS_TASK_ID s_task_id);

+typedef UINT32 (*Task_SEND_DATA_HOOK)(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID task_id, ZOSS_TASK_ID s_task_id);

+typedef UINT32 (*Task_GET_ALL_ID_HOOK)(ZOSS_TASK_ID *task_id_arr);

+typedef ZOSS_TASK_ID (*Task_GET_ID_HOOK)(const CHAR *task_name);

+typedef CHAR *(*Task_GET_THAKNAME_HOOK)(ZOSS_TASK_ID task_id);

+

+typedef struct 

+{

+    T_ZOss_Node     node;                                   /* Ë«ÏòÁ´±í½áµã         */

+    CHAR            thread_name[ZOSS_MAX_TASKNAME_LEN + 1]; /* Ïß³ÌÃû£¬×64×Ö½Ú   */

+    ZOSS_THREAD_ID  thread_id;                              /* Ïß³ÌID               */

+    UINT32          priority;                               /* Ïß³ÌÓÅÏȼ¶           */

+    UINT8           pno;                                    /* ¶ÀÕ¼Ï̱߳ê־λ       */

+    T_ZOss_List     TCBReady;                               /* ¾ÍÐ÷ÈÎÎñÁ´±íÍ·       */

+    T_ZOss_List     TCBStopped;                             /* ×èÈûÈÎÎñÁ´±íÍ·       */

+    T_ZOss_List     TCBIdle;                                /* ¿ÕÏÐÈÎÎñÁ´±íÍ·       */

+}T_ZOss_TRF;                                                /* µ÷¶ÈÏß³ÌµÇ¼Ç±í       */

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+UINT32 Sche_SetTaskID(ZOSS_THREAD_ID threadId, VOID *taskId);

+VOID *Sche_GetTaskID(ZOSS_THREAD_ID threadId);

+

+/**************************************************************************

+* È«¾Ö±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+extern ZOSS_SEMAPHORE_ID gSche_SaticTaskInitSema;

+extern UINT32 gTask_TaskNum;

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_TASK_H */

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/makefile b/cp/ps/plat/src/oss/sup/src/makefile
new file mode 100644
index 0000000..6186f80
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/makefile
@@ -0,0 +1,216 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: ±àÒëtraceÄ£¿é

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_MDL_NAME = sup

+

+_MDL_SRC_PATH = $(PLAT_PATH)/src/oss/sup/src

+_MDL_INC_PATH = $(PLAT_PATH)/src/oss/sup/inc

+_MDL_OBJ_PATH = $(OBJ_PATH)/plat/oss/$(_MDL_NAME)

+

+#===============================================================================

+#¸÷Ä£¿éÒÀÀµ¹«¹²Í·ÎļþÉèÖÃ

+#===============================================================================

+INCLUDE += -I$(PLAT_PATH)/inc                                               \

+           -I$(PLAT_PATH)/inc/oss                                           \

+           -I$(PLAT_PATH)/inc/drv                                           \

+           -I$(PLAT_PATH)/src/oss/osa/inc                                   \

+           -I$(DRV_PATH)/include                                            \

+           -I$(COMMOM_PATH)/inc/config                                      \

+           -I$(COMMOM_PATH)/inc/config/private                              \

+           -I$(COMMOM_PATH)/inc/config/public                               \

+           -I$(COMMOM_PATH)/inc/config/atcfg                                \

+           -I$(_MDL_INC_PATH)

+

+ifeq ($(OSTYPE),tos)

+INCLUDE += -I$(PLAT_PATH)/src/oss/osa/tos/inc                               \

+		   -I$(PRJ_PATH)/config/os/tos

+endif

+

+ifeq ($(OSTYPE),linux)

+INCLUDE += -I$(PLAT_PATH)/src/oss/osa/linux/inc                             \

+		   -I$(PRJ_PATH)/config/os/linux                            \

+		   -I$(DRV_PATH)/inc/misc

+endif

+

+#===============================================================================

+#×ÓϵͳÀ©Õ¹¶¨Òå

+#===============================================================================

+DEFINE += 

+

+#===============================================================================

+#Ä£¿éÎļþÐÅÏ¢ 

+#===============================================================================

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+

+ifeq ($(USE_SERVER_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_server.c)	

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_comm.c) 

+endif

+

+ifeq ($(USE_CLIENT_RAMDUMP), yes)

+#_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_client.c)	

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_v7.c)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_client.c)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_oss.c)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_soc.c)

+ifeq ($(OSTYPE), tos)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_client_tos_adapt.c)

+endif

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_collect_server.c)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_v7_asm.S)

+endif

+			 

+ifeq ($(CPU_ARCH), armv5)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+endif

+			

+ifeq ($(CPU_ARCH), armv6)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+endif

+

+ifeq ($(CPU_ARCH), armv7-r)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+endif

+

+ifeq ($(CPU_ARCH), armv7-a)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+endif

+

+ifeq ($(CPU_ARCH), armv6-m)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_cortexm.c) 

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_cortexm_asm.S)

+endif

+

+ifeq ($(CPU_ARCH), ck610)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_csky.c)		

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_csky_asm.S)			

+endif

+

+endif

+

+ifeq ($(USE_OSS_MIN), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_assert.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_client_lib.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_agent_entry.c)                 \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_osinfopack.c)            \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_pcmessage.c)             \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_status.c)                \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_toolkit.c)               \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_uemessage.c)             \

+             $(wildcard $(_MDL_SRC_PATH)/sup_crc.c)                         \

+             $(wildcard $(_MDL_SRC_PATH)/sup_except.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_monitor.c)                     \

+             $(wildcard $(_MDL_SRC_PATH)/sup_nvm.c)                         \

+             $(wildcard $(_MDL_SRC_PATH)/sup_printf.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_ramlog.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_shell.c)                       \

+             $(wildcard $(_MDL_SRC_PATH)/sup_sys.c)                         \

+             $(wildcard $(_MDL_SRC_PATH)/sup_assert.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_task.c)

+

+ifeq ($(USE_OSS_SHELL_THREAD), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_shell_thread.c)

+endif

+

+ifeq ($(USE_OSS_SHELL_MEM), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_shell_mem.c)

+endif

+

+ifeq ($(USE_OSS_SHELL_PSM), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_shell_psm.c)

+endif

+

+ifeq ($(USE_OSS_SHELL_MISC), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_shell_misc.c)

+endif

+

+ifeq ($(USE_VSIM), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_vsim.c)

+endif

+ 

+ifeq ($(USE_VSIM_AGT), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_vsim_agt.c)

+endif

+

+endif

+

+_s_SOURCE =

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/mdl_rules.mk

+

diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_client.c b/cp/ps/plat/src/oss/sup/src/ramdump_client.c
new file mode 100644
index 0000000..399c9ce
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_client.c
@@ -0,0 +1,420 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_client.c
+* Îļþ±êʶ:     ramdump_client.c
+* ÄÚÈÝÕªÒª:     ramdump¿Í»§¶ËÒì³£ËÀ»úÏÖ³¡Êý¾Ýµ¼³öʵÏÖ
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+#ifdef __USE_CLIENT_WITH_COLLECT__
+#include "ramdump_collect_server.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿ±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+#ifdef _OS_TOS
+extern void ramdump_open_tcm_clock(void);
+#else 
+void ramdump_open_tcm_clock(void){}
+#endif
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+#define RAMDUMP_ON_DEFAULT_VAL  (1)
+
+#define RAMDUMP_CLIENT_SUCCESS (RAMDUMP_SUCCESS)
+#define RAMDUMP_CLIENT_FAILED  (RAMDUMP_FAILED)
+
+#define RAMDUMP_CLIENT_CMM_SCRNAME  "client_cmm.cmm"
+#define RAMDUMP_CLIENT_ERR_LOG      "client_error_log.txt"
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+static int ramdump_client_init_flag = RAMDUMP_FALSE;
+static int ramdump_count;
+
+/* client ram conf table */
+static ramdump_ram_config_t ramdump_client_ram_conf[RAMDUMP_RAMCONF_TABLE_MAX_ENTRYS];
+/* client ram conf data done flag*/
+static unsigned long ramdump_client_ram_conf_done_flag = RAMDUMP_SYNC_RESET;
+
+/* Cmm file content */
+static char ramdump_client_cmm_buf[RAMDUMP_CMM_SIZE];
+/* */
+static char ramdump_client_errno_log[RAMDUMP_ERROR_LOG_SIZE];
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_copy_data
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used to copy some data to the addr
+*******************************************************************************/
+static void ramdump_client_copy_data(void)
+{
+    unsigned long i_ram_conf = 0;
+
+    while (ramdump_client_ram_conf[i_ram_conf].phy != 0 && 
+           ramdump_client_ram_conf[i_ram_conf].size != 0)
+    {
+        if (ramdump_client_ram_conf[i_ram_conf].flag == RAMDUMP_FLAG_NEED_COPY &&
+            ramdump_client_ram_conf[i_ram_conf].copy != 0 &&
+           (ramdump_client_ram_conf[i_ram_conf].phy != ramdump_client_ram_conf[i_ram_conf].copy))
+            {
+            memcpy(
+                (int *)ramdump_client_ram_conf[i_ram_conf].copy,
+                (int *)ramdump_client_ram_conf[i_ram_conf].phy,
+                ramdump_client_ram_conf[i_ram_conf].size);
+            }
+        i_ram_conf++;
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_cmm_and_log_recalc
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used to create err log file
+*******************************************************************************/
+static void ramdump_client_cmm_and_log_recalc(void)
+{
+    unsigned long i_ram_conf = 0;
+
+    while (ramdump_client_ram_conf[i_ram_conf].phy != 0 && 
+           ramdump_client_ram_conf[i_ram_conf].size != 0)
+    {
+        if (ramdump_client_ram_conf[i_ram_conf].phy == (unsigned long)ramdump_client_cmm_buf)
+            ramdump_client_ram_conf[i_ram_conf].size = strlen(ramdump_client_cmm_buf);
+        else if (ramdump_client_ram_conf[i_ram_conf].phy == (unsigned long)ramdump_client_errno_log)
+            ramdump_client_ram_conf[i_ram_conf].size = strlen(ramdump_client_errno_log);
+
+        i_ram_conf++;
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_error_log_create
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used to create err log file
+*******************************************************************************/
+static void ramdump_client_error_log_create(void)
+{
+    int offset = 0;
+    unsigned long *first_dump_cpu_id = ramdump_get_first_dump_cpu_id();
+
+#ifdef __USE_CLIENT_WITH_COLLECT__
+
+    offset = sprintf(
+                ramdump_client_errno_log, 
+                "core [%s]  exact error!\n", 
+                ramdump_cpu_name[*first_dump_cpu_id]);
+
+#endif
+
+    ramdump_oss_error_log_creat(ramdump_client_errno_log + offset);
+
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_store_ram_conf
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    unsigend char*: changed addr
+* ÆäËü˵Ã÷:    This function is used to store ram conf
+*******************************************************************************/
+static char *ramdump_client_store_ram_conf(char *mem)
+{
+    unsigned long i_ram_conf = 0;
+
+    while ((ramdump_client_ram_conf[i_ram_conf].vir != 0) && 
+           (ramdump_client_ram_conf[i_ram_conf].size != 0))
+    {
+        ramdump_ram_config_t *config_entry = &ramdump_client_ram_conf[i_ram_conf];
+        if ((config_entry->phy == (unsigned long)ramdump_client_cmm_buf) ||
+            (config_entry->phy == (unsigned long)ramdump_client_errno_log))
+        {
+            i_ram_conf++;
+            continue;
+        }
+        if(config_entry->callback == NULL ||
+           (config_entry->callback != NULL &&
+           (*(config_entry->callback))() == RAMDUMP_TRUE))
+            mem += sprintf(
+                    mem,
+                    "data.load.binary &ramdump_dir\\%s 0x%lx--0x%lx /noclear\n",
+                    config_entry->name,
+                    config_entry->phy, 
+                    (config_entry->phy + config_entry->size));
+        i_ram_conf++;
+    }
+
+    return mem;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_cmm_create
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used for client to generate cmm scripts
+*******************************************************************************/
+static void ramdump_client_cmm_create(void)
+{
+    char *pcmm_buf = ramdump_client_cmm_buf;
+
+    // store the cmm BEGIN
+    pcmm_buf += sprintf(pcmm_buf, "ENTRY &ramdump_dir\n");
+    // store procmodes regs
+    pcmm_buf = ramdump_arch_store_modes_regs(pcmm_buf);
+    // store ram config 
+    pcmm_buf = ramdump_client_store_ram_conf(pcmm_buf);
+    // store memory map control regs
+    pcmm_buf = ramdump_arch_store_mm_regs(pcmm_buf);
+    // store end symbol
+    pcmm_buf += sprintf(pcmm_buf, "ENDDO\n");
+}
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_ram_conf_table_add
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) ram_name:    dump ram name
+               ram_start:   dump ram start(virtual addr)
+               ram_size:    dump ram size
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void 
+* ÆäËü˵Ã÷:    This function is used to add dump ram conf into public table
+*******************************************************************************/
+void ramdump_ram_conf_table_add(
+        char *ram_name, 
+        unsigned long ram_phy, 
+        unsigned long ram_size, 
+        unsigned long ram_virt,
+        unsigned long ram_flag,
+        unsigned long ram_extra)
+{
+    static int i_entry = 0;
+
+    if ((ram_phy == 0) && (ram_size == 0))
+        return;
+
+    strncpy(ramdump_client_ram_conf[i_entry].name, 
+            ram_name, 
+            RAMDUMP_RAMCONF_FILENAME_MAXLEN);
+    ramdump_client_ram_conf[i_entry].phy   = ram_phy;
+    ramdump_client_ram_conf[i_entry].size  = ram_size;
+    ramdump_client_ram_conf[i_entry].vir   = ram_virt;
+    ramdump_client_ram_conf[i_entry].flag  = ram_flag;
+
+    switch (ram_flag)
+    {
+        case RAMDUMP_FLAG_NEED_COPY:
+            ramdump_client_ram_conf[i_entry].copy  = ram_extra;
+            break;
+        case RAMDUMP_FLAG_HAS_EXTERNAL:
+            ramdump_client_ram_conf[i_entry].exter  = ram_extra;
+            break;
+        case RAMDUMP_FLAG_HAS_CALLBACK:
+            ramdump_client_ram_conf[i_entry].callback  = (ramdump_callback_t)ram_extra;
+            break;
+        default:
+            break;
+    }
+    
+    if (i_entry < RAMDUMP_RAMCONF_TABLE_MAX_ENTRYS - 1)
+        i_entry++;
+    else
+        i_entry = 0;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     RAMDUMP_SUCCESS
+* ÆäËü˵Ã÷:     This function is used for ramdump init
+*******************************************************************************/
+int ramdump_init(void)
+{
+    int ret = 0;
+    unsigned long *first_dump_cpu_id = 0;
+    ramdump_ram_config_sync_msg_t msg = {0};
+    char bin_name[RAMDUMP_RAMCONF_FILENAME_MAXLEN] = {0};
+
+    if (ramdump_client_init_flag == RAMDUMP_TRUE)
+        return RAMDUMP_SUCCESS;
+
+#ifdef __USE_CLIENT_WITH_COLLECT__
+
+    ret = ramdump_collect_server_icp_init();
+    if (ret != RAMDUMP_ICP_SUCCESS)
+        return ret;
+    ramdump_get_collect_server_ram_conf(&msg);
+    msg.array[RAMDUMP_CPU_0].array     = ramdump_client_ram_conf;
+    msg.array[RAMDUMP_CPU_0].nr        = RAMDUMP_RAMCONF_TABLE_MAX_ENTRYS;
+    msg.array[RAMDUMP_CPU_0].done_flag = &ramdump_client_ram_conf_done_flag;
+    /* default except core (the core with collect server)*/
+    first_dump_cpu_id = ramdump_get_first_dump_cpu_id();
+    *first_dump_cpu_id = RAMDUMP_CPU_0;
+
+    /* set client ram data done flag */
+    ramdump_client_ram_conf_done_flag = RAMDUMP_SYNC_RAM_CONFIG_DONE;
+
+    /*
+     * clean all the caches to make sure all data in ddr 
+     */
+    ramdump_arch_clean_caches();
+    
+#endif //#ifdef __USE_CLIENT_WITH_COLLECT__
+
+    /* generate dump name prefix */
+    sprintf(
+        bin_name, 
+        "%s-%s", 
+        ramdump_cpu_name[RAMDUMP_CPU_0], 
+        RAMDUMP_CLIENT_ERR_LOG);
+    ramdump_ram_conf_table_add(
+        bin_name, 
+        (unsigned long)ramdump_client_errno_log, 
+        RAMDUMP_ERROR_LOG_SIZE,
+        0,
+        0,
+        0);
+    /* generate dump name prefix */
+    memset(bin_name, 0, sizeof(bin_name));
+    sprintf(
+            bin_name, 
+            "%s-%s", 
+            ramdump_cpu_name[RAMDUMP_CPU_0], 
+            RAMDUMP_CLIENT_CMM_SCRNAME);
+    ramdump_ram_conf_table_add(
+        bin_name, 
+        (unsigned long)ramdump_client_cmm_buf, 
+        RAMDUMP_CMM_SIZE,
+        0,
+        0,
+        0);
+
+    OSS_PRINTF("Ramdump client init success!\n");
+    ramdump_client_init_flag = RAMDUMP_TRUE;
+
+    return RAMDUMP_SUCCESS;
+}
+OSS_INIT(ramdump_init);
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_client_entry
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for client ramdump entry
+*******************************************************************************/
+void ramdump_client_entry (void)
+{
+    unsigned long flags;
+
+    if (!ramdump_client_init_flag)
+        return;
+
+    if (++ramdump_count > 1)
+        while(TRUE); /* endless circle */
+
+    /*
+     * we need lock the irq, this can`t be interrupt.
+     */
+    OSS_LOCK(flags);
+
+    /*
+     * save all regs first.
+     */
+    ramdump_arch_save_all_regs();
+
+    /* open tcm clock */
+    ramdump_open_tcm_clock();
+
+    /* t32 cmm scripts */
+    ramdump_client_cmm_create();
+    /* err info file */
+    ramdump_client_error_log_create();
+
+    /* special data copy to the copy addr
+     * then other core read from the copy addr
+     */
+    ramdump_client_copy_data();
+    /* recalc client cmm and err_log size */
+    ramdump_client_cmm_and_log_recalc();
+    /* set client ram data done flag */
+    ramdump_client_ram_conf_done_flag = RAMDUMP_SYNC_RAM_CONTENT_DONE;
+
+    /* clean all the caches to make sure all data in ddr */
+    ramdump_arch_clean_caches();
+
+#ifdef __USE_CLIENT_WITH_COLLECT__
+    ramdump_collect_server_notify_clients_dump();
+#endif
+
+    /*
+     * TODO! 
+     * now endless circle, e.g., config restart or not is more better.
+     */
+    while (TRUE);
+
+    OSS_UNLOCK(flags);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_client_tos_adapt.c b/cp/ps/plat/src/oss/sup/src/ramdump_client_tos_adapt.c
new file mode 100644
index 0000000..ecb44c5
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_client_tos_adapt.c
@@ -0,0 +1,250 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_client_tos_adapt.c
+* Îļþ±êʶ:     ramdump_client_tos_adapt.c
+* ÄÚÈÝÕªÒª:     ramdump¿Í»§¶ËÒÀÀµÌض¨²Ù×÷ϵͳTOSµÄÊÊÅä´úÂë
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+#include "ramdump_collect_server.h"
+
+#include "sys_func_atcfg.h"
+#include "drvs_sys.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                 Íⲿº¯ÊýÉùÃ÷                                 *
+*******************************************************************************/
+extern void ramdump_client_entry (void);
+extern VOID zDrvWdt_Stop(VOID);
+extern int ramdump_init(void);
+extern SINT32 zSys_ExceptReboot(UINT32 except_cpu);
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+#define RAMDUMP_CLIENT_BIN_DEFNAME      "client_"
+#define RAMDUMP_CLIENT_INIT_RSP_DONE    (0x68797869) /* 68:D 79:O 78:N 69:E */
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/* just adapt code for tos. 
+ * TODO!
+ * will be delete in the future.
+ */
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     zOss_RamdumpInit
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump init
+*******************************************************************************/
+void zOss_RamdumpInit(void)
+{
+    T_ZDrvSys_PowerOn_Type powOnType;
+    unsigned long *client_done_flag;
+    ramdump_init();
+
+    //powOnType = zDrvComm_GetPowerOnState();
+    //if(POWER_ON_FOTA == powOnType || POWER_ON_CHARGING == powOnType)
+    //    return;   
+
+    /* set phy done flag*/
+    client_done_flag = ramdump_get_client_init_rsp();
+    client_done_flag[RAMDUMP_CPU_2] = RAMDUMP_CLIENT_INIT_RSP_DONE;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     zOss_RamdumpConfigureMem
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  regionInfo: dump ram config 
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump config dump ram
+*******************************************************************************/
+VOID zOss_RamdumpConfigureMem(T_zOss_RamdumpRegion *regionInfo)
+{
+    char ram_name[RAMDUMP_RAMCONF_FILENAME_MAXLEN] = {0};
+    /* generate dump name prefix */
+    sprintf(ram_name, 
+            "%s-%s0x%lx.bin", 
+            ramdump_cpu_name[RAMDUMP_CPU_0], 
+            RAMDUMP_CLIENT_BIN_DEFNAME, 
+            regionInfo->baseForSelf);
+    if (regionInfo->baseForCopy != 0 &&
+        regionInfo->baseForCopy != regionInfo->baseForSelf)
+        ramdump_ram_conf_table_add(
+            ram_name,
+            regionInfo->baseForSelf, 
+            regionInfo->size,
+            0,
+            RAMDUMP_FLAG_NEED_COPY,
+            regionInfo->baseForCopy);
+    else if (regionInfo->baseForServer != 0 &&
+             regionInfo->baseForServer != regionInfo->baseForSelf)
+        ramdump_ram_conf_table_add(
+            ram_name,
+            regionInfo->baseForSelf, 
+            regionInfo->size,
+            0,
+            RAMDUMP_FLAG_HAS_EXTERNAL,
+            regionInfo->baseForServer);
+    else
+        ramdump_ram_conf_table_add(
+            ram_name,
+            regionInfo->baseForSelf, 
+            regionInfo->size,
+            0,
+            RAMDUMP_FLAG_NONE,
+            0);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    zOss_RamdumpHandle
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) user_called: not used 
+               ecode: not used 
+               extra: not used 
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void 
+* ÆäËü˵Ã÷:    This function is used for enter ramdump
+*******************************************************************************/
+VOID zOss_RamdumpHandle(UINT16 user_called, UINT16 ecode, UINT16 extra)
+{
+    static UINT32  excepNum = 0;
+    ZOSS_INTR      old_intr;
+
+    ZOSS_SAVE_IRQ(old_intr); 
+    if(++excepNum > 1)          /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */
+    {
+        for ( ; ; ) ;
+    }
+
+    if (zOss_GetExceptResetFlag() != EXCEPT_RESET_ENABLE)
+    {
+#ifdef _WDT_RST
+        zDrvWdt_Stop();
+#endif
+        /* Ö´ÐÐramdumpÒì³£´¦Àíº¯Êý */
+        ramdump_client_entry();
+        for ( ; ; ) ;
+    }
+    else
+    {
+        //except_RecordExceptInfo(s_zRamdump_ServerCfgInfo.serverId);
+        zSys_ExceptReboot((*ramdump_get_first_dump_cpu_id()));
+    }
+    
+    ZOSS_RESTORE_IRQ(old_intr);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     zOss_RamdumpForceClientException
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  coreId: core id
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     SUCCESS
+* ÆäËü˵Ã÷:     This function is used for forced ramdump 
+*******************************************************************************/
+UINT32 zOss_RamdumpForceClientException(UINT32 coreId)
+{
+    OSS_PANIC(RAMDUMP_TRUE);
+    return RAMDUMP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     Osa_SysErrHndInit
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  VOID
+*   (´«³ö²ÎÊý)  VOID
+* ·µ »Ø Öµ:     VOID
+* ÆäËü˵Ã÷:     This function is used for Osa_SysErrHndInit
+*******************************************************************************/
+VOID Osa_SysErrHndInit(VOID)
+{
+
+}
+
+/**************************************************************************
+ * º¯ÊýÃû³Æ£º   ramdump_ProcessMsgFromZsp
+ * ¹¦ÄÜÃèÊö£º   server ´¦ÀízspµÄICPÏûÏ¢º¯Êý
+ * ²ÎÊý˵Ã÷£º
+*   (´«Èë²ÎÊý)  pMsg: ic msg buf
+*   (´«³ö²ÎÊý)  void
+ * ·µ »Ø Öµ£º   void   
+ * ÆäËü˵Ã÷£º   void
+**************************************************************************/
+VOID zOss_Ramdump_ProcessMsgFromZsp(VOID *buf, UINT32 len)
+{
+    UINT32 *first_dump_cpu_id = ramdump_get_first_dump_cpu_id();
+
+    OSS_PRINTF("Ramdump client ps recevived forced dump request from zsp!\n");
+
+    *first_dump_cpu_id = RAMDUMP_CPU_2;
+    zOss_RamdumpHandle(1, 1, 1);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_open_tcm_clock
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  VOID
+*   (´«³ö²ÎÊý)  VOID
+* ·µ »Ø Öµ:     VOID
+* ÆäËü˵Ã÷:     This function is used for open tcm clock
+*******************************************************************************/
+void ramdump_open_tcm_clock(void)
+{
+#ifdef _USE_TCM
+    if (!zDrvSysClk_IsEnable(CLK_FROMMATIRX_ACLK))
+        zDrvSysClk_SetGate(CLK_FROMMATIRX_ACLK, SYSCLK_ENABLE);
+    if (!zDrvSysClk_IsEnable(CLK_AXI2AXI_APB_AS_FOR_TCM))
+        zDrvSysClk_SetGate(CLK_AXI2AXI_APB_AS_FOR_TCM, SYSCLK_ENABLE);  
+#endif
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_collect_server.c b/cp/ps/plat/src/oss/sup/src/ramdump_collect_server.c
new file mode 100644
index 0000000..e9a5809
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_collect_server.c
@@ -0,0 +1,405 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_collect_server.c
+* Îļþ±êʶ:     ramdump_collect_server.c
+* ÄÚÈÝÕªÒª:     ramdump collect·þÎñ¶ËÊý¾ÝÊÕ¼¯´«µÝʵÏÖ
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+#ifdef _OS_TOS
+extern VOID zOss_Ramdump_ProcessMsgFromZsp(const T_HalIcp_Msg *pMsg);
+#endif
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+#define RAMDUMP_ARRAY_BEG(arr) &(arr[0])
+#define RAMDUMP_ARRAY_END(arr) &(arr[RAMDUMP_ARRAY_NR(arr)])
+
+#define RAMDUMP_WAIT_CLIENT_TIMELEN (200) /* like before,just a value roughly */
+#define RAMDUMP_SLEEP_TIME (5) /* 5 ms */
+
+#define RAMDUMP_CLIENT_INIT_RSP_DONE    (0x68797869) /* 68:D 79:O 78:N 69:E */
+#define RAMDUMP_CALLBACK_INIT_DONE      1
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+typedef int (*ramdump_initcall_t)(void);
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+static int ramdump_cpu1_icp_init(void);
+static int ramdump_cpu2_icp_init(void);
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+/* store collect ram config */
+static ramdump_ram_config_msg_t ramdump_collected_ram_conf_tables[RAMDUMP_CPU_MAX];
+
+/* store client icp init fun, expandable */
+static ramdump_initcall_t ramdump_client_icp_initcalls[RAMDUMP_CPU_MAX] = 
+{NULL, ramdump_cpu1_icp_init,ramdump_cpu2_icp_init};
+
+/* first except cpu id */
+static unsigned long ramdump_except_cpu_id;
+
+/* init rsp done flag for all clients */
+static volatile unsigned long ramdump_client_init_rsp[RAMDUMP_CPU_MAX];
+
+static volatile long ramdump_callback_init_rsp[RAMDUMP_CPU_MAX];
+
+static volatile int ramdumpCfgFinished;
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_icp_to_collect_server_handle
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  buf: icp msg point
+*               len: icp msg length
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp msg handle, common entry
+*******************************************************************************/
+static void ramdump_icp_to_collect_server_handle(
+                void *buf, 
+                unsigned int len)
+{
+    ramdump_msg_t *icp_msg;
+
+	icp_msg = buf;
+
+    switch(icp_msg->msg_id)
+    {
+        case RAMDUMP_MSG_INIT_RSP:
+        {
+            ramdump_ram_config_msg_t *table_entry = &(ramdump_collected_ram_conf_tables[icp_msg->cpu_id]);
+
+            /* invalid cpu id */
+            if ((icp_msg->cpu_id < RAMDUMP_CPU_0) || 
+                (icp_msg->cpu_id >= RAMDUMP_CPU_MAX))
+                while (RAMDUMP_TRUE);
+
+            /* client ram conf collect */
+            table_entry->array     = icp_msg->msg_data_t.ram_config.array;
+            table_entry->nr        = icp_msg->msg_data_t.ram_config.nr;
+            table_entry->done_flag = icp_msg->msg_data_t.ram_config.done_flag;
+
+            ramdump_client_init_rsp[icp_msg->cpu_id] = RAMDUMP_CLIENT_INIT_RSP_DONE;
+
+            break;
+        }
+
+        case RAMDUMP_MSG_EXCEPT:
+        {
+#ifndef __USE_TRANS_WITH_COLLECT__
+
+            if (ramdump_except_cpu_id == 0)
+                ramdump_except_cpu_id = icp_msg->cpu_id;
+
+#endif
+
+            OSS_PANIC("collect server received forced dump request from client!\n");
+            break;
+        }
+
+        default:
+            break;
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_cpu1_icp_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     SUCCESS or FAILED
+* ÆäËü˵Ã÷:     This function is used for ramdump client1 icp init (now is cp)
+*******************************************************************************/
+static int ramdump_cpu1_icp_init(void)
+{
+    int ret = 0;
+
+    ret = ramdump_oss_icp_create_channel(
+            ramdump_cpu_id[RAMDUMP_CPU_1], 
+            ramdump_cpu_ch[RAMDUMP_CPU_1], 
+            RAMDUMP_CHANNEL_SIZE);
+    if (ret != RAMDUMP_SUCCESS) 
+        return ret;
+
+    ret = ramdump_oss_icp_regcallback(
+            ramdump_cpu_id[RAMDUMP_CPU_1], 
+            ramdump_cpu_ch[RAMDUMP_CPU_1], 
+            (ramdump_oss_icp_callback)ramdump_icp_to_collect_server_handle);
+    if (ret != RAMDUMP_SUCCESS) 
+        return ret;
+
+    return RAMDUMP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_cpu2_icp_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     SUCCESS or FAILED
+* ÆäËü˵Ã÷:     This function is used for ramdump client2 icp init (now is zsp)
+*******************************************************************************/
+static int ramdump_cpu2_icp_init(void)
+{
+    int ret = 0;
+
+    ret = ramdump_oss_icp_create_channel(
+            ramdump_cpu_id[RAMDUMP_CPU_2], 
+            ramdump_cpu_ch[RAMDUMP_CPU_2], 
+            0x40);
+    if (ret != RAMDUMP_SUCCESS) 
+        return ret;
+
+#ifdef _OS_TOS
+
+    ret = ramdump_oss_icp_regcallback(
+            ramdump_cpu_id[RAMDUMP_CPU_2],
+            ramdump_cpu_ch[RAMDUMP_CPU_2], 
+            (ramdump_oss_icp_callback)zOss_Ramdump_ProcessMsgFromZsp);
+
+#else
+
+    ret = ramdump_oss_icp_regcallback(
+            ramdump_cpu_id[RAMDUMP_CPU_2], 
+            ramdump_cpu_ch[RAMDUMP_CPU_2], 
+            (ramdump_oss_icp_callback)ramdump_icp_to_collect_server_handle);
+
+#endif
+
+    if (ret != RAMDUMP_SUCCESS) 
+        return ret;
+
+    return RAMDUMP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_cpu_id_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for collect server to init cpu_id
+*******************************************************************************/
+static void ramdump_cpu_id_init(void)
+{
+    /* init interactive cpu id */
+#ifdef __USE_CLIENT_WITH_COLLECT__
+    ramdump_cpu_id[RAMDUMP_CPU_1] = ICP_MSG_ACTOR_A9;
+    ramdump_cpu_id[RAMDUMP_CPU_2] = ICP_MSG_ACTOR_ZSP;
+	ramdump_cpu_ch[RAMDUMP_CPU_1] = RAMDUMP;
+	ramdump_cpu_ch[RAMDUMP_CPU_2] = RP_MSG_PS_PHY_RAMDUMP;
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_icp_callback_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for collect server to init callback
+*******************************************************************************/
+static void ramdump_icp_callback_init(void)
+{
+    int index;
+    for (index = 0; index < RAMDUMP_CPU_MAX; index++)
+    {
+        if (ramdump_client_icp_initcalls[index] != NULL)
+        {
+            if (ramdump_client_icp_initcalls[index]() == RAMDUMP_ICP_SUCCESS)
+                ramdump_callback_init_rsp[index] = RAMDUMP_CALLBACK_INIT_DONE;        
+        }
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_collect_server_thread_entry
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  arg: thread entry arguments
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump collect server icp init entry
+*******************************************************************************/
+static void ramdump_collect_server_thread_entry(int arg)
+{
+    int index = 0;
+    ramdump_msg_t icp_msg = {0};
+    ramdump_msg_t icp_msg_sync = {0};
+
+    for (index = 0; index < RAMDUMP_CPU_MAX; index++)
+    {
+        if (ramdump_callback_init_rsp[index] == RAMDUMP_CALLBACK_INIT_DONE)
+        {
+            /* init request */
+            icp_msg.msg_id = RAMDUMP_MSG_INIT_REQ;
+            icp_msg.cpu_id = ramdump_cpu_id[RAMDUMP_CPU_0]; /* collect server cpu_id */
+            /* send init req until success */
+            while (ramdump_oss_icp_send(&icp_msg, ramdump_cpu_id[index], ramdump_cpu_ch[index]) != RAMDUMP_ICP_SUCCESS)
+                OSS_SLEEP(RAMDUMP_SLEEP_TIME);//sleep 1 ms
+                /* wait init rsp until done */
+            while (ramdump_client_init_rsp[index] != RAMDUMP_CLIENT_INIT_RSP_DONE) 
+                OSS_SLEEP(RAMDUMP_SLEEP_TIME);//sleep 1 ms
+        }
+    }
+
+#ifndef __USE_TRANS_WITH_COLLECT__
+
+    /* sync with trans server */
+    icp_msg_sync.msg_id = RAMDUMP_MSG_SYNC;
+    icp_msg_sync.cpu_id = ramdump_cpu_id[RAMDUMP_CPU_0]; /* collect server cpu_id */
+
+    icp_msg_sync.msg_data_t.ram_config_sync.array = ramdump_collected_ram_conf_tables;
+    icp_msg_sync.msg_data_t.ram_config_sync.nr    = RAMDUMP_CPU_MAX;
+
+    while (!ramdumpCfgFinished || ramdump_oss_icp_send(&icp_msg_sync, ramdump_cpu_id[RAMDUMP_CPU_1], ramdump_cpu_ch[RAMDUMP_CPU_1]) != RAMDUMP_ICP_SUCCESS)
+        OSS_SLEEP(RAMDUMP_SLEEP_TIME);//sleep 1 ms
+
+    /* resolve trans server modify will be covered by caches */
+    ramdump_arch_clean_and_invalid_caches();
+#endif
+}
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_config_finished
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is called for ramdump config finished
+*******************************************************************************/
+void ramdump_config_finished(void)
+{
+    ramdumpCfgFinished = 1;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_collect_server_icp_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     SUCCESS
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp init
+*******************************************************************************/
+int ramdump_collect_server_icp_init(void)
+{
+    ramdump_cpu_id_init();
+    
+    ramdump_icp_callback_init();
+
+    /* create thread sync cpu init */
+    OSS_CREATE_THREAD("collect_server_sync_thread",(ramdump_oss_thread_entry_t)ramdump_collect_server_thread_entry);
+ 
+    return RAMDUMP_ICP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_collect_server_notify_clients_dump
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp init
+*******************************************************************************/
+void ramdump_collect_server_notify_clients_dump(void)
+{
+    int cpu_id = 1;
+    ramdump_msg_t icp_msg = {0};
+    
+    while (cpu_id < RAMDUMP_CPU_MAX)
+    {
+        /* init request */
+        icp_msg.msg_id = RAMDUMP_MSG_EXCEPT;
+        icp_msg.cpu_id = ramdump_cpu_id[RAMDUMP_CPU_0]; /* collect server cpu_id */
+        ramdump_oss_icp_send(&icp_msg, ramdump_cpu_id[cpu_id], ramdump_cpu_ch[cpu_id]);
+        cpu_id++;
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_get_collect_server_ram_conf
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  msg: ram_conf
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp init
+*******************************************************************************/
+void ramdump_get_collect_server_ram_conf(ramdump_ram_config_sync_msg_t *msg)
+{
+    msg->array = ramdump_collected_ram_conf_tables;
+    msg->nr = RAMDUMP_CPU_MAX;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_get_first_dump_cpu_id
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long*: cpu id address
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp init
+*******************************************************************************/
+unsigned long * ramdump_get_first_dump_cpu_id(void)
+{
+    return &ramdump_except_cpu_id;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_get_client_init_rsp
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long*: cpu id address
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+volatile unsigned long * ramdump_get_client_init_rsp(void)
+{
+    return ramdump_client_init_rsp;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_oss.c b/cp/ps/plat/src/oss/sup/src/ramdump_oss.c
new file mode 100644
index 0000000..0739af0
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_oss.c
@@ -0,0 +1,363 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_oss.c
+* Îļþ±êʶ:     ramdump_oss.c
+* ÄÚÈÝÕªÒª:     ramdump²Ù×÷ϵͳÒÀÀµ½Ó¿Ú/Êý¾Ý½á¹¹¶¨ÒåÍ·Îļþ
+* ʹÓ÷½·¨:     Èç¹û¸ü»»²Ù×÷ϵͳ£¬¸ÄÍ·ÎļþÄÚ½Ó¿Ú»òÕßÊý¾Ý¶¨ÒåÐèÒªÖØÐÂÊÊÅä
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+#ifdef _OS_LINUX 
+/* icp api */  
+extern int zDrvRpMsg_CreateChannel(
+              T_ZDrvRpMsg_ActorID actorID, 
+              T_ZDrvRpMsg_ChID chID, 
+              unsigned int size);
+extern int zDrvRpMsg_RegCallBack(
+              T_ZDrvRpMsg_ActorID actorID, 
+              unsigned int chID, 
+              T_ZDrvRpMsg_CallbackFunction callback);
+extern int zDrvRpMsg_WriteLockIrq(const T_ZDrvRpMsg_Msg *pMsg);
+extern void panic(const char *fmt, ...);
+
+extern int zDrvUsbPoll_Init(void);
+extern int zDrvUsbPoll_Isr(void);
+extern bool zDrvUsbPoll_isConnect(void);
+extern int zDrvUsbPoll_Read(unsigned char* pBuf,unsigned long length);
+extern int zDrvUsbPoll_Write(unsigned char* pBuf,unsigned long length);
+#elif defined (_OS_TOS)
+
+extern char *ramdump_error_log_exp(char *mem);
+#endif //#ifdef _OS_LINUX 
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_create_thread
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_create_thread (
+        char *name, 
+        ramdump_oss_thread_entry_t entry)
+{
+#ifdef _OS_TOS
+#define RAMDUMP_THREAD_STACK_DEF_SIZE 2048
+#define RAMDUMP_THREAD_DEF_PRIO 20
+#define RAMDUMP_THREAD_DEF_ARG 0
+#define RAMDUMP_THREAD_AUTORUN 1
+#define RAMDUMP_THREAD_PREEMPT 1
+
+    zOss_CreateThread(
+        name,entry, 
+        RAMDUMP_THREAD_DEF_ARG,
+        RAMDUMP_THREAD_STACK_DEF_SIZE,
+        RAMDUMP_THREAD_DEF_PRIO,
+        RAMDUMP_THREAD_PREEMPT,
+        RAMDUMP_THREAD_AUTORUN);
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_mmap
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+unsigned long ramdump_oss_mmap (unsigned long addr, unsigned long size)
+{
+#ifdef _OS_LINUX
+    return ioremap(addr,size);
+#elif defined (_OS_TOS)
+
+#ifdef __USE_MMU__
+    T_zTos_MmuRamdumpTable mmuTable = {0};
+    zTos_MmuGetMappingRegion(addr, size, &mmuTable);
+    /* 
+     * TODO!
+     * current tos mmap one to one
+     * need new API like ioremap realize
+     */
+    return addr;
+#endif
+
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_oss_icp_send
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) icp_msg: msg info
+               client_id: client id
+               ch_id: channel id
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    int: if msg send success 
+* ÆäËü˵Ã÷:    This function is used for server to send msg to client
+*******************************************************************************/
+int ramdump_oss_icp_send(ramdump_oss_msg_t *icp_msg, unsigned int client_id, unsigned int ch_id)
+{
+    int ret;
+    ramdump_oss_icp_msg rpmsg = {0};
+
+    rpmsg.actorID = client_id;
+    rpmsg.chID = ch_id;
+    rpmsg.flag = 1;
+    rpmsg.buf = icp_msg;
+    rpmsg.len = sizeof(*icp_msg);
+
+    /*
+     * clean all the caches to make sure all data in ddr 
+     */
+    ramdump_arch_clean_caches();
+
+    ret = ramdump_oss_icp_write(&rpmsg);
+
+    if (ret != rpmsg.len)
+    {
+#ifdef _OS_LINUX
+        OSS_PRINTF(
+            "[ramdump] icpmsg send fail, ret != rpmsg.len[ret:%d], [client_id:%d]\n", 
+            ret, 
+            client_id);
+#elif defined (_OS_TOS)
+        OSS_PRINTF(
+            "[ramdump] icpmsg send fail, ret != rpmsg.len[ret:%d], [client_id:%d]\n", 
+            ret,
+            client_id);
+#endif
+        return ret;
+    }
+
+    return RAMDUMP_ICP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_error_log_creat
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  buf : addr point
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_error_log_creat(char *buf)
+{
+#ifdef _OS_LINUX
+    if (current->mm != NULL)
+        sprintf(
+            buf, 
+            " dump at user, app name is: %s, load addr is: %lu \n", 
+            current->comm, 
+            current->mm->start_code);
+    else
+        sprintf(
+            buf,
+            " dump at kernel, app name is: %s \n", 
+            current->comm);
+#elif defined (_OS_TOS)
+	ramdump_error_log_exp(buf);
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_oss_icp_create_channel
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) actorID: icp send core id
+               chID:    icp channel id
+               size:    icp channel size
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    int: if msg send success 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+int ramdump_oss_icp_create_channel(
+        ramdump_oss_icp_actorid actorID, 
+        ramdump_oss_icp_channelid chID, 
+        unsigned int size)
+{
+    return zDrvRpMsg_CreateChannel(actorID, chID, size);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_oss_icp_regcallback
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) actorID: icp send core id
+               chID:    icp channel id
+               callback:icp callback fun
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    int: if msg send success 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+int ramdump_oss_icp_regcallback (
+        ramdump_oss_icp_actorid actorID, 
+        unsigned int chID, 
+        ramdump_oss_icp_callback callback)
+{
+    return zDrvRpMsg_RegCallBack(actorID,chID,callback);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_oss_icp_write
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) pMsg: icp send msg
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    int: if msg send success 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+int ramdump_oss_icp_write(const ramdump_oss_icp_msg *pMsg)
+{
+#ifdef _OS_LINUX
+    return zDrvRpMsg_Write(pMsg);
+#elif defined (_OS_TOS)
+    if (pMsg->actorID == ramdump_cpu_id[RAMDUMP_CPU_2])
+    {
+        switch (((ramdump_msg_t *)(pMsg->buf))->msg_id)
+        {
+            case RAMDUMP_MSG_EXCEPT:
+            {
+                return zDrvRpMsg_WriteLockIrq(pMsg);
+            }
+            case RAMDUMP_MSG_SYNC:
+            default:
+                return pMsg->len;
+        }
+    }
+    else
+        return zDrvRpMsg_WriteLockIrq(pMsg);
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_data_trans_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_data_trans_init(void)
+{
+#ifdef _OS_LINUX 
+    zDrvUsbPoll_Init();                 /* ³õʼ»¯USB        */
+    while (!zDrvUsbPoll_isConnect()) ;  /* ²éѯUSBÊÇ·ñÁ¬½Ó  */
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_data_trans_read
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) buffer: data buff
+               size:   data size
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_data_trans_read(unsigned char *buffer, unsigned int size)
+{
+#ifdef _OS_LINUX 
+    unsigned int count = 0;
+
+    do
+    {
+        zDrvUsbPoll_Isr();
+        count = (unsigned int)zDrvUsbPoll_Read(buffer, size);
+        if ( size <= count)
+        {
+            break;
+        }        
+        buffer += count;
+        size -=count;
+    }
+    while (size > 0);
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_data_trans_write
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) buffer: data buff
+               size:   data size
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_data_trans_write(unsigned char *buffer, unsigned int size)
+{
+#ifdef _OS_LINUX 
+    unsigned int count = 0;
+
+    while (size > 0)
+    {
+        zDrvUsbPoll_Isr();
+        count = (unsigned int)zDrvUsbPoll_Write(buffer, size);
+        if ( size <= count)
+        {
+            break;
+        }
+        
+        buffer += count;
+        size -=count;
+    }
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_data_trans_done
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_data_trans_done(void)
+{
+#ifdef _OS_LINUX     
+    /* µÈ´ýÊý¾Ý·¢ËÍÍêºó£¬ÔÙÖØÆô */
+    zDrvUsbPoll_Isr();
+#endif
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_soc.c b/cp/ps/plat/src/oss/sup/src/ramdump_soc.c
new file mode 100644
index 0000000..3eeb1bf
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_soc.c
@@ -0,0 +1,66 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_soc_7520v2.c
+* Îļþ±êʶ:     ramdump_soc_7520v2.c
+* ÄÚÈÝÕªÒª:     ramdump´¦ÀíÆ÷Ïà¹Ø½Ó¿Ú/Êý¾Ý¶¨ÒåʵÏÖ
+* ʹÓ÷½·¨:     Èç¹û¸ü»»´¦ÀíÆ÷£¬¸ÄÍ·ÎļþÄÚ½Ó¿Ú»òÕßÊý¾Ý¶¨ÒåÐèÒªÖØÐÂÊÊÅä
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+/* 
+ * collect server/client* : RAMDUMP_CPU_0
+ * trans server : RAMDUMP_CPU_1
+ * client1 : RAMDUMP_CPU_2
+ */
+unsigned long ramdump_cpu_id[RAMDUMP_CPU_MAX] = {RAMDUMP_CPU_0, RAMDUMP_CPU_1, RAMDUMP_CPU_2};
+unsigned long ramdump_cpu_ch[RAMDUMP_CPU_MAX] = {RAMDUMP_CPU_0, RAMDUMP_CPU_1, RAMDUMP_CPU_2};
+
+/* 
+ * CP collect server : RAMDUMP_CPU_0
+ * AP trans server : RAMDUMP_CPU_1
+ * ZSP client0: RAMDUMP_CPU_2
+ */
+char *ramdump_cpu_name[RAMDUMP_CPU_MAX] = {"CP", "AP", "ZSP"};
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_v7.c b/cp/ps/plat/src/oss/sup/src/ramdump_v7.c
new file mode 100644
index 0000000..e89e88c
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_v7.c
@@ -0,0 +1,579 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_v7.c
+* Îļþ±êʶ:     ramdump_v7.c
+* ÄÚÈÝÕªÒª:     ramdump armv7´¦ÀíÆ÷ʵÏÖ
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+#ifdef _OS_LINUX
+extern void armv7_clean_dcache_all(void);
+#endif
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+#define RAMDUMP_REG_NR              (15)    /* R0-R14 */
+#define RAMDUMP_FIQ_REG_START       (8)     /* R8     */
+#define RAMDUMP_FIQ_REG_END         (13)    /* R12    */
+
+#define RAMDUMP_ARM_USR_MOD         (0xd0)
+#define RAMDUMP_ARM_SVC_MOD         (0xd3)
+
+/* code & data done instr */
+#define ramdump_dsb()   asm volatile("dsb" : : : "memory")
+
+#ifndef __stringify
+#define __stringify_1(x...) #x
+#define __stringify(x...)   __stringify_1(x)
+#endif
+
+/* CP15 */
+#ifndef __ACCESS_CP15
+#define __ACCESS_CP15(CRn, Op1, CRm, Op2)   p15, Op1, %0, CRn, CRm, Op2
+#endif
+
+#ifdef __USE_MMU__
+/* mmu control regs */
+#define MMU_SCTLR   __ACCESS_CP15(c1, 0, c0, 0)
+#define MMU_TTBCR   __ACCESS_CP15(c2, 0, c0, 2)
+#define MMU_DACR    __ACCESS_CP15(c3, 0, c0, 0)
+#define MMU_TTBR0   __ACCESS_CP15(c2, 0, c0, 0)
+#define MMU_TTBR1   __ACCESS_CP15(c2, 0, c0, 1) 
+#elif defined (__USE_MPU__) //#ifdef __USE_MMU__
+/* mpu control regs */
+#define MPU_TYPE_REGISTER_DREGION_POS (8)
+
+#define MPU_REGION_NUM      __ACCESS_CP15(c6, 0, c2, 0)
+#define MPU_REGION_BASE     __ACCESS_CP15(c6, 0, c1, 0)
+#define MPU_REGION_ATTR     __ACCESS_CP15(c6, 0, c1, 4)
+#define MPU_REGION_SIZE     __ACCESS_CP15(c6, 0, c1, 2)
+#define MPU_REGION_MAXNUM   __ACCESS_CP15(c0, 0, c0, 4)
+#define MPU_DFSR            __ACCESS_CP15(c5, 0, c0, 0)
+#define MPU_DFAR            __ACCESS_CP15(c6, 0, c0, 0)
+#define MPU_IFSR            __ACCESS_CP15(c5, 0, c0, 1)
+#define MPU_IFAR            __ACCESS_CP15(c6, 0, c0, 2)
+#endif //#ifdef __USE_MMU__
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+/*
+ * arm cpu mode pub regs
+ */
+typedef struct 
+{
+    unsigned long   sp;
+    unsigned long   lr;
+    unsigned long   spsr;
+} ramdump_arm_com_regs; 
+/*
+ * arm fiq mode regs
+ */
+typedef struct
+{
+    unsigned long           fiq_r8;
+    unsigned long           fiq_r9;
+    unsigned long           fiq_r10;
+    unsigned long           fiq_r11;
+    unsigned long           fiq_r12;
+    ramdump_arm_com_regs    fiq_com;
+} ramdump_arm_fiq_regs;
+/*
+ * arm cpu modes info record
+ */
+typedef struct 
+{
+    unsigned long regs[13]; /* r0-r12*/
+
+    ramdump_arm_com_regs    sys;
+    ramdump_arm_com_regs    svc;
+    ramdump_arm_com_regs    abt;
+    ramdump_arm_com_regs    udf;
+    ramdump_arm_com_regs    irq;
+    ramdump_arm_fiq_regs    fiq;
+} ramdump_arm_regs;
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+/*
+ * arm cpu sys mod, except usr, we have special handle
+ */
+static const unsigned long arm_sys_modes[] = 
+{
+    0xdf,   /* SYS */
+    0xd3,   /* SVC */
+    0xd7,   /* ABT */
+    0xdb,   /* UND */
+    0xd2,   /* IRQ */
+    0xd1,   /* FIQ */
+};
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+ramdump_arm_regs arm_all_modes_regs;
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+#ifdef __USE_MMU__
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_SCTLR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     armv7 mmu SCTLR registers recover
+*******************************************************************************/
+static unsigned long armv7_get_SCTLR(void)
+{
+    unsigned long scrtlr_reg;
+
+    asm volatile("mrc " __stringify(MMU_SCTLR) : "=r" (scrtlr_reg));
+
+    return scrtlr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_TTBCR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ttbcr value
+* ÆäËü˵Ã÷:     armv7 mmu Control registers recover
+*******************************************************************************/
+static unsigned long armv7_get_TTBCR(void)
+{
+    unsigned long ttbcr_reg;
+
+    asm volatile("mrc " __stringify(MMU_TTBCR) : "=r" (ttbcr_reg));
+
+    return ttbcr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_DACR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: dacr value
+* ÆäËü˵Ã÷:     armv7 mmu Domain registers recover
+*******************************************************************************/
+static unsigned long armv7_get_DACR(void)
+{
+    unsigned long dacr_reg;
+
+    asm volatile("mrc " __stringify(MMU_DACR) : "=r" (dacr_reg));
+
+    return dacr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_TTBR0
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ttbr0 value
+* ÆäËü˵Ã÷:     armv7 mmu TTBR0 registers recover
+*******************************************************************************/
+static unsigned long armv7_get_TTBR0(void)
+{
+    unsigned long ttbr0_reg;
+
+    asm volatile("mrc " __stringify(MMU_TTBR0) : "=r" (ttbr0_reg));
+
+    return ttbr0_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_TTBR1
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ttbr1 value
+* ÆäËü˵Ã÷:     armv7 mmu TTBR1 registers recover
+*******************************************************************************/
+static unsigned long armv7_get_TTBR1(void)
+{
+    unsigned long ttbr1_reg;
+
+    asm volatile("mrc " __stringify(MMU_TTBR1) : "=r" (ttbr1_reg));
+
+    return ttbr1_reg;
+}
+
+#elif defined (__USE_MPU__)     // #ifdef __USE_MMU__
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_set_RegionNum
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  nr: number
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region set nr
+* ÆäËü˵Ã÷:     armv7 mpu set region number, select region
+*******************************************************************************/
+static  void armr7_mpu_region_set_nr(unsigned long nr)
+{
+    unsigned long region_num;
+
+    asm volatile("mrc " __stringify(MPU_REGION_NUM) : "=r" (region_num));
+
+    return region_num;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_RegionBase
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region base
+* ÆäËü˵Ã÷:     armv7 mpu get region base address
+*******************************************************************************/
+static  unsigned long armr7_mpu_region_get_base(void)
+{
+    unsigned long region_base;
+
+    asm volatile("mrc " __stringify(MPU_REGION_BASE) : "=r" (region_base));
+
+    return region_base;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_RegionAttr
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region attr
+* ÆäËü˵Ã÷:     armv7 mpu get region attribution 
+*******************************************************************************/
+static  unsigned long armr7_mpu_region_get_attr(void)
+{
+    unsigned long region_attr;
+
+    asm volatile("mrc " __stringify(MPU_REGION_ATTR) : "=r" (region_attr));
+
+    return region_attr;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_RegionSize
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region size
+* ÆäËü˵Ã÷:     armv7 mpu get region size and enable reg
+*******************************************************************************/
+static  unsigned long armr7_mpu_region_get_size(void)
+{
+    unsigned long region_size;
+
+    asm volatile("mrc " __stringify(MPU_REGION_SIZE) : "=r" (region_size));
+
+    return region_size;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_RegionMaxNum
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region max number
+* ÆäËü˵Ã÷:     armv7 mpu get region max num
+*******************************************************************************/
+static  unsigned long armr7_mpu_region_get_max_nr(void)
+{
+    unsigned long region_max_num;
+
+    asm volatile("mrc " __stringify(MPU_REGION_MAXNUM) : "=r" (region_max_num));
+
+    return (region_max_num >> 8);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_DFSR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: dfsr value
+* ÆäËü˵Ã÷:     armv7 mpu get DFSR
+*******************************************************************************/
+static  unsigned long armr7_mpu_get_DFSR(void)
+{
+    unsigned long dfsr_reg;
+
+    asm volatile("mrc " __stringify(MPU_DFSR) : "=r" (dfsr_reg));
+
+    return dfsr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_DFAR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: dfar value
+* ÆäËü˵Ã÷:     armv7 mpu get DFAR
+*******************************************************************************/
+static  unsigned long armr7_mpu_get_DFAR(void)
+{
+    unsigned long dfar_reg;
+
+    asm volatile("mrc " __stringify(MPU_DFAR) : "=r" (dfar_reg));
+
+    return dfar_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_IFSR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ifsr value
+* ÆäËü˵Ã÷:     armv7 mpu get IFSR
+*******************************************************************************/
+static unsigned long armr7_mpu_get_IFSR(void)
+{
+    unsigned long ifsr_reg;
+
+    asm volatile("mrc " __stringify(MPU_IFSR) : "=r" (ifsr_reg));
+
+    return ifsr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_IFAR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ifar value
+* ÆäËü˵Ã÷:     armv7 mpu get IFAR
+*******************************************************************************/
+static unsigned long armr7_mpu_get_IFAR(void)
+{
+    unsigned long ifar_reg;
+
+    asm volatile("mrc " __stringify(MPU_IFAR) : "=r" (ifar_reg));
+
+    return ifar_reg;
+}
+
+#endif  // #ifdef __USE_MMU__
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    arm_store_sys_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr points to buf start
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    addr: changed addr 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+static char *arm_store_sys_regs(char *mem)
+{
+    unsigned long           *fiq_regs       = NULL;
+    ramdump_arm_com_regs	*ptr_mode_regs  = NULL;
+    unsigned long            fiq_regs_nr     = RAMDUMP_FIQ_REG_START;
+    unsigned long            arm_sys_mode_nr = 0;
+
+    //SYS/SVC/ABT/UND/IRQ
+    ptr_mode_regs = (ramdump_arm_com_regs*)(&arm_all_modes_regs.sys);
+    do {
+        mem += sprintf(mem, "r.s cpsr 0x%lx\n", (unsigned long)arm_sys_modes[arm_sys_mode_nr]);
+        mem += sprintf(mem, "r.s r13 0x%lx\n", (unsigned long)(ptr_mode_regs->sp));
+        mem += sprintf(mem, "r.s r14 0x%lx\n", (unsigned long)(ptr_mode_regs->lr));
+        mem += sprintf(mem, "r.s spsr 0x%lx\n", (unsigned long)(ptr_mode_regs->spsr));
+        ptr_mode_regs++;
+        arm_sys_mode_nr++;
+    } while (arm_sys_mode_nr < (RAMDUMP_ARRAY_NR(arm_sys_modes) - 1));
+
+    //FIQ r8-r12
+    mem += sprintf(mem, "r.s cpsr 0x%lx\n", (unsigned long)arm_sys_modes[arm_sys_mode_nr]);
+    fiq_regs = ((unsigned long*)&arm_all_modes_regs.fiq.fiq_r8);
+    do {
+        mem += sprintf(mem, "r.s r%lu 0x%lx\n", fiq_regs_nr, *(fiq_regs));
+        fiq_regs++;
+        fiq_regs_nr++;
+    } while (fiq_regs_nr < RAMDUMP_FIQ_REG_END);
+
+    //FIQ r13-r14/cpsr
+    ptr_mode_regs = &arm_all_modes_regs.fiq.fiq_com;
+    mem += sprintf(mem, "r.s r13 0x%lx\n", (unsigned long)(ptr_mode_regs->sp));
+    mem += sprintf(mem, "r.s r14 0x%lx\n", (unsigned long)(ptr_mode_regs->lr));
+    mem += sprintf(mem, "r.s spsr 0x%lx\n", (unsigned long)(ptr_mode_regs->spsr));
+
+    return mem;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    arm_store_cur_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr points to buf start
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    addr: changed addr 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+static char *arm_store_cur_regs(char *mem)
+{
+    unsigned long  cnt;
+    unsigned long *svc_regs = (unsigned long *)arm_all_modes_regs.regs;
+
+    mem += sprintf(mem, "r.s cpsr 0x%lx\n", (unsigned long)RAMDUMP_ARM_SVC_MOD);
+    for (cnt = 0x00; cnt < RAMDUMP_ARRAY_NR(arm_all_modes_regs.regs); cnt++)
+        mem += sprintf(mem, "r.s r%lu 0x%lx\n", cnt, *svc_regs++);
+    mem += sprintf(mem, "r.s r13 0x%lx\n", arm_all_modes_regs.svc.sp);
+    mem += sprintf(mem, "r.s r14 0x%lx\n", arm_all_modes_regs.svc.lr);
+    mem += sprintf(mem, "r.s pc 0x%lx\n", arm_all_modes_regs.svc.lr);
+    mem += sprintf(mem, "r.s spsr 0x%lx\n", arm_all_modes_regs.svc.spsr);
+
+    return mem;
+}
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_arch_clean_and_invalid_caches
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used for arm clean and invalid caches
+*******************************************************************************/
+void ramdump_arch_clean_and_invalid_caches(void)
+{
+#ifdef _OS_TOS
+    tos_cache_clean_invalidate_all();
+#endif 
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_arch_clean_caches
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used for arm clean caches
+*******************************************************************************/
+void ramdump_arch_clean_caches(void)
+{
+#ifdef _OS_LINUX
+    armv7_clean_dcache_all();
+#elif defined (_OS_TOS)
+    tos_cache_clean_all();
+#endif   
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_arch_store_modes_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr points to buf start
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    addr: changed addr   
+* ÆäËü˵Ã÷:    This function is used for linux clean caches
+*******************************************************************************/
+char *ramdump_arch_store_modes_regs(char *mem)
+{
+    // store privileged regs
+    mem = arm_store_sys_regs(mem);
+
+    // store usr regs, user app is running in svc mod
+    mem = arm_store_cur_regs(mem);
+
+    return mem;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_arch_store_mm_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr points to buf start
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    addr: changed addr  
+* ÆäËü˵Ã÷:    This function is used for linux clean caches
+*******************************************************************************/
+char *ramdump_arch_store_mm_regs(char *mem)
+{
+#ifdef __USE_MMU__
+
+    mem += sprintf(mem, "per.s c15:0x1 %%long %#lx\r\n", armv7_get_SCTLR());
+    mem += sprintf(mem, "per.s c15:0x2 %%long %#lx\r\n", armv7_get_TTBR0());
+    mem += sprintf(mem, "per.s c15:0x102 %%long %#lx\r\n", armv7_get_TTBR1());
+    mem += sprintf(mem, "per.s c15:0x202 %%long %#lx\r\n", armv7_get_TTBCR());
+    mem += sprintf(mem, "per.s c15:0x3 %%long %#lx\r\n", armv7_get_DACR());
+    
+#elif defined (__USE_MPU__) //#ifdef __USE_MMU__
+
+    unsigned long i = 0;
+
+    mem += sprintf(mem, "per.s c15:0x4 %%long %#lx\r\n", (unsigned long)((armr7_mpu_region_get_max_nr() << MPU_TYPE_REGISTER_DREGION_POS))); 
+    for(i = 0; i < armr7_mpu_region_get_max_nr(); i++)
+    {
+        mem += sprintf(mem, "per.s c15:0x26 %%long %#lx\r\n",  (unsigned long)i); 
+        armr7_mpu_region_set_nr(i);
+        mem += sprintf(mem, "per.s c15:0x16 %%long %#lx\r\n",  (unsigned long)(armr7_mpu_region_get_base())); 
+        mem += sprintf(mem, "per.s c15:0x216 %%long %#lx\r\n", (unsigned long)(armr7_mpu_region_get_size())); 
+        mem += sprintf(mem, "per.s c15:0x416 %%long %#lx\r\n", (unsigned long)(armr7_mpu_region_get_attr())); 
+    }
+
+    /* DFSR/DFAR IFSR/IFAR */
+    mem += sprintf(mem, "per.s c15:0x5 %%long %#lx\r\n",   (unsigned long)(armr7_mpu_get_DFSR())); 
+    mem += sprintf(mem, "per.s c15:0x6 %%long %#lx\r\n",   (unsigned long)(armr7_mpu_get_DFAR())); 
+    mem += sprintf(mem, "per.s c15:0x105 %%long %#lx\r\n", (unsigned long)(armr7_mpu_get_IFSR())); 
+    mem += sprintf(mem, "per.s c15:0x206 %%long %#lx\r\n", (unsigned long)(armr7_mpu_get_IFAR())); 
+
+#endif //#ifdef __USE_MMU__
+
+    return mem;
+}
+
+unsigned long ramdump_arch_get_pc(unsigned int mode)
+{
+	unsigned long pc;
+#ifdef _OS_TOS 
+
+	switch (mode){
+	case CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION:
+		pc = arm_all_modes_regs.udf.lr;
+		break;
+	case CYGNUM_HAL_VECTOR_ABORT_PREFETCH:
+		pc = arm_all_modes_regs.abt.lr;
+		break;
+	case CYGNUM_HAL_VECTOR_ABORT_DATA:
+		pc = arm_all_modes_regs.abt.lr;
+		break;
+	default:
+		pc = arm_all_modes_regs.svc.lr;
+		break;
+	}
+#endif	
+	return pc;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_v7_asm.S b/cp/ps/plat/src/oss/sup/src/ramdump_v7_asm.S
new file mode 100644
index 0000000..7125967
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_v7_asm.S
@@ -0,0 +1,102 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2015, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_v7_asm.S
+* Îļþ±êʶ:     ramdump_v7_asm.S
+* ÄÚÈÝÕªÒª:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/06/20      V1.0        Create          ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+.extern arm_all_modes_regs
+
+.global ramdump_arch_save_all_regs
+.global armv7_clean_dcache_l1
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_arch_save_all_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  
+*   (´«³ö²ÎÊý)  
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     This function is used for linux ramdump registers recover
+*               usr mode doesn`t need to store,we have special handle
+*******************************************************************************/
+.text
+.balign 4
+.type ramdump_arch_save_all_regs, %function
+ramdump_arch_save_all_regs:    
+    push     {r14}
+    ldr      r14, =arm_all_modes_regs
+    stm      r14!, {r0-r12}             /* ±£´ær0-r12   */
+    mov      r0, r14                    /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ» */
+    ldr      r14, [r13], #4             /* »¹Ô­r13,r14  */
+    mrs      r1, CPSR                   /* ±£´æcpsrÖÁr1 */
+    msr      CPSR_c, #0xdf              /* SYS mode		*/
+    stm      r0!, {r13, r14}            /* ½«{r13,r14}ÈëÕ»  */
+//mrs      r2, SPSR
+    str      r2, [r0], #4               /* ½«SPSRÈëÕ»   */
+    msr      CPSR_c, #0xd3              /* svc mode     */
+    stm      r0!, {r13, r14}            /* ½«{r13,r14}  */
+    mrs      r2, SPSR
+    str      r2,  [r0], #4              /* ½«SPSRÈëÕ»   */
+    msr      CPSR_c, #0xd7              /* ABT mode     */
+    mrs      r2,  SPSR
+    stm      r0!, {r13, r14}
+    str      r2, [r0], #4
+    msr      CPSR_c, #0xdb              /* UND mode     */
+    mrs      r2, SPSR
+    stm      r0!, {r13, r14}
+    str      r2, [r0], #4
+    msr      CPSR_c, #0xd2              /* IRQ mode     */
+    mrs      r2, SPSR
+    stm      r0!, {r13, r14}
+    str      r2, [r0], #4
+    msr      CPSR_c, #0xd1              /* FIQ mode     */
+    mrs      r2, SPSR
+    stm      r0!, {r8-r14}
+    str      r2, [r0], #4
+    msr      CPSR_c, r1                 /* »¹Ô­CPRS     */
+    ldr      r14, =arm_all_modes_regs    /* »¹Ô­¼Ä´æÆ÷   */      
+    ldm      r14!, {r0-r12}             /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­    */
+    ldmdb    r13, {R14}                 /* »¹Ô­r14      */
+    bx       r14                        /* ·µ»Ø         */
+
diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_entry.c b/cp/ps/plat/src/oss/sup/src/sup_agent_entry.c
new file mode 100644
index 0000000..5224c10
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_entry.c
@@ -0,0 +1,222 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+#include "sup_agent.h"

+#include "sup_agent_toolkit.h"

+#include "sup_agent_uemessage.h"

+#include "sup_agent_pcmessage.h"

+#include "commgt_api.h"

+#include "drv_api.h"

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+

+/**************************************************************************************************

+* staticº¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+#ifdef _USE_WINCOMM_SERVER

+static VOID zOss_MonitorAgt_CommCallBack( UINT32 msgID, const UINT8 * msg, UINT32 msgLen );

+#else

+static VOID zOss_MonitorAgt_CommCallBack( UINT32 msgID, const UINT8 * msg, UINT16 msgLen );

+#endif

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+

+/**************************************************************************************************

+ º¯ÊýÃû      £ºOsAgt_MessageRelease

+ ¹¦ÄÜ        £ºÓÃÓÚÊÍ·ÅÊÕµ½µÄÏûÏ¢ÖÐÉêÇëµÄÄÚ´æ

+ ÊäÈë²ÎÊý    £ºmsg_id             Ä£¿éÊÕµ½µÄÏûÏ¢µÄID

+               buf                Ö¸ÏòÄ£¿éÊÕµ½µÄÏûÏ¢µÄÄÚÈݵÄÖ¸Õë

+ Êä³ö²ÎÊý    £ºÎÞ

+ ·µ»ØÖµËµÃ÷  £ºVOID

+ ÆäËû˵Ã÷    £º

+ --------------------------------------------------------------------------------------------------

+ ÐÞ¸ÄÈÕÆÚ        °æ±¾        ÐÞ¸ÄÈË        ÐÞ¸ÄÔ­Òò¼°ÄÚÈÝ

+ **************************************************************************************************/

+VOID zOss_MonitorAgt_MessageRelease(UINT32 msg_id, UINT8 *buf)

+{

+    switch(msg_id)

+    {

+    case OSS_MON_THREAD:

+        {

+            zOss_RetUB(((T_ZOss_Mon_Thread*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_TIMER:

+        {

+            zOss_RetUB(((T_ZOss_Mon_Timer*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_TASK:

+        {

+            zOss_RetUB(((T_ZOss_Mon_Task*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_POOL_ALLOC:

+        {

+            zOss_Free(((T_ZOss_Mon_Pool_Alloc*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_POOL_LEAK:

+        {

+            zOss_Free(((T_ZOss_Mon_Pool_Leak*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_GET_VAR_ACK:

+        {

+            zOss_RetUB(((T_ZOss_Mon_Get_Var_Ack*)buf)->value);

+        }

+        break;

+        

+    default:

+        break;

+    }

+}

+

+/**************************************************************************************************

+ º¯ÊýÃû      £ºzOsAgt_Task

+ ¹¦ÄÜ        £ºOsAgtÄ£¿éÈë¿Úº¯Êý

+ ÊäÈë²ÎÊý    £ºstate              Ä£¿é״̬

+               msg_id             Ä£¿éÊÕµ½µÄÏûÏ¢µÄID

+               buf                Ö¸ÏòÄ£¿éÊÕµ½µÄÏûÏ¢µÄÄÚÈݵÄÖ¸Õë

+               msg_len            Ä£¿éÊÕµ½µÄÏûÏ¢µÄ³¤¶È

+               private_data       Ä£¿é˽ÓÐÊý¾ÝÇø

+ Êä³ö²ÎÊý    £ºÎÞ

+ ·µ»ØÖµËµÃ÷  £ºVOID

+ ÆäËû˵Ã÷    £º

+ --------------------------------------------------------------------------------------------------

+ ÐÞ¸ÄÈÕÆÚ        °æ±¾        ÐÞ¸ÄÈË        ÐÞ¸ÄÔ­Òò¼°ÄÚÈÝ

+ **************************************************************************************************/

+VOID zOss_MonitorAgt_Task(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data)

+{

+    switch(state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch(msg_id)

+            {

+            case EV_INIT:

+                break;

+                

+            case EV_POWERON:

+                {

+                    #ifdef _USE_WINCOMM_SERVER

+                    if (0 == zTools_CommReg(SUBMDL_MONAGENT, ZDRV_DEV_UART_0, zOss_MonitorAgt_CommCallBack))

+                    #else

+                    if (0 == zOss_CommReg(SUBMDL_MONAGENT, ZDRV_DEV_UART_0, zOss_MonitorAgt_CommCallBack))

+                    #endif

+                    {

+                        zOss_SetState(ZOSS_STATUS_WORK); /*½«ÈÎÎñÉèΪ¹¤×÷̬*/  

+                        zOss_MonitorAgt_SetOsTaskId(zOss_GetTaskID(OS_TASK_NAME));

+                        zOss_MonitorAgt_InitUeMessage();

+                    }

+                }

+                break;

+                

+            default:

+                break;                                  

+            }

+        }

+        break;

+        

+    case ZOSS_STATUS_WORK:   

+        {

+            zOss_MonitorAgt_UeMessageHandler(msg_id, buf);

+            zOss_MonitorAgt_MessageRelease(msg_id, buf);

+        }

+        break;

+        

+    default:

+        break;         

+    }	

+}

+

+/**************************************************************************************************

+ º¯ÊýÃû      £ºzOsAgt_CommCallBack

+ ¹¦ÄÜ        £ºOsAgtÄ£¿éÌṩ¸øCOMMÄ£¿éµÄ»Øµ÷º¯Êý£¬ÓÃÀ´½ÓÊÕÀ´×ÔPC²àµÄÏûÏ¢

+ ÊäÈë²ÎÊý    £ºmsgID              ½ÓÊÕµ½µÄÏûÏ¢ID£¬¼´COMMÏûϢͷ²¿ÖеÄÏûÏ¢ÀàÐÍ

+               ms                 Ö¸ÏòÄ£¿éÊÕµ½µÄÏûÏ¢µÄÄÚÈݵÄÖ¸Õë

+               msgLen             Ä£¿éÊÕµ½µÄÏûÏ¢µÄ³¤¶È

+ Êä³ö²ÎÊý    £ºÎÞ

+ ·µ»ØÖµËµÃ÷  £ºVOID

+ ÆäËû˵Ã÷    £º

+ --------------------------------------------------------------------------------------------------

+ ÐÞ¸ÄÈÕÆÚ        °æ±¾        ÐÞ¸ÄÈË        ÐÞ¸ÄÔ­Òò¼°ÄÚÈÝ

+ **************************************************************************************************/

+#ifdef _USE_WINCOMM_SERVER

+static VOID zOss_MonitorAgt_CommCallBack( UINT32 msgID, const UINT8 * msg, UINT32 msgLen )

+#else

+static VOID zOss_MonitorAgt_CommCallBack( UINT32 msgID, const UINT8 * msg, UINT16 msgLen )

+#endif

+{

+    BYTE toolMsg = *msg;

+    

+    switch (toolMsg)

+    {

+    case PC_AGT_ACK:

+        zOss_MonitorAgt_PcAckReq();

+        break;

+    case PC_AGT_SET_VARIABLE: //set variable

+        zOss_MonitorAgt_PcSetValueReq(msgLen, (UINT8 *)msg);

+        break;

+        

+    case PC_AGT_GET_VARIABLE:

+        zOss_MonitorAgt_PcGetValueReq(msgLen, (UINT8 *)msg);

+        break;

+        

+    case PC_AGT_SNAPSHOT://snapshot

+        zOss_MonitorAgt_PcSnapshotReq(*(msg + 1));

+        break;

+        

+    case PC_AGT_STOP:

+        zOss_MonitorAgt_PcStop();

+        break;

+        

+    case PC_AGT_START:

+        zOss_MonitorAgt_PcStart();

+        break;

+        

+    default:

+        break;

+    }    

+}

+

+#endif

+

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_osinfopack.c b/cp/ps/plat/src/oss/sup/src/sup_agent_osinfopack.c
new file mode 100644
index 0000000..b672fac
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_osinfopack.c
@@ -0,0 +1,216 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "sup_agent_osinfopack.h"

+#include "sup_agent_toolkit.h"

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef struct

+{

+    UINT8 vistPermission;

+    const CHAR* description;

+}T_Mmu_VistPermission;

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+#define NumericToByteArray(array, numeric) zOss_Memcpy(array, &numeric, sizeof(numeric))

+

+static char s_timerExpiryTable[TIMER_EXPIRY_NUM][TIMER_EXPIRY_LEN] = {"no", "yes"};

+static char s_eventTable[EVENT_NUM][EVENT_LEN] = {"thread swapin", 

+                                                  "thread swapout", 

+                                                  "dsr swapin",

+                                                  "dsr swapout"};

+static char s_taskStatusTable[TASK_STATUS_NUM][TASK_STATUS_LEN] = {"stop", 

+                                                                   "idle", 

+                                                                   "ready",

+                                                                   "run"};

+

+static T_Mmu_VistPermission s_mmuVistPermissionTable[] = { {1, "rw, nocache"}, 

+                                                           {2, "ro, nocache"},

+                                                           {9, "rw, writethrough"},

+                                                           {10, "ro, writethrough"},

+                                                           {13, "rw, writeback"},

+                                                           {14, "ro, writeback"}};

+

+static char s_threadStatusTable[THREAD_STATUS_NUM][THREAD_STATUS_LEN] = {"running", "ready", "waiting"};

+

+/**************************************************************************************************

+

+* º¯ÊýʵÏÖÇø

+

+***************************************************************************************************/

+static char* zOss_MonitorAgt_GetMmuPermissonDescription(UINT8 permission)

+{

+    int i = 0;

+    for (i=0; i < MMU_PERMISSION_NUM; i++)

+    {

+        if (s_mmuVistPermissionTable[i].vistPermission == permission)

+            return (char *)s_mmuVistPermissionTable[i].description;

+    }

+

+    return (char *)"";

+}

+

+VOID zOss_MonitorAgt_PackVersion(UINT8* code, T_ZOss_Mon_Version* version)

+{

+    T_Version packVersion = {0};

+    zOss_MonitorAgt_CharToByteArray(packVersion.version, version->version, VERSION_LEN);

+    NumericToByteArray(code, packVersion);

+}

+

+VOID zOss_MonitorAgt_PackFrequency(UINT8* code, T_ZOss_Mon_Cpu_Frequency* frequency)

+{

+    T_Frequency packFreq = {0};

+    //memcpy(packFreq.feq, &frequency->frequency, sizeof(frequency->frequency));

+    NumericToByteArray(packFreq.feq, frequency->frequency);

+    NumericToByteArray(code, packFreq);

+}

+

+VOID zOss_MonitorAgt_PackCpuLoad(UINT8* code, T_ZOss_Mon_Cpu_Load* cpuLoad)

+{

+    T_CpuLoad packCpuLoad = {0};

+    NumericToByteArray(packCpuLoad.load, cpuLoad->load);

+    NumericToByteArray(code, packCpuLoad);

+}

+

+VOID zOss_MonitorAgt_PackPoolEle(UINT8* code, T_ZOss_Mon_Pool_Ele* pool_ele)

+{

+    T_Pool_Ele packPoolEle = {0};

+    NumericToByteArray(packPoolEle.size, pool_ele->size);

+    NumericToByteArray(packPoolEle.total, pool_ele->total);

+    NumericToByteArray(packPoolEle.used, pool_ele->used);

+    NumericToByteArray(packPoolEle.maxUsed, pool_ele->max_used);

+    NumericToByteArray(code, packPoolEle);

+}

+

+VOID zOss_MonitorAgt_PackPoolAllocEle(UINT8* code, T_ZOss_Mon_Pool_Alloc_Ele* pool_alloc_ele)

+{

+    T_Pool_Alloc_Ele packPoolAllocEle = {0};

+    NumericToByteArray(packPoolAllocEle.address, pool_alloc_ele->addr);

+    NumericToByteArray(packPoolAllocEle.owner, pool_alloc_ele->owner);

+    NumericToByteArray(packPoolAllocEle.timeStamp, pool_alloc_ele->timestamp);

+    zOss_MonitorAgt_FileNameToByteArray(packPoolAllocEle.file, pool_alloc_ele->file, FILE_LEN);

+    NumericToByteArray(packPoolAllocEle.line, pool_alloc_ele->line);

+    NumericToByteArray(code, packPoolAllocEle);

+}

+

+VOID zOss_MonitorAgt_PackPoolLeakEle(UINT8* code, T_ZOss_Mon_Pool_Leak_Ele* pool_leak_ele)

+{

+    T_Pool_Leak_Ele packPoolLeakEle = {0};

+    NumericToByteArray(packPoolLeakEle.address, pool_leak_ele->addr);

+    NumericToByteArray(packPoolLeakEle.owner, pool_leak_ele->owner);

+    NumericToByteArray(packPoolLeakEle.timeStamp, pool_leak_ele->timestamp);

+    zOss_MonitorAgt_FileNameToByteArray(packPoolLeakEle.file, pool_leak_ele->file, FILE_LEN);

+    NumericToByteArray(packPoolLeakEle.line, pool_leak_ele->line);

+    NumericToByteArray(code, packPoolLeakEle);

+}

+

+VOID zOss_MonitorAgt_PackHeap(UINT8* code, T_ZOss_Mon_Heap* heap)

+{

+    T_Heap packHeap = {0};

+    NumericToByteArray(packHeap.base, heap->base);

+    NumericToByteArray(packHeap.size, heap->size);

+    NumericToByteArray(packHeap.used, heap->used);

+    NumericToByteArray(code, packHeap);

+}

+

+VOID zOss_MonitorAgt_PackThreadEle(UINT8* code, T_ZOss_Mon_Thread_Ele* thread_ele)

+{

+    T_Thread_Ele packThreadEle = {0};

+    NumericToByteArray(packThreadEle.handle, thread_ele->handle);

+    NumericToByteArray(packThreadEle.msg_no, thread_ele->msg_num);

+    zOss_MonitorAgt_CharToByteArray(packThreadEle.status, s_threadStatusTable[thread_ele->status/2], THREAD_STATUS_LEN);

+    NumericToByteArray(packThreadEle.priority, thread_ele->priority);

+    NumericToByteArray(packThreadEle.stack_used, thread_ele->stack_used);

+    NumericToByteArray(packThreadEle.stack_max_used, thread_ele->stack_max_used);

+    NumericToByteArray(packThreadEle.cpu_load, thread_ele->cpu_load);

+    zOss_MonitorAgt_CharToByteArray(packThreadEle.name, thread_ele->name, THREAD_NAME_LEN);

+    NumericToByteArray(code, packThreadEle);

+}

+

+VOID zOss_MonitorAgt_PackTaskEle(UINT8* code, T_ZOss_Mon_Task_Ele* task_ele)

+{

+    T_Task_Ele packTaskEle = {0};

+    NumericToByteArray(packTaskEle.handle, task_ele->handle);

+    NumericToByteArray(packTaskEle.thread_handle, task_ele->thread_handle);

+    zOss_MonitorAgt_CharToByteArray(packTaskEle.status, s_taskStatusTable[task_ele->status - 1], TASK_STATUS_LEN);

+    zOss_MonitorAgt_CharToByteArray(packTaskEle.name, task_ele->name, TASK_NAME_LEN);

+    NumericToByteArray(code, packTaskEle);

+}

+

+VOID zOss_MonitorAgt_PackEventEle(UINT8* code, T_ZOss_Mon_Event_Ele* event_ele)

+{

+    T_Event_Ele packEventEle = {0};

+    zOss_MonitorAgt_CharToByteArray(packEventEle.event, s_eventTable[event_ele->event], EVENT_LEN);

+    NumericToByteArray(packEventEle.handle, event_ele->handle);

+    NumericToByteArray(packEventEle.tickstamp, event_ele->tickstamp);

+    zOss_MonitorAgt_CharToByteArray(packEventEle.name, event_ele->name, EVENT_NAME_LEN);

+    NumericToByteArray(code, packEventEle);

+}

+

+VOID zOss_MonitorAgt_PackMsgEle(UINT8* code, T_ZOss_Mon_Msg_Ele* msg_ele)

+{

+    T_Msg_Ele packMsgEle = {0};

+    NumericToByteArray(packMsgEle.msgId, msg_ele->msgId);

+    NumericToByteArray(packMsgEle.address, msg_ele->ptr);

+    NumericToByteArray(packMsgEle.size, msg_ele->size);

+    zOss_MonitorAgt_CharToByteArray(packMsgEle.sender, msg_ele->sender, SENDER_NAME_LEN);

+    zOss_MonitorAgt_CharToByteArray(packMsgEle.receiver, msg_ele->receiver, RECEIVER_NAME_LEN);

+    NumericToByteArray(packMsgEle.timestamp, msg_ele->timestamp);

+    NumericToByteArray(code, packMsgEle);

+}

+

+VOID zOss_MonitorAgt_PackTimerEle(UINT8* code, T_ZOss_Mon_Timer_Ele* timer_ele)

+{

+    T_Timer_Ele packTimerEle = {0};

+    NumericToByteArray(packTimerEle.start_time, timer_ele->start_time);

+    NumericToByteArray(packTimerEle.expire_time, timer_ele->expire_time);

+    NumericToByteArray(packTimerEle.callback_func, timer_ele->callback_func);

+    zOss_MonitorAgt_CharToByteArray(packTimerEle.is_period, s_timerExpiryTable[timer_ele->is_period], TIMER_EXPIRY_LEN);

+    NumericToByteArray(packTimerEle.handle, timer_ele->handle);

+    NumericToByteArray(code, packTimerEle);

+}

+

+VOID zOss_MonitorAgt_PackMmuEle(UINT8* code, T_ZOss_Mon_Mmu_Ele* mmu_ele)

+{

+    T_Mmu_Ele packMmuEle = {0};

+    NumericToByteArray(packMmuEle.vir_addr, mmu_ele->vir_addr);

+    NumericToByteArray(packMmuEle.phy_addr, mmu_ele->phy_addr);

+    NumericToByteArray(packMmuEle.size, mmu_ele->size);

+    zOss_MonitorAgt_CharToByteArray(packMmuEle.attr, zOss_MonitorAgt_GetMmuPermissonDescription(mmu_ele->attr), MMU_PERMISSION_LEN);

+    zOss_MonitorAgt_CharToByteArray(packMmuEle.name, mmu_ele->name, MMU_NAME_LEN);

+    NumericToByteArray(code, packMmuEle);

+}

+

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_pcmessage.c b/cp/ps/plat/src/oss/sup/src/sup_agent_pcmessage.c
new file mode 100644
index 0000000..497bc6a
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_pcmessage.c
@@ -0,0 +1,177 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+#include "sup_agent.h"

+#include "sup_agent_pcmessage.h"

+#include "sup_agent_toolkit.h"

+#include "sup_agent_status.h"

+#ifdef _USE_WINCOMM_SERVER

+#include "commgt_api.h"

+#endif

+

+/**************************************************************************************************

+* È«¾Ö±äÁ¿¶¨ÒåÇø

+***************************************************************************************************/

+static unsigned int s_openFlg = OSS_MON_FLAG_OFF;

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_PcAckReq(VOID)

+{

+    UINT8 cnf[2] = {0};

+    #ifdef _USE_WINCOMM_SERVER

+    VOID  *buffer = NULL;

+    #endif

+    

+    cnf[0] = AGT_PC_ACK;

+    cnf[1] = (BYTE)s_openFlg;

+    #ifdef _USE_WINCOMM_SERVER

+    buffer = zOss_Malloc(sizeof(cnf));

+    if(buffer != NULL)

+    {

+        zOss_Memcpy(buffer, cnf, sizeof(cnf));

+        zOss_MonitorAgt_SendDataToPcTool(buffer, 2);

+    }

+    #else    

+    zOss_MonitorAgt_SendDataToPcTool((UINT8*)cnf, 2);

+    #endif

+}

+

+#ifdef _USE_WINCOMM_SERVER

+VOID zOss_MonitorAgt_PcSetValueReq(UINT32 len, BYTE* buf)

+#else

+VOID zOss_MonitorAgt_PcSetValueReq(UINT16 len, BYTE* buf)

+#endif

+{

+    T_ZOss_Mon_Set_Var* Msg = (T_ZOss_Mon_Set_Var*)zOss_GetUB(sizeof(*Msg));

+    zOss_Memcpy(&Msg->base, &buf[1], sizeof(Msg->base));

+    zOss_Memcpy(&Msg->size, &buf[5], sizeof(Msg->size));

+    Msg->value = (BYTE*)zOss_GetUB(Msg->size);

+    zOss_Memcpy(Msg->value, &buf[9], Msg->size);

+    zOss_MonitorAgt_SendMsgToOs(OSS_MON_SET_VAR, sizeof(T_ZOss_Mon_Set_Var), (BYTE*)(Msg));

+}

+

+#ifdef _USE_WINCOMM_SERVER

+VOID zOss_MonitorAgt_PcGetValueReq(UINT32 len, BYTE* buf)

+#else

+VOID zOss_MonitorAgt_PcGetValueReq(UINT16 len, BYTE* buf)

+#endif

+{

+    T_ZOss_Mon_Get_Var_Req* Msg = ZOSS_NULL;

+

+    if (zOss_MonitorAgt_CheckReceiveMessage(PC_TOOL_WINDOW_VARIABLE) == OsAgt_Status_Ok)

+    {

+        Msg = (T_ZOss_Mon_Get_Var_Req*)zOss_GetUB(sizeof(*Msg));

+        zOss_Memcpy(&Msg->base, &buf[1], sizeof(Msg->base));

+        zOss_Memcpy(&Msg->size, &buf[5], sizeof(Msg->size));

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_GET_VAR_REQ, sizeof(T_ZOss_Mon_Get_Var_Req), (BYTE*)(Msg));

+    }

+}

+

+static VOID zOss_MonitorAgt_SendOsReq(UINT8 msgId)

+{

+    switch (msgId)

+    {

+    case AGT_PC_WINDOW_INFO_THREAD: 

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_THREAD, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_EVENT:

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_EVENT, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_TIMER:   

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_TIMER, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_TASK:   

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_TASK, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_RAMLOG:

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_RAMLOG, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_POOL:  

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_POOL_ALLOC, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_MMU: 

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_MMU, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_MSG:   

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_MSG, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_POOLLEAK:  

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_POOL_LEAK, 0, ZOSS_NULL);

+        break; 

+    case AGT_PC_WINDOW_INFO_MEM: 

+        {

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_HEAP, 0, ZOSS_NULL);

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_POOL, 0, ZOSS_NULL);

+        }

+        break; 

+    case AGT_PC_WINDOW_INFO_CPU:  

+        {

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_CPU_FREQUENCY, 0, ZOSS_NULL);

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_CPU_LOAD, 0, ZOSS_NULL);

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_VERSION, 0, ZOSS_NULL);

+        }

+        break; 

+    default:

+        break;

+    }

+}

+

+VOID zOss_MonitorAgt_PcSnapshotReq(UINT8 msgId)

+{

+    if (s_openFlg == OSS_MON_FLAG_OFF)

+	{

+        return;

+	}

+    if (zOss_MonitorAgt_CheckReceiveMessage(msgId) == OsAgt_Status_Ok)

+    {

+        zOss_MonitorAgt_SendOsReq(msgId);

+    }

+}

+

+VOID zOss_MonitorAgt_PcStop(VOID)

+{

+    T_ZOss_Mon_Set_Flag* Msg = (T_ZOss_Mon_Set_Flag*)zOss_GetUB(sizeof(*Msg));

+    s_openFlg = OSS_MON_FLAG_OFF;

+    Msg->flag = s_openFlg;

+    zOss_MonitorAgt_SendMsgToOs(OSS_MON_SET_FLAG, sizeof(T_ZOss_Mon_Set_Flag), (BYTE*)(Msg));

+}

+

+VOID zOss_MonitorAgt_PcStart(VOID)

+{

+    T_ZOss_Mon_Set_Flag* Msg = (T_ZOss_Mon_Set_Flag*)zOss_GetUB(sizeof(*Msg));

+    s_openFlg = OSS_MON_FLAG_ON;

+    Msg->flag = s_openFlg;

+    zOss_MonitorAgt_SendMsgToOs(OSS_MON_SET_FLAG, sizeof(T_ZOss_Mon_Set_Flag), (BYTE*)(Msg));

+}

+

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_status.c b/cp/ps/plat/src/oss/sup/src/sup_agent_status.c
new file mode 100644
index 0000000..da244f2
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_status.c
@@ -0,0 +1,212 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "sup_agent_status.h"

+#include "sup_agent.h"

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef struct

+{

+    UINT32 msgId;

+    UINT32 count;

+

+}T_OsAgt_Status;

+

+typedef struct

+{

+    UINT32 pcMsgId;

+    UINT32 ueMsgId;

+

+}T_OsAgt_MsgIdMap;

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+#define INVLID_STATUS_VALUE  0xFFFFFFFF

+#define INVLID_MESSAGE_ID    0xFFFFFFFF

+

+static T_OsAgt_MsgIdMap g_MsgIdMap[] = 

+{

+    { PC_TOOL_WINDOW_CPU,       OSS_MON_VERSION}, 

+

+    { PC_TOOL_WINDOW_THREAD,    OSS_MON_THREAD},     

+    { PC_TOOL_WINDOW_EVENT,     OSS_MON_EVENT},

+    { PC_TOOL_WINDOW_TIMER,     OSS_MON_TIMER},      

+    { PC_TOOL_WINDOW_TASK,      OSS_MON_TASK},       

+    { PC_TOOL_WINDOW_RAMLOG,    OSS_MON_RAMLOG},          

+    { PC_TOOL_WINDOW_POOL,      OSS_MON_POOL_ALLOC},            

+    { PC_TOOL_WINDOW_MMU,       OSS_MON_MMU},        

+    { PC_TOOL_WINDOW_MSG,       OSS_MON_MSG},        

+    { PC_TOOL_WINDOW_POOLLEAK,  OSS_MON_POOL_LEAK},

+    { PC_TOOL_WINDOW_VARIABLE,  OSS_MON_GET_VAR_ACK},  

+

+    { PC_TOOL_WINDOW_MEM,       OSS_MON_HEAP},   

+    { PC_TOOL_WINDOW_MEM,       OSS_MON_POOL}, 

+

+    { PC_TOOL_WINDOW_CPU,       OSS_MON_CPU_LOAD},        

+    { PC_TOOL_WINDOW_CPU,       OSS_MON_CPU_FREQUENCY}

+};

+

+#define UE_MSG_NUM (sizeof(g_MsgIdMap)/sizeof(T_OsAgt_MsgIdMap))

+

+/**************************************************************************************************

+* staticº¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+static UINT32 zOss_MonitorAgt_GetStatusCount(UINT32 msgId);

+static VOID zOss_MonitorAgt_SetStatusCount(UINT32 msgId);

+

+/**************************************************************************************************

+* È«¾Ö±äÁ¿¶¨ÒåÇø

+***************************************************************************************************/

+static T_OsAgt_Status g_Status[PC_WINDOW_NUM] = 

+{

+    { PC_TOOL_WINDOW_THREAD,   0}, //1     

+    { PC_TOOL_WINDOW_EVENT,    0}, //1

+    { PC_TOOL_WINDOW_TIMER,    0}, //1      

+    { PC_TOOL_WINDOW_TASK,     0}, //1       

+    { PC_TOOL_WINDOW_RAMLOG,   0}, //1          

+    { PC_TOOL_WINDOW_POOL,     0}, //1            

+    { PC_TOOL_WINDOW_MMU,      0}, //1       

+    { PC_TOOL_WINDOW_MSG,      0}, //1       

+    { PC_TOOL_WINDOW_POOLLEAK, 0}, //1

+    { PC_TOOL_WINDOW_VARIABLE, 0}, //1  

+    { PC_TOOL_WINDOW_MEM,      0}, //2    

+    { PC_TOOL_WINDOW_CPU,      0}, //2      

+};

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+static UINT32 zOss_MonitorAgt_GetUeMessageNum(UINT32 msgId)

+{

+    UINT32 i = 0;

+    UINT32 count = 0;

+    for(i = 0; i < UE_MSG_NUM; i++)

+    {

+        if(g_MsgIdMap[i].pcMsgId == msgId)

+        {

+            count++;

+        }

+    }

+

+    return count;

+}

+

+static UINT32 zOss_MonitorAgt_GetPcMessageId(UINT32 ueMsgId)

+{

+    UINT32 pcMsgId = INVLID_MESSAGE_ID; 

+    UINT32 i = 0;

+    for(i = 0; i < UE_MSG_NUM; i++)

+    {

+        if(g_MsgIdMap[i].ueMsgId == ueMsgId)

+        {  

+            pcMsgId = g_MsgIdMap[i].pcMsgId; 

+            break;

+        }

+    }

+

+return pcMsgId;

+}

+

+static VOID zOss_MonitorAgt_ReduceStatusCount(UINT32 msgId)

+{

+    int i = 0;

+    for(i = 0; i < PC_WINDOW_NUM; i++)

+    {

+        if(g_Status[i].msgId == msgId)

+        {

+            g_Status[i].count--;

+            break;

+        }

+    }

+}

+

+static VOID zOss_MonitorAgt_SetStatusCount(UINT32 msgId)

+{

+    int i = 0;

+    UINT32 count = zOss_MonitorAgt_GetUeMessageNum(msgId);

+

+    for(i = 0; i < PC_WINDOW_NUM; i++)

+    {

+        if(g_Status[i].msgId == msgId)

+        {

+            g_Status[i].count = count;

+            break;

+        }

+    }

+}

+

+static UINT32 zOss_MonitorAgt_GetStatusCount(UINT32 msgId)

+{

+    int i = 0;

+

+    for(i = 0; i < PC_WINDOW_NUM; i++)

+    {

+        if(g_Status[i].msgId == msgId)

+        {

+            return g_Status[i].count;

+        }

+    }

+ 

+    return INVLID_STATUS_VALUE;

+}

+

+OsAgt_Status zOss_MonitorAgt_CheckReceiveMessage(UINT32 msgId)

+{

+    if(zOss_MonitorAgt_GetStatusCount(msgId) == 0)

+    {

+        zOss_MonitorAgt_SetStatusCount(msgId);

+        return OsAgt_Status_Ok;

+    }

+    else

+    {

+        //discard received pc message

+        return OsAgt_Status_Error;

+    }

+}

+

+OsAgt_Status zOss_MonitorAgt_CheckReplyMessage(UINT32 ueMsgId)

+{

+    UINT32 pcMsgId = zOss_MonitorAgt_GetPcMessageId(ueMsgId);

+

+    zOss_MonitorAgt_ReduceStatusCount(pcMsgId);

+    if(zOss_MonitorAgt_GetStatusCount(pcMsgId) == 0)

+    {

+        //send message to pc

+        return OsAgt_Status_Ok;

+    }

+    else

+    {

+        return OsAgt_Status_Error;

+    }

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_toolkit.c b/cp/ps/plat/src/oss/sup/src/sup_agent_toolkit.c
new file mode 100644
index 0000000..8103c11
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_toolkit.c
@@ -0,0 +1,154 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "sup_agent_toolkit.h"

+#include "commgt_api.h"

+#ifdef _USE_WINCOMM_SERVER

+#include "tools.h"

+#endif

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+//wincommÍ·²¿ÏûÏ¢ÖеÄMsgType¶¨Òå

+#define WINCOMM_MSG_HEAD_TYPE_DATA 1

+

+//Ä£¿éºÅ¶¨Òå

+#define PC_TOOL_MODULE_ID          155

+#define PC_TOOL_SUB_MODULE_ID      1

+#define AGT_SUB_MODULE_ID          SUBMDL_MONAGENT

+

+//Êý¾Ý·Ö¶ÎÍ·²¿³¤¶È

+#define DATA_SEG_HEAD_LEN          3

+

+//×î´ó·¢ËÍÊý¾Ý³¤¶È£¬wincommÖ§³Ö64kº¬wincomm×Ô¼º·â×°µÄÍ·²¿£¬ÕâÀïÁôÒ»µãÔ¤Áô¸øwincommÍ·²¿

+#define DATA_MAX_LEN               0xf000

+static ZOSS_TASK_ID s_osTaskId = NULL;

+

+#define SEND_DATA_OK                0

+#define SEND_DATA_ERR               1

+

+static int zOss_MonitorAgt_SendDataSeg(BYTE msgId, BYTE curSeg, BYTE maxSeg,  UINT8* curDataPtr, UINT16 dataLen);

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_SetOsTaskId(ZOSS_TASK_ID taskId)

+{

+    s_osTaskId = taskId;

+}

+

+VOID zOss_MonitorAgt_SendMsgToOs(UINT32 id, UINT16 len, UINT8* buf)

+{

+    zOss_TaskSendData(id, buf, len, s_osTaskId);

+}

+

+VOID zOss_MonitorAgt_CharToByteArray(char* array, const char* charStr, DWORD maxLen)

+{

+    DWORD strenLen = strlen(charStr);

+

+    if (strenLen > maxLen)

+    {

+        strenLen = maxLen;

+    }

+    zOss_Memcpy(array, charStr, strenLen);

+}

+

+VOID zOss_MonitorAgt_FileNameToByteArray(char* array, const char* charStr, DWORD maxLen)

+{

+    UINT32 pos = 0;

+    DWORD strenLen = strlen(charStr);

+

+    if (strenLen > maxLen)

+    {

+        pos = strenLen - maxLen;

+        strenLen = maxLen;

+    }

+    

+    zOss_Memcpy(array, charStr + pos, strenLen);

+}

+

+VOID zOss_MonitorAgt_SendDataToPcTool(UINT8* buf, UINT32 len)

+{

+    #ifdef _USE_WINCOMM_SERVER

+    UINT8* curPtr = buf + 1;

+    UINT16 maxDataLen = DATA_MAX_LEN - DATA_SEG_HEAD_LEN;

+    UINT32 dataLen = len - 1;

+    UINT16 dataLenTemp;

+    UINT32 segNum = (dataLen % maxDataLen) >0 ? dataLen / maxDataLen + 1 : dataLen / maxDataLen;

+    int i;

+    if (buf == NULL)

+    {

+        return;

+    }

+    for (i=1;i<=segNum;i++)

+    {

+        dataLenTemp = dataLen > maxDataLen? maxDataLen : dataLen;

+        if (SEND_DATA_ERR == zOss_MonitorAgt_SendDataSeg(buf[0], i, segNum,  curPtr, dataLenTemp))

+        {

+            break;

+        }

+        dataLen = dataLen - dataLenTemp;

+        curPtr = curPtr + dataLenTemp;

+    }    

+    zOss_Free(buf);

+    #else

+    zOss_SendToPC(WINCOMM_MSG_HEAD_TYPE_DATA, buf, len, PC_TOOL_MODULE_ID, PC_TOOL_SUB_MODULE_ID, AGT_SUB_MODULE_ID);

+    #endif

+}

+

+

+int zOss_MonitorAgt_SendDataSeg(BYTE msgId, BYTE curSeg, BYTE maxSeg,  UINT8* curDataPtr, UINT16 dataLen)

+{

+    UINT32 uRet = ZOSS_ERROR;

+    UINT8* sendBuf = Comm_Malloc(DATA_SEG_HEAD_LEN + dataLen);

+    if (sendBuf == NULL)

+    {

+        return SEND_DATA_ERR;

+    }

+    sendBuf[0] = msgId;

+    sendBuf[1] = curSeg;

+    sendBuf[2] = maxSeg;

+    if (dataLen != 0)

+    {

+        zOss_Memcpy(sendBuf + DATA_SEG_HEAD_LEN, curDataPtr, dataLen);

+    }

+    uRet = zTools_SendData(sendBuf, DATA_SEG_HEAD_LEN + dataLen, PC_TOOL_MODULE_ID, PC_TOOL_SUB_MODULE_ID, AGT_SUB_MODULE_ID);

+    if(uRet != ZOSS_SUCCESS)

+    {

+        Comm_Free(sendBuf);

+        return SEND_DATA_ERR;

+    }

+    return SEND_DATA_OK;

+}

+#endif

+

+

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_uemessage.c b/cp/ps/plat/src/oss/sup/src/sup_agent_uemessage.c
new file mode 100644
index 0000000..8a0a652
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_uemessage.c
@@ -0,0 +1,912 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+#ifdef _USE_MONITOR

+

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "sup_agent_uemessage.h"

+#include "sup_agent.h"

+#include "sup_agent_osinfopack.h"

+#include "sup_agent_status.h"

+#include "sup_agent_toolkit.h"

+#ifdef _USE_WINCOMM_SERVER

+#include "commgt_api.h"

+#endif

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+#define HEADER_LEN (1)

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef VOID (*UeMessageCallBack)(PBYTE buf, UINT32 len);

+

+typedef struct

+{

+    UINT32 length;

+    UINT8* buffer;

+}T_BufferInfo;

+

+typedef VOID(*ConstructWindow)(VOID);

+

+typedef struct 

+{

+    T_BufferInfo heap;

+    T_BufferInfo pool;

+    T_BufferInfo cpuLoad;

+    T_BufferInfo cpuFrequency;

+    T_BufferInfo version;

+    UeMessageCallBack send;

+

+}T_UeMessage;

+

+/**************************************************************************************************

+* staticº¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+static T_UeMessage s_ueMessage;

+

+static VOID ConstructTwoMessageWindow(int windowId, T_BufferInfo* info1, T_BufferInfo* info2);

+static VOID ConstructThreeMessageWindow(int windowId, T_BufferInfo* info1, T_BufferInfo* info2, T_BufferInfo* info3);

+

+static VOID SendReplyMessage(UINT32 msgId, ConstructWindow func);

+

+static T_BufferInfo* GetHeap(VOID);

+static T_BufferInfo* GetPool(VOID);

+static T_BufferInfo* GetCpuLoad(VOID);

+static T_BufferInfo* GetCpuFrequency(VOID);

+static T_BufferInfo* GetUeVersion(VOID);

+

+static VOID ConstructMemWindowInfo(VOID);

+static VOID ConstructCpuWindowInfo(VOID);

+

+

+//thread window

+static OsAgt_Status ReceiveThreadInfo(UINT32 msgId, T_ZOss_Mon_Thread* message);

+

+//event window

+static OsAgt_Status ReceiveEventInfo(UINT32 msgId, T_ZOss_Mon_Event* message);

+

+//timer window

+static OsAgt_Status ReceiveTimerInfo(UINT32 msgId, T_ZOss_Mon_Timer* message);

+

+//task window

+static OsAgt_Status ReceiveTaskInfo(UINT32 msgId, T_ZOss_Mon_Task* message);

+

+//Ram log window

+static OsAgt_Status ReceiveRamLog(UINT32 msgId, T_ZOss_Mon_Ramlog* message);

+

+//pool alloc window

+static OsAgt_Status ReceivePoolAllocInfo(UINT32 msgId, T_ZOss_Mon_Pool_Alloc* message);

+

+//mmu window

+static OsAgt_Status ReceiveMmuInfo(UINT32 msgId, T_ZOss_Mon_Mmu* message);

+

+//message window 

+static OsAgt_Status ReceiveMsgInfo(UINT32 msgId, T_ZOss_Mon_Msg* message);

+

+//Pool Leak window

+static OsAgt_Status ReceivePoolLeakInfo(UINT32 msgId, T_ZOss_Mon_Pool_Leak* message);

+

+//Variable window

+static OsAgt_Status ReceiveVariable(UINT32 msgId, T_ZOss_Mon_Get_Var_Ack* message);

+

+//Mem window 

+static OsAgt_Status ReceiveHeap(T_ZOss_Mon_Heap* message);

+static OsAgt_Status ReceivePool(T_ZOss_Mon_Pool* message);

+static VOID SendMemWindowInfo(UINT32 msgId);

+

+//cpu window

+static OsAgt_Status ReceiveVersion(UINT32 msgId, T_ZOss_Mon_Version* message);

+static OsAgt_Status ReceiveCpuLoad(T_ZOss_Mon_Cpu_Load* message);

+static OsAgt_Status ReceiveCpuFrequency(T_ZOss_Mon_Cpu_Frequency* message);

+static VOID SendCpuWindowInfo(UINT32 msgId);

+

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+static T_BufferInfo* GetHeap(VOID)

+{

+    return &(s_ueMessage.heap);

+}

+

+static T_BufferInfo* GetPool(VOID)

+{

+    return &(s_ueMessage.pool);

+}

+

+static T_BufferInfo* GetCpuLoad(VOID)

+{

+    return &(s_ueMessage.cpuLoad);

+}

+

+static T_BufferInfo* GetCpuFrequency(VOID)

+{

+    return &(s_ueMessage.cpuFrequency);

+}

+

+static T_BufferInfo* GetUeVersion(VOID)

+{

+    return  &(s_ueMessage.version);

+}

+

+static VOID ConstructTwoMessageWindow(int windowId, T_BufferInfo* info1, T_BufferInfo* info2)

+{

+    UINT8* temp = NULL;

+    T_BufferInfo window = {0};

+    window.length =info1->length + info2->length + HEADER_LEN;

+    #ifdef _USE_WINCOMM_SERVER

+    window.buffer = zOss_Malloc(window.length);

+    #else

+    window.buffer = zOss_Malloc(window.length);

+    #endif

+    if(window.buffer != NULL)

+    {

+        temp = window.buffer;

+        *temp = (UINT8)windowId; 

+

+        temp += HEADER_LEN; 

+        zOss_Memcpy(temp, info1->buffer, info1->length);

+

+        temp += info1->length; 

+        zOss_Memcpy(temp, info2->buffer, info2->length);

+    }

+

+    s_ueMessage.send((BYTE*)window.buffer, (WORD)window.length);

+

+    zOss_Free(info1->buffer);

+    zOss_Free(info2->buffer);

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(window.buffer);

+    #endif

+}

+

+static VOID ConstructThreeMessageWindow(int windowId, T_BufferInfo* info1, T_BufferInfo* info2, T_BufferInfo* info3)

+{

+    UINT8* temp = NULL;

+    T_BufferInfo window = {0};

+    window.length =info1->length + info2->length + info3->length + HEADER_LEN;

+    #ifdef _USE_WINCOMM_SERVER

+    window.buffer = zOss_Malloc(window.length);

+    #else

+    window.buffer = zOss_Malloc(window.length);

+    #endif

+    if(window.buffer != NULL)

+    {

+        temp = window.buffer;

+        *temp = (UINT8)windowId; 

+

+        temp += HEADER_LEN; 

+        zOss_Memcpy(temp, info1->buffer, info1->length);

+

+        temp += info1->length; 

+        zOss_Memcpy(temp, info2->buffer, info2->length);

+

+        temp += info2->length;

+        zOss_Memcpy(temp, info3->buffer, info3->length);

+    }

+

+    s_ueMessage.send((BYTE*)window.buffer, (WORD)window.length);

+

+    zOss_Free(info1->buffer);

+    zOss_Free(info2->buffer);

+    zOss_Free(info3->buffer);

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(window.buffer);

+    #endif

+}

+

+static VOID SendReplyMessage(UINT32 msgId, ConstructWindow func)

+{

+    if(zOss_MonitorAgt_CheckReplyMessage(msgId) == OsAgt_Status_Ok)

+    {

+        func();

+    }

+}

+

+static VOID ConstructMemWindowInfo(VOID)

+{

+    ConstructTwoMessageWindow(AGT_PC_WINDOW_INFO_MEM, GetHeap(), GetPool());

+}

+

+static VOID ConstructCpuWindowInfo(VOID)

+{

+    ConstructThreeMessageWindow(AGT_PC_WINDOW_INFO_CPU, GetCpuLoad(), GetCpuFrequency(), GetUeVersion());

+}

+

+//version

+static OsAgt_Status ReceiveVersion(UINT32 msgId, T_ZOss_Mon_Version* message)

+{

+    T_BufferInfo* bufferInfo = &(s_ueMessage.version);

+

+    if(message == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo->length = sizeof(T_Version);

+    bufferInfo->buffer = zOss_Malloc(bufferInfo->length);

+

+    if(bufferInfo->buffer != NULL)

+    {

+        zOss_MonitorAgt_PackVersion(bufferInfo->buffer, message);

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+

+//thread

+static OsAgt_Status ReceiveThreadInfo(UINT32 msgId, T_ZOss_Mon_Thread* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Thread_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_THREAD;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackThreadEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//event

+static OsAgt_Status ReceiveEventInfo(UINT32 msgId, T_ZOss_Mon_Event* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Event_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_EVENT;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackEventEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//timer

+static OsAgt_Status ReceiveTimerInfo(UINT32 msgId, T_ZOss_Mon_Timer* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Timer_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_TIMER;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackTimerEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER    

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//task

+static OsAgt_Status ReceiveTaskInfo(UINT32 msgId, T_ZOss_Mon_Task* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Task_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_TASK;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackTaskEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+

+//Ram log

+static OsAgt_Status ReceiveRamLog(UINT32 msgId, T_ZOss_Mon_Ramlog* message)

+{

+    T_BufferInfo bufferInfo = {0};

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->ramlog == NULL || message->size == 0)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(message->size + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_RAMLOG;

+        zOss_Memcpy(bufferInfo.buffer + HEADER_LEN, message->ramlog, message->size);

+    }

+        

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//pool alloc

+static OsAgt_Status ReceivePoolAllocInfo(UINT32 msgId, T_ZOss_Mon_Pool_Alloc* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Pool_Alloc_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_POOL;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackPoolAllocEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//mmu

+static OsAgt_Status ReceiveMmuInfo(UINT32 msgId, T_ZOss_Mon_Mmu* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Mmu_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_MMU;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackMmuEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//message 

+static OsAgt_Status ReceiveMsgInfo(UINT32 msgId, T_ZOss_Mon_Msg* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Msg_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_MSG;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackMsgEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//Pool Leak

+static OsAgt_Status ReceivePoolLeakInfo(UINT32 msgId, T_ZOss_Mon_Pool_Leak* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Pool_Leak_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_POOLLEAK;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackPoolLeakEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+

+//Variable

+static OsAgt_Status ReceiveVariable(UINT32 msgId, T_ZOss_Mon_Get_Var_Ack* message)

+{

+    T_BufferInfo bufferInfo = {0};

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->value == NULL || message->size == 0)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(message->size + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_VARIABLE;

+        zOss_Memcpy(bufferInfo.buffer + HEADER_LEN, message->value, message->size);

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+

+//Mem 

+static OsAgt_Status ReceiveHeap(T_ZOss_Mon_Heap* message)

+{

+    T_BufferInfo* heap = &(s_ueMessage.heap);

+

+    if(message == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    heap->length = sizeof(T_Heap);

+    heap->buffer = zOss_Malloc(heap->length);

+    if(heap->buffer != NULL)

+    {

+        zOss_MonitorAgt_PackHeap(heap->buffer, message);

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+static OsAgt_Status ReceivePool(T_ZOss_Mon_Pool* message)

+{

+    BYTE* temp = NULL;

+    unsigned int index = 0;

+    UINT32 length = sizeof(T_Pool_Ele); 

+    T_BufferInfo* pool = &(s_ueMessage.pool);

+    

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    pool->length = (UINT32)(message->num*length); 

+    pool->buffer = zOss_Malloc(pool->length); 

+    if(pool->buffer != NULL)

+    {

+        temp = pool->buffer; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackPoolEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+

+

+static VOID SendMemWindowInfo(UINT32 msgId)

+{

+    SendReplyMessage(msgId, ConstructMemWindowInfo);

+}

+

+//cpu

+static OsAgt_Status ReceiveCpuLoad(T_ZOss_Mon_Cpu_Load* message)

+{

+    T_BufferInfo* cpuLoad = &(s_ueMessage.cpuLoad);

+

+    if(message == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    cpuLoad->length = sizeof(T_CpuLoad);

+    cpuLoad->buffer = zOss_Malloc(cpuLoad->length);

+    if(cpuLoad->buffer != NULL)

+    {

+        zOss_MonitorAgt_PackCpuLoad(cpuLoad->buffer, message);

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+static OsAgt_Status ReceiveCpuFrequency(T_ZOss_Mon_Cpu_Frequency* message)

+{

+    T_BufferInfo* cpuFrequency = &(s_ueMessage.cpuFrequency);

+

+    if(message == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    cpuFrequency->length = sizeof(T_Frequency);

+    cpuFrequency->buffer = zOss_Malloc(cpuFrequency->length);

+    if(cpuFrequency->buffer != NULL)

+    {

+        zOss_MonitorAgt_PackFrequency(cpuFrequency->buffer, message);

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+

+static VOID SendCpuWindowInfo(UINT32 msgId)

+{

+    SendReplyMessage(msgId, ConstructCpuWindowInfo);

+}

+

+

+VOID zOss_MonitorAgt_InitUeMessage()

+{

+    zOss_Memset(&s_ueMessage, 0, sizeof(s_ueMessage));

+    s_ueMessage.send = zOss_MonitorAgt_SendDataToPcTool;

+}

+

+

+VOID zOss_MonitorAgt_UeMessageHandler(UINT32 msgId, UINT8 *buf)

+{

+    OsAgt_Status status = OsAgt_Status_Ok;

+

+    switch(msgId)

+    {

+        case OSS_MON_VERSION:

+            if((status = ReceiveVersion(msgId, (T_ZOss_Mon_Version*)buf)) == OsAgt_Status_Ok)

+            {

+                SendCpuWindowInfo(msgId);

+            }

+            break;

+

+        case OSS_MON_THREAD:

+            ReceiveThreadInfo(msgId, (T_ZOss_Mon_Thread*)buf);

+            break;

+

+        case OSS_MON_EVENT:

+            ReceiveEventInfo(msgId, (T_ZOss_Mon_Event*)buf);

+            break;

+

+        case OSS_MON_TIMER:

+            ReceiveTimerInfo(msgId, (T_ZOss_Mon_Timer*)buf);

+            break;

+

+        case OSS_MON_TASK:

+            ReceiveTaskInfo(msgId, (T_ZOss_Mon_Task*)buf);

+            break;

+

+        case OSS_MON_RAMLOG:

+            ReceiveRamLog(msgId, (T_ZOss_Mon_Ramlog*)buf);

+            break;

+

+        case OSS_MON_POOL_ALLOC:

+            ReceivePoolAllocInfo(msgId, (T_ZOss_Mon_Pool_Alloc*)buf);

+            break;

+

+        case OSS_MON_MMU:

+            ReceiveMmuInfo(msgId, (T_ZOss_Mon_Mmu*)buf);

+            break;

+

+        case OSS_MON_MSG:

+            ReceiveMsgInfo(msgId, (T_ZOss_Mon_Msg*)buf);

+            break;

+

+        case OSS_MON_POOL_LEAK:

+            ReceivePoolLeakInfo(msgId, (T_ZOss_Mon_Pool_Leak*)buf);

+            break;

+

+        case OSS_MON_GET_VAR_ACK:

+            ReceiveVariable(msgId, (T_ZOss_Mon_Get_Var_Ack*)buf);

+            break;

+

+        case OSS_MON_HEAP:

+            {

+                if((status = ReceiveHeap((T_ZOss_Mon_Heap*)buf)) == OsAgt_Status_Ok)

+                {

+                    SendMemWindowInfo(msgId);

+                }

+            }

+            break;

+

+        case OSS_MON_POOL:

+            {

+                if((status = ReceivePool((T_ZOss_Mon_Pool*)buf)) == OsAgt_Status_Ok)

+                {

+                    SendMemWindowInfo(msgId);

+                }

+            }

+            break;

+

+        case OSS_MON_CPU_LOAD:

+            {

+                if((status = ReceiveCpuLoad((T_ZOss_Mon_Cpu_Load*)buf)) == OsAgt_Status_Ok)

+                {

+                    SendCpuWindowInfo(msgId);

+                }

+            }

+            break;

+

+        case OSS_MON_CPU_FREQUENCY:

+            {

+                if((status = ReceiveCpuFrequency((T_ZOss_Mon_Cpu_Frequency*)buf)) == OsAgt_Status_Ok)

+                {

+                    SendCpuWindowInfo(msgId);

+                }

+            }

+            break;

+

+        default:

+            break;

+    }

+

+    if(status == OsAgt_Status_Error)

+    {

+        zOss_MonitorAgt_CheckReplyMessage(msgId);

+    }

+

+    return;

+}

+

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_assert.c b/cp/ps/plat/src/oss/sup/src/sup_assert.c
new file mode 100644
index 0000000..1861b16
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_assert.c
@@ -0,0 +1,83 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_assert.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ¶ÏÑÔ½Ó¿Ú

+* ×÷    Õß : 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_TOS

+extern void tos_assert_failed(const char *exp, const char *file, const char *func, int line);

+#elif defined (_OS_LINUX)

+extern void linux_assert_failed(const char *exp, const char *file, const char *func, int line);

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º EXP_Handler

+* ¹¦ÄÜÃèÊö£º zOss_ASSERT´¦Àí

+* ²ÎÊý˵Ã÷£º pExp:zOss_ASSERTµÄ±í´ïʽ

+      pcFileName£º³ö´íµÄÎļþÃû

+      pcFuncName£º³ö´íµÄº¯ÊýÃû

+      dwLineNum£º ³ö´íËùÔÚµÄÐÐ

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID EXP_Handler(const CHAR *pExp, const CHAR *pcFileName, const CHAR *pcFuncName, SINT32 dwLineNum)

+{

+#ifdef _OS_WIN

+    _assert(pExp, (char *)pcFileName, (unsigned int)dwLineNum);

+#elif defined (_OS_OSE)

+    ZOSS_INTR old_intr;

+  

+    ZOSS_SAVE_IRQ(old_intr);

+    ose_assertion_failed((char *)pExp, (char *)pcFileName, (unsigned int)dwLineNum);

+    old_intr = old_intr != 0 ? old_intr : 0;

+#elif defined (_OS_TOS)

+    tos_assert_failed((const char *)pExp, pcFileName, pcFuncName, dwLineNum);

+#elif defined (_OS_LINUX)

+    linux_assert_failed((const char *)pExp, pcFileName, pcFuncName, dwLineNum);

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

diff --git a/cp/ps/plat/src/oss/sup/src/sup_crc.c b/cp/ps/plat/src/oss/sup/src/sup_crc.c
new file mode 100644
index 0000000..7ebbf1a
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_crc.c
@@ -0,0 +1,166 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : CrcCheck.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : CRCУÑéµÄʵÏÖÎļþ

+* ×÷    Õß : ÐíÐË¿ü 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 2007-08-31

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* CRC */

+const UINT8 crctable[256] = /* reversed, 8-bit, poly=0x07 */

+{

+    0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75,

+    0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b,

+    0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69,

+    0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67,

+

+    0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d,

+    0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43,

+    0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51,

+    0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f,

+

+    0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05,

+    0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b,

+    0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19,

+    0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17,

+

+    0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d,

+    0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33,

+    0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21,

+    0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f,

+

+    0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95,

+    0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b,

+    0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89,

+    0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87,

+

+    0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad,

+    0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3,

+    0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1,

+    0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf,

+

+    0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5,

+    0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb,

+    0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9,

+    0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7,

+

+    0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd,

+    0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3,

+    0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1,

+    0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf

+};

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºComm_CrcCalc

+* ¹¦ÄÜÃèÊö£º¸ù¾Ý¸ø¶¨µÄÊý¾Ý¼ÆËãCRCУÑéÂë

+* ²ÎÊý˵Ã÷£º(IN)

+            buf:ÊäÈ뻺³åÇø

+            len:ÊäÈ뻺³åÇøµÄ³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£º¼ÆËã³öµÄУÑéÂë

+* ÆäËû˵Ã÷£ºÎÞ

+**************************************************************************/

+UINT8 Comm_CrcCalc(const UINT8 *buf, UINT8 len)

+{

+    UINT8 fcs = 0xff;

+    

+    if (buf != NULL)

+    {

+        while (len--)

+        {

+            fcs = crctable[fcs ^ *buf++];

+        }

+        

+        return (UINT8)(0xff - fcs);

+    }

+    else

+    {

+        return 0;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºComm_CrcCheck

+* ¹¦ÄÜÃèÊö£ºCRCУÑ麯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            buf:Êý¾Ý»º³åÇø

+            len:»º³åÇøÊý¾Ý³¤¶È

+            crc:УÑéÂë

+            (OUT)   

+* ·µ »Ø Öµ£º³É¹¦·µ»Ø0£¬·ñÔò·µ»Ø-1.

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+SINT32 Comm_CrcCheck(UINT8 *buf, UINT8 len, UINT8 crc)

+{

+    UINT8 fcs = 0xff;

+

+    zOss_AssertEx(buf != NULL, -1);

+

+    while (len--)

+    {

+        fcs = crctable[fcs ^ *buf++];

+    }

+    fcs = crctable[fcs ^ crc];

+    

+    return (fcs == 0xcf ? 0 : -1);

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except.c b/cp/ps/plat/src/oss/sup/src/sup_except.c
new file mode 100644
index 0000000..43520fe
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except.c
@@ -0,0 +1,369 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_except.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Òì³£¹ÜÀíÄ£¿é

+* ×÷    Õß : ÏÄйú

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007/08/01

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÖܹúÆÂ

+* °æ ±¾ ºÅ : V1.1

+* ÐÞ¸ÄÈÕÆÚ : 2007/09/03

+* ÐÞ¸ÄÄÚÈÝ : Ôö¼Ó½Ó¿Úº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+#include "oss_api.h"

+#include "osa.h"

+#include "sup.h"

+#include "sup_except.h"

+#include "ThreadPriority.h"

+#ifdef _USE_WDT_RST

+#include "drvs_wdt.h"

+#include "sys_func_atcfg.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_TOS

+extern FLOAT Osa_GetProcessCPU(ZOSS_THREAD_ID thread_id);

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _USE_WDT_RST

+#define TRACE_WATCHDOG_FEED_PERIOD          1000

+#define TRACE_WATCHDOG_FEED_VALUE           5000

+#endif

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+#ifndef _USE_PSM

+#if defined (_OS_WIN) || defined (_OS_OSE)

+static VOID Excep_IdleThread(SINT32 ingore);

+#endif

+#endif

+#ifdef _USE_WDT_RST

+static VOID Excep_WatchDogCallBack(SINT32 args);

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ZOSS_TASK_ID gExcep_DaemonTask = ZOSS_INVALID_TASK_ID;

+

+static T_EXCEP_PARAM                *gExcep_Param   = NULL;

+

+#ifdef _USE_WDT_RST

+static ZOSS_TIMER_ID                gTrace_WatchDogTimerID      = NULL;

+#endif

+/* ÒÆÖ² */

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/* ÒÆ Ö² */

+#ifndef _USE_PSM

+#if defined (_OS_WIN) || defined (_OS_OSE)

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Excep_IdleThread

+* ¹¦ÄÜÃèÊö£º 

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Excep_IdleThread(SINT32 ingore)

+{

+#ifdef _OS_OSE

+    UINT32 dwZero=0;

+    SINT32 i = 0;

+

+    for(;;)

+    {

+        i++;

+        if (!(i%3000000))

+        {

+            SYSTIME_Init();

+        }

+    }

+#elif defined (_OS_TOS)

+     for(;;)

+        ;

+#elif defined (_OS_LINUX)

+     for(;;)

+        ;

+#endif

+}

+#endif

+#endif

+#ifdef _USE_WDT_RST

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Excep_WatchDogCallBack

+* ¹¦ÄÜÃèÊö£º ¶¨Ê±Æ÷ι¹·»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷£º args:  ¶¨Ê±Æ÷²ÎÊý

+* ·µ »Ø Öµ£º VOID

+* ÆäËü˵Ã÷£º VOID

+**************************************************************************/

+static VOID Excep_WatchDogCallBack(SINT32 args)

+{

+    zDrvWdt_FeedDog(TRACE_WATCHDOG_FEED_VALUE);

+}

+#endif

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Excep_Init

+* ¹¦ÄÜÃèÊö£º Ò쳣ģ¿é³õʼ»¯

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 EXCEP_Init(VOID)

+{

+#if defined(_USE_WDT_RST)

+    UINT32          nRet    = ZOSS_ERROR;

+    UINT32          flag    = 0;

+

+    flag = zOss_GetExceptResetFlag();

+    if (flag == EXCEPT_RESET_ENABLE)

+    {

+        gTrace_WatchDogTimerID = zOss_CreateTimer("WatchDogTimer",

+                                                  (ZOSS_TIMER_FUN)Excep_WatchDogCallBack,

+                                                  (SINT32)0,

+                                                  TRUE);

+        zOss_AssertEx(NULL != gTrace_WatchDogTimerID, ZOSS_ERROR);

+

+        nRet = zOss_StartTimer(gTrace_WatchDogTimerID,

+                               TRACE_WATCHDOG_FEED_PERIOD,

+                               Excep_WatchDogCallBack,

+                               0);

+        zOss_AssertEx(ZOSS_ERROR != nRet, ZOSS_ERROR);

+    }

+    else

+    {

+        zDrvWdt_Stop();

+    }

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º EXCEP_StartDaemonTask

+* ¹¦ÄÜÃèÊö£º Æô¶¯ÈÎÎñËÀÑ­»·¼à²â

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 EXCEP_StartDaemonTask(VOID)

+{

+    T_OSS_PARAM     *osscfg = NULL;

+

+    if(THR1_PRI < 1)

+    {

+        return ZOSS_ERROR;

+    }

+

+    osscfg = zOss_GetOssCfg();

+    gExcep_Param = &(osscfg->ExcepCfg);

+    gExcep_DaemonTask = zOss_CreateTask(EXCEP_DAEMONTASKNAME, Excep_DaemonTask, 4 * 1024, THR1_PRI - 1, 2048, 0);

+    if (ZOSS_INVALID_TASK_ID == gExcep_DaemonTask)

+    {

+        return ZOSS_ERROR;

+    }

+    if (ZOSS_ERROR == zOss_TaskSend(EV_POWERON, NULL, 0, gExcep_DaemonTask))

+    {

+        return ZOSS_ERROR;

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Excep_DaemonTask

+* ¹¦ÄÜÃèÊö£º Ò쳣ģ¿éÊØ»¤ÈÎÎñ

+* ²ÎÊý˵Ã÷£º state:ÈÎÎñ״̬

+      msg_id:ÏûÏ¢ID

+      buf:ÏûÏ¢ÌåÖ¸Õë

+      msg_len:ÏûÏ¢³¤¶È

+      private_data:˽ÓÐÊý¾Ý

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Excep_DaemonTask(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data)

+{

+    ZOSS_TIMER_ID   tid         = ZOSS_INVALID_TIMER_ID;

+    ZOSS_TASK_ID    *task_ids   = (ZOSS_TASK_ID *)private_data;

+    

+    switch (state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch (msg_id)

+            {

+            case EV_INIT:

+                {

+                    break;

+                }

+            case EV_POWERON:

+                {

+                    tid = zOss_SetRelativeTimer(gExcep_Param->DeamonStartTime, EV_ZOSS_EXCEP_WDT_SET, 0);

+                    if (ZOSS_INVALID_TIMER_ID == tid)

+                    {

+                        zOss_ASSERT(0);

+                    }

+                    if (ZOSS_ERROR == zOss_SetState(ZOSS_STATUS_WORK))

+                    {

+                        zOss_ASSERT(0);

+                    }

+                    break;

+                }

+            default:

+                {

+                    break;

+                }

+            }

+            break;

+        }

+    case ZOSS_STATUS_WORK:

+        {

+            switch (msg_id)

+            {

+            case EV_ZOSS_EXCEP_WDT_SET:

+                {

+                    /* ÉèÖÃËÀÑ­»·¼ì²â¶¨Ê±Æ÷ */

+                    tid = zOss_SetLoopTimer(gExcep_Param->DeadLoopCheckTime, EV_ZOSS_EXCEP_DEADLOOPCHECK, 0);

+                    if (ZOSS_INVALID_TIMER_ID == tid)

+                    {

+                        zOss_ASSERT(0);

+                    }

+#ifndef _USE_PSM

+#if defined (_OS_WIN) || defined (_OS_OSE)

+                    if (ZOSS_INVALID_THREAD_ID == zOss_CreateThread(EXCEP_IDLETHREADNAME, Excep_IdleThread, 0, 1024, 31, 1, 1))

+                    {

+                        zOss_ASSERT(0);

+                    }

+#endif

+#endif

+                    break;

+                }

+            case EV_ZOSS_EXCEP_DEADLOOPCHECK:

+                {

+                    UINT32 num = 0;

+                    UINT32 i = 0;

+                    T_ZOss_TCB *tinfo = NULL;

+                    

+                    num = Sche_DeadLoop(task_ids);

+                    while (ZOSS_INVALID_TASK_ID != task_ids[i] && i < num)

+                    {

+                        /* OSS_DeleteTask(task_ids[i]); */

+                        if (NULL == tinfo)

+                        {

+                            tinfo = (T_ZOss_TCB *)zOss_Malloc(sizeof(T_ZOss_TCB));

+                            if (NULL == tinfo)

+                            {

+                                zOss_AssertExN(NULL != tinfo);

+                            }

+                        }

+                        if (ZOSS_ERROR == zOss_GetTaskInfo(task_ids[i], tinfo))

+                        {

+                            tinfo->task_name[0] = '\0';

+                        }

+                        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_ABNORMAL, "dead task found:%p,name:%s\r\n", task_ids[i], tinfo->task_name);

+                        

+                        i++;

+                    }

+                    if (NULL != tinfo)

+                    {

+                        zOss_Free(tinfo);

+                    }

+                    break;

+                }

+            default:

+                {

+                    break;

+                }

+            }   /* end switch(msg_id) */

+            break;

+        }

+    default:

+        {  

+            break;

+        }

+    }   /* end switch(state) */

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetCPU

+* ¹¦ÄÜÃèÊö£º µÃµ½CPUµÄʹÓÃÂÊ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º CPUµÄʹÓÃÂÊ(0-100)

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT8 zOss_GetCPU(VOID)

+{

+#ifdef _OS_OSE

+    UINT8                   rate = 0;

+    ZOSS_THREAD_ID          t_id = ZOSS_INVALID_THREAD_ID;

+    T_ZOsa_ThreadUserArea   *pUa = NULL;

+

+    t_id    = zOss_GetThreadIDByName(EXCEP_IDLETHREADNAME);

+    pUa     = Osa_GetThreadUserArea(t_id, FALSE);

+    rate    = (UINT8)pUa->cpupercent;

+    if (rate > 100)

+    {

+        rate = 0;

+    }

+

+    return (100 - rate);

+#elif defined (_OS_TOS)

+    return (UINT8)(100 - Osa_GetProcessCPU(zOss_GetThreadIDByName(EXCEP_IDLETHREADNAME)));

+#else

+    return 0;

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm.S b/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm.S
new file mode 100644
index 0000000..ab17053
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm.S
@@ -0,0 +1,133 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_except_arm_asm.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : arm´¦ÀíÆ÷

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/12/16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+.global zOss_RamdumpSaveRegisters

+.global zOss_Cp15ReadControlRegister

+.global zOss_ReadCpsr

+.global zOss_CleanCache

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern Osa_CoreRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.text

+.balign 4

+.type zOss_RamdumpSaveRegisters, %function

+zOss_RamdumpSaveRegisters:    

+    PUSH     {r14}

+    LDR      r14, =Osa_CoreRegisters

+    STM      r14!, {r0-r12}             /* ±£´ær0-r12   */

+    MOV      r0, r14                    /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ» */

+    LDR      r14, [r13], #4             /* »¹Ô­r13,r14  */

+    MRS      r1, CPSR                   /* ±£´æcpsrÖÁr1 */

+    MSR      CPSR_c, #0xdf              /* SYS modeµÈ¼Ûusr mode */

+    STM      r0!, {r13, r14}            /* ½«{r13,r14}ÈëÕ»  */

+    MRS      r2, SPSR

+    STR      r2, [r0], #4               /* ½«SPSRÈëÕ»   */

+    MSR      CPSR_c, #0xd3              /* svc mode     */

+    STM      r0!, {r13, r14}            /* ½«{r13,r14}  */

+    MRS      r2, SPSR

+    STR      r2,  [r0], #4              /* ½«SPSRÈëÕ»   */

+    MSR      CPSR_c, #0xd7              /* ABT mode     */

+    MRS      r2,  SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xdb              /* UND mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xd2              /* IRQ mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xd1              /* FIQ mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r8-r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, r1                 /* »¹Ô­CPRS     */

+    LDR      r14, =Osa_CoreRegisters    /* »¹Ô­¼Ä´æÆ÷   */      

+    LDM      r14!, {r0-r12}             /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­    */

+    LDMDB    r13, {R14}                 /* »¹Ô­r14      */

+    BX       r14                        /* ·µ»Ø         */

+	

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_Cp15ReadControlRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type zOss_Cp15ReadControlRegister, %function

+zOss_Cp15ReadControlRegister:

+    MRC     p15, 0, r0, c1, c0, 0

+    BX      LR

+    

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_ReadCpsr

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type zOss_ReadCpsr, %function

+zOss_ReadCpsr:    

+    MRS     r0, CPSR

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcleanCache

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type zOss_CleanCache, %function

+zOss_CleanCache: 

+    mov     r0, #0;

+    mcr     p15, 0, r0, c7, c14, 0

+    mcr     p15, 0, r0, c7, c5,  0

+    mcr     p15, 0, r0, c7, c15, 0

+    mcr     p15, 0, r0, c7, c10, 4

+    BX      LR

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm_rvct.S b/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm_rvct.S
new file mode 100644
index 0000000..3cd70f0
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm_rvct.S
@@ -0,0 +1,126 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2013 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm_asm_rvct.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : arm´¦ÀíÆ÷

+* ×÷    Õß : µËÄþˆÒ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2013/10/12

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+    EXPORT zOss_RamdumpSaveRegisters

+    EXPORT cp15_readControlRegister

+    EXPORT cp15_readDomainRegister

+    EXPORT cp15_readTTB

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+    IMPORT Osa_CoreRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+    AREA ||.text||, CODE, ALIGN = 2

+zOss_RamdumpSaveRegisters    

+    PUSH     {r14}

+    LDR      r14,=Osa_CoreRegisters

+    STM      r14!,{r0-r12}          /* ±£´ær0-r12                           */

+    MOV      r0,r14                 /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ»    */

+    LDR      r14,[r13],#4           /* »¹Ô­r13,r14                          */

+    MRS      r1,CPSR                /* ±£´æcpsrÖÁr1                         */

+    MSR      CPSR_c,#0xdf           /*SYS modeµÈ¼Ûusr mode                  */

+    STM      r0!,{r13,r14}          /* ½«{r13,r14}ÈëÕ»                      */

+    MRS      r2,SPSR

+    STR      r2,[r0],#4             /* ½«SPSRÈëÕ»                           */

+    MSR      CPSR_c,#0xd3           /*svc mode                              */

+    STM      r0!,{r13,r14}          /* ½«{r13,r14}                          */

+    MRS      r2,SPSR

+    STR      r2,[r0],#4             /* ½«SPSRÈëÕ»                           */

+    MSR      CPSR_c,#0xd7           /* ABT mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xdb           /* UND mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd2           /* IRQ mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd1           /* FIQ mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r8-r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,r1              /* »¹Ô­CPRS                             */

+    LDR      r14,=Osa_CoreRegisters /* »¹Ô­¼Ä´æÆ÷                           */      

+    LDM      r14!,{r0-r12}          /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­        */

+    LDMDB    r13,{R14}              /* »¹Ô­r14                              */

+    BX       r14                    /* ·µ»Ø                                 */

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readControlRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readControlRegister

+    MRC     p15, 0, r0, c1, c0, 0

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readDomainRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readDomainRegister

+    MRC     p15, 0, r0, c3, c0, 0

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readTTB 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readTTB

+    MRC     p15, 0, r0, c2, c0, 0   

+    BX      LR

+

+    END

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except_cortexm_asm.S b/cp/ps/plat/src/oss/sup/src/sup_except_cortexm_asm.S
new file mode 100644
index 0000000..d216c15
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except_cortexm_asm.S
@@ -0,0 +1,112 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_except_cortex_asm.s

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : cortex´¦ÀíÆ÷

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/12/16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+.syntax unified
+.thumb
+.text
+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern g_zRamdumpRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.align  2

+.global zOss_RamdumpSaveRegisters

+.thumb
+.thumb_func
+.type   zOss_RamdumpSaveRegisters, %function

+zOss_RamdumpSaveRegisters:

+    push     {r1}

+    ldr      r1, =g_zRamdumpRegisters

+    stm      r1!, {r0}                       

+    mov      r0, r1                         

+    ldr      r1, [r13]

+    stm      r0!, {r1-r6}

+    mov      r1, r7

+    mov      r2, r8

+    mov      r3, r9

+    mov      r4, r10

+    mov      r5, r11

+    mov      r6, r12

+    stm      r0!,{r1-r6}                /*r0 - r12*/

+    

+    mov      r1, r13

+    adds     r1, r1, #0x4

+    mov      r2, r14

+    mrs      r3, psr

+    mrs      r4, primask

+    mrs      r5, control

+    stm      r0!, {r1-r5}               /* r13,r14,xPSR,primask,control */

+

+    ldr      r0, =g_zRamdumpRegisters              

+    adds     r0, r0, #0x20

+    ldm      r0!, {r1-r5}    

+    mov      r8, r1

+    mov      r9, r2

+    mov      r10, r3

+    mov      r11, r4

+    mov      r12, r5                    /*r8 - r12*/

+    

+    ldm      r0!, {r1-r5}   

+    mov      r13, r1

+    mov      r14, r2                    /* r13,r14 */

+    msr      apsr_nzcvq, r3

+    msr      primask, r4

+    msr      control, r5

+

+    ldr      r0, =g_zRamdumpRegisters

+    adds     r0, r0, #0x4

+    ldm      r0!, {r1-r7}               /* r1 - r7 */

+    ldr      r0, =g_zRamdumpRegisters   /* r0 */

+    ldr      r0, [r0]    

+    bx       r14

+    

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_CleanCache 

+ ¹¦ÄÜÃèÊö£ºÇåcacheÊý¾Ý

+ ²ÎÊý˵Ã÷£º(IN):  ÎÞ

+           (OUT): ÎÞ

+ ·µ »Ø Öµ£ºÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/ 

+.align  2

+.global zOss_CleanCache

+.thumb
+.thumb_func
+.type   zOss_CleanCache, %function

+zOss_CleanCache:

+    bx       r14

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except_csky_asm.S b/cp/ps/plat/src/oss/sup/src/sup_except_csky_asm.S
new file mode 100644
index 0000000..fc24642
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except_csky_asm.S
@@ -0,0 +1,211 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_csky_asm.s

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <pkgconf/hal.h>

+#include <pkgconf/system.h>

+#include <cyg/hal/board.h>

+#ifdef CYGPKG_KERNEL

+#include <pkgconf/kernel.h>

+#endif

+#include <pkgconf/hal_cskycpu.h>

+#include <cyg/hal/arch.inc>

+#include <pkgconf/kernel.h>

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö±äÁ¿ÉùÃ÷

+**************************************************************************/

+.globl  zOss_RamdumpSaveRegisters

+//.globl  zOss_LoadRegisters

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern gRamdumpAdrress

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * ±£´æ¼Ä´æÆ÷ÐÅÏ¢ 

+ * º¯ÊýÔ­ÐÍ VOID  zOss_RamdumpSaveRegisters(VOID)

+ **************************************************************************/

+.text

+.balign 4

+zOss_RamdumpSaveRegisters:

+    subi    r0, 4

+    stw     r10, (r0, 0)  //°Ñr15ѹջ£¬ÒÔ±ãºóÐøÊ¹Ó㻽èÓÃr10£»

+    lrw     r10, gRamdumpAdrress

+/* ±£´ær0-r15 */

+    stw     r1, (r10, 4)

+    stw     r2, (r10, 8)

+    stw     r3, (r10, 12)

+    stw     r4, (r10, 16)

+    stw     r5, (r10, 20)

+    stw     r6, (r10, 24)

+    stw     r7, (r10, 28)

+    stw     r8, (r10, 32)

+    stw     r9, (r10, 36)

+    ldw     r1,  (r0,  0)    

+    stw     r1, (r10, 40)

+    addi    r0,  4           

+    stw     r0, (r10, 0)

+    stw     r11, (r10, 44)

+    stw     r12, (r10, 48)

+    stw     r13, (r10, 52)

+    stw     r14, (r10, 56)

+    stw     r15, (r10, 60)

+/* ±£´æ¿ØÖƼĴæÆ÷ */

+    addi    r10, 32

+    addi    r10, 32

+    mfcr    r1,  psr

+    stw     r1, (r10, 0)

+    mfcr    r1,  VBR

+    stw     r1, (r10, 4)

+    mfcr    r1,  epsr

+    stw     r1, (r10, 8)

+    mfcr    r1,  fpsr

+    stw     r1, (r10, 12)

+    mfcr    r1,  epc

+    stw     r1, (r10, 16)

+    mfcr    r1,  fpc

+    stw     r1, (r10, 20)

+    mfcr    r1,  ss0

+    stw     r1, (r10, 24)

+    mfcr    r1,  ss1

+    stw     r1, (r10, 28)

+    mfcr    r1,  ss2

+    stw     r1, (r10, 32)

+    mfcr    r1,  ss3

+    stw     r1, (r10, 36)

+    mfcr    r1,  ss4

+    stw     r1, (r10, 40)

+    mfcr    r1,  gcr

+    stw     r1, (r10, 44)

+    mfcr    r1,  gsr

+    stw     r1, (r10, 48)

+    mfcr    r1,  cr13    //²úÆ·ÐòºÅ¼Ä´æÆ÷cr13

+    stw     r1, (r10, 52)

+    mfcr    r1,  cr14    //dsp¿ØÖÆ×´Ì¬¼Ä´æÆ÷£»

+    stw     r1, (r10, 56)

+    mfcr    r1,  cr15    //½ö´æÔÚÓÚ´øÐ­´¦ÀíÆ÷½Ó¿ÚµÄck_core´¦ÀíÆ÷ÖÐ(Èçck610M¡¢ck610sµÈ)

+    stw     r1, (r10, 60)

+    addi    r10, 32

+    addi    r10, 32

+    mfcr    r1,  cr17    //¸ßËÙ»º´æ¼Ä´æÆ÷£»

+    stw     r1, (r10, 0)

+    mfcr    r1,  cr18    //¸ßËÙ»º´æÅäÖüĴæÆ÷£»

+    stw     r1, (r10, 4)

+    mfcr    r1,  cr19    //¿É¸ßËٺͷÃÎÊȨÏÞÅäÖüĴæÆ÷£»

+    stw     r1, (r10, 8)

+    mfcr    r1,  cr20    //±£»¤Çø¿ØÖƼĴæÆ÷£»

+    stw     r1, (r10, 12)

+    mfcr    r1,  cr21    //±£»¤Çø Ñ¡Ôñ¼Ä´æÆ÷£»

+    stw     r1, (r10, 16)

+    jmp     r15

+    

+#if 0

+/**************************************************************************

+ * ±£´æ¼Ä´æÆ÷ÐÅÏ¢ 

+ * º¯ÊýÔ­ÐÍ VOID  zOss_LoadRegisters(VOID)

+ *¸Ãº¯ÊýµÄʹÓÃÐèҪעÒâzOss_SaveRegistersº¯Êý

+ **************************************************************************/

+.text

+.balign 4

+zOss_LoadRegisters:

+    lrw     r10, gRamdumpAdrress

+    addi    r10, 32

+    addi    r10, 32

+//¼ÓÔØ¿ØÖƼĴæÆ÷

+    ldw    r1, (r10, 0)

+    mtcr   r1,  psr

+    ldw    r1, (r10, 4)

+    mtcr   r1,  VBR

+    ldw    r1, (r10, 8)

+    mtcr   r1,  epsr

+    ldw    r1, (r10, 12)

+    mtcr   r1,  fpsr

+    ldw    r1, (r10, 16)

+    mtcr   r1,  epc

+    ldw    r1, (r10, 20)

+    mtcr   r1,  fpc

+    ldw    r1, (r10, 24)

+    mtcr   r1,  ss0

+    ldw    r1, (r10, 28)

+    mtcr   r1,  ss1

+    ldw    r1, (r10, 32)

+    mtcr   r1,  ss2

+    ldw    r1, (r10, 36)

+    mtcr   r1,  ss3

+    ldw    r1, (r10, 40)

+    mtcr   r1,  ss4

+    ldw    r1, (r10, 44)

+    mtcr   r1,  gcr

+    ldw    r1, (r10, 48)

+    mtcr   r1,  gsr

+    ldw    r1, (r10, 52)

+    mtcr   r1,  cr13

+    ldw    r1, (r10, 56)

+    mtcr   r1,  cr14

+    ldw    r1, (r10, 60)

+    mtcr   r1, cr15

+    addi    r10, 32

+    addi    r10, 32

+    ldw     r1, (r10, 0)

+    mtcr   r1, cr17

+    ldw    r1, (r10, 4)

+    mtcr  r1, cr18

+    ldw    r1, (r10, 8)

+    mtcr  r1, cr19

+    ldw   r1, (r10, 12)

+    mtcr  r1, cr20

+    ldw    r1, (r10, 16)

+    mtcr  r1, cr21

+

+    subi  r10, 32

+    subi  r10, 32

+    subi  r10, 32

+    subi  r10, 32

+//¼ÓÔØr0-r15

+    ldw     r0, (r10, 0)

+    ldw     r1, (r10, 4)

+    ldw     r2, (r10, 8)

+    ldw     r3, (r10, 12)

+    ldw     r4, (r10, 16)

+    ldw     r5, (r10, 20)

+    ldw     r6, (r10, 24)

+    ldw     r7, (r10, 28)

+    ldw     r8, (r10, 32)

+    ldw     r9, (r10, 36)

+    ldw     r11, (r10, 44)

+    ldw     r12, (r10, 48)

+    ldw      r13, (r10, 52)

+    ldw      r14, (r10, 56)

+    ldw      r15, (r10, 60)

+    ldw     r10, (r10, 40)

+    jmp    r15

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_monitor.c b/cp/ps/plat/src/oss/sup/src/sup_monitor.c
new file mode 100644
index 0000000..c828c8c
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_monitor.c
@@ -0,0 +1,636 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : Ö§³Å²ã¼à¿ØÄ£¿é

+* ÎÄ ¼þ Ãû : oss_monitor.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ö§³Å²ãÊý¾ÝµÄÊÕ¼¯£¬Óë¸ú×Ù¹¤¾ß´úÀíÈÎÎñ½øÐн»»¥

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/12/12

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 

+* ÐÞ ¸Ä ÈË : 

+* ÐÞ¸ÄÈÕÆÚ : 

+* ÐÞ¸ÄÄÚÈÝ : 

+**************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "osa.h"

+#include "sup_except.h"

+#include "oss_irq.h"

+#include "oss_trace.h"

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#if (defined _USE_ZX297550_HARDWARE)

+# define OSS_MON_VERSION_TYPE   "7550"

+#elif (defined _USE_ZX297520_HARDWARE)

+# define OSS_MON_VERSION_TYPE   "7520"

+#elif (defined _USE_ZX297510_HARDWARE)

+# define OSS_MON_VERSION_TYPE   "7510"

+#elif (defined _USE_ZX297502_HARDWARE)

+# define OSS_MON_VERSION_TYPE   "7502"

+#else

+# define OSS_MON_VERSION_TYPE   "unkown"

+#endif

+

+#define OSS_MON_AGT_NAME        "OsAgt"

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT32  msgId;

+    UINT32  (*func)(UINT8 *ptr);

+} oss_mon_func_t;

+

+typedef struct

+{

+    T_ZOss_Mon_Version        monVersionInfo;

+    T_ZOss_Mon_Cpu_Frequency  monCpuFrequency;

+    T_ZOss_Mon_Cpu_Load       monCpuLoad;

+    T_ZOss_Mon_Pool           monPoolInfo;

+    T_ZOss_Mon_Pool_Alloc     monPoolAlloc;

+    T_ZOss_Mon_Pool_Leak      monPoolLeak;

+    T_ZOss_Mon_Heap           monHeapInfo;

+    T_ZOss_Mon_Thread         monThreadInfo;

+    T_ZOss_Mon_Task           monTaskInfo;

+    T_ZOss_Mon_Event          monEventInfo;

+    T_ZOss_Mon_Msg            monMsgInfo;

+    T_ZOss_Mon_Ramlog         monRamlogInfo;

+    T_ZOss_Mon_Get_Var_Ack    monGetVarInfo;

+    T_ZOss_Mon_Timer          monTimerInfo;

+    T_ZOss_Mon_Mmu            monMmuInfo;

+} oss_mon_ele_ptr_t;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static UINT32 monitor_MessageDisposeHandler(UINT32 msg_id, UINT8 *buf);

+static UINT32 monitor_VersionInfo(UINT8 *buf);

+static UINT32 monitor_CpuFrequencyInfo(UINT8 *buf);

+static UINT32 monitor_CpuLoadInfo(UINT8 *buf);

+static UINT32 monitor_PoolInfo(UINT8 *buf);

+static UINT32 monitor_PoolAllocInfo(UINT8 *buf);

+static UINT32 monitor_PoolLeakInfo(UINT8 *buf);

+static UINT32 monitor_HeapInfo(UINT8 *buf);

+static UINT32 monitor_ThreadInfo(UINT8 *buf);

+static UINT32 monitor_TaskInfo(UINT8 *buf);

+static UINT32 monitor_EventInfo(UINT8 *buf);

+static UINT32 monitor_MsgInfo(UINT8 *buf);

+static UINT32 monitor_RamlogInfo(UINT8 *buf);

+static UINT32 monitor_TimerInfo(UINT8 *buf);

+static UINT32 monitor_MmuInfo(UINT8 *buf);

+static UINT32 monitor_GetVarInfo(UINT8 *buf);

+static UINT32 monitor_SetVarInfo(UINT8 *buf);

+static UINT32 monitor_SetMonFlag(UINT8 *buf);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+UINT32                      gOsa_MonitorFlag        = FALSE;

+static ZOSS_TASK_ID         gMon_OsAgtID            = NULL;       

+static oss_mon_ele_ptr_t    oss_mon_ele_ptr         = {0};

+static oss_mon_func_t       oss_mon_id_to_func[]    =

+{

+    {OSS_MON_VERSION,       monitor_VersionInfo     },

+    {OSS_MON_CPU_FREQUENCY, monitor_CpuFrequencyInfo},

+    {OSS_MON_CPU_LOAD,      monitor_CpuLoadInfo     },

+    {OSS_MON_POOL,          monitor_PoolInfo        },

+    {OSS_MON_POOL_ALLOC,    monitor_PoolAllocInfo   },

+    {OSS_MON_POOL_LEAK,     monitor_PoolLeakInfo    },

+    {OSS_MON_HEAP,          monitor_HeapInfo        },

+    {OSS_MON_THREAD,        monitor_ThreadInfo      },

+    {OSS_MON_TASK,          monitor_TaskInfo        },

+    {OSS_MON_EVENT,         monitor_EventInfo       },

+    {OSS_MON_MSG,           monitor_MsgInfo         },

+    {OSS_MON_RAMLOG,        monitor_RamlogInfo      },

+    {OSS_MON_GET_VAR_REQ,   monitor_GetVarInfo      },  

+    {OSS_MON_SET_VAR,       monitor_SetVarInfo      },

+    {OSS_MON_TIMER,         monitor_TimerInfo       },

+    {OSS_MON_MMU,           monitor_MmuInfo         },

+};

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMonitor_TaskEntry

+* ¹¦ÄÜÃèÊö£º³õʼ»¯¼à¿Ø¹ÜÀíÄ£¿éÈë¿Úº¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+*           state:   ÈÎÎñ״̬

+*           msg_id:  ÏûÏ¢ID

+*           buf:     ÏûÏ¢buf  

+*           msg_len: ÏûÏ¢³¤¶È

+*           private: ˽ÓÐÊý¾Ý

+*           (OUT)

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Monitor_TaskEntry(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data)

+{

+    UINT32 status = ZOSS_ERROR;

+

+    switch(state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch(msg_id)

+            {

+            case EV_INIT:

+                {

+                    break;

+                }

+                

+            case EV_POWERON:

+                {

+                    gMon_OsAgtID = zOss_GetTaskID(OSS_MON_AGT_NAME);

+                    #ifdef CYGOPT_HAL_ARM_MMU

+                    zTos_GetMmuConfigTable(&oss_mon_ele_ptr.monMmuInfo);

+                    #endif

+                    status = zOss_SetState(ZOSS_STATUS_WORK);

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR_POWERON:Fail to set state!");

+                    }

+                    break;

+                }

+                

+            default:

+                {

+                    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR:Receive a invalid message!");

+                    break;

+                }

+            }

+            break;

+        }

+        

+    case ZOSS_STATUS_WORK:  

+        {

+            switch(msg_id)

+            {

+            case OSS_MON_SET_FLAG:

+                {

+                    status = monitor_SetMonFlag(buf);

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR:Fail to set Monitor flag!");

+                    }

+                    break;

+                }

+                

+            default:

+                {           

+                    status = monitor_MessageDisposeHandler(msg_id, buf);

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR:Fail to dispose message!");

+                    }

+                    break;

+                }

+            }

+            break;

+        }

+        

+    default:

+        {

+            break;

+        }

+    }	

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_MessageDisposeHandler

+* ¹¦ÄÜÃèÊö£º¼à¿Ø¹ÜÀíÄ£ÏûÏ¢´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+*           msg_id: ÏûÏ¢ID 

+*           buf:    ÏûÏ¢buf           

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_MessageDisposeHandler(UINT32 msg_id, UINT8 *buf)

+{

+    UINT32 cnt = 0;

+

+    if (!gOsa_MonitorFlag)

+    {

+        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR: Monitor flag is off!");

+        return ZOSS_ERROR;

+    }

+

+    for (cnt = 0; cnt < ARRAY_SIZE(oss_mon_id_to_func); cnt++)

+    {

+        if (msg_id == oss_mon_id_to_func[cnt].msgId)

+        {

+            return (oss_mon_id_to_func[cnt].func(buf));

+        }

+    }

+

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_VersionInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÏà¹ØµÄ°æ±¾ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_VersionInfo(UINT8 *buf)

+{

+    oss_mon_ele_ptr.monVersionInfo.version = (char *)OSS_MON_VERSION_TYPE;

+

+    return zOss_TaskSendData(OSS_MON_VERSION,

+                             &oss_mon_ele_ptr.monVersionInfo,

+                             sizeof(T_ZOss_Mon_Version),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_CpuFrequencyInfo

+* ¹¦ÄÜÃèÊö£ºÌṩCPUÖ÷ƵÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_CpuFrequencyInfo(UINT8 *buf)

+{

+    oss_mon_ele_ptr.monCpuFrequency.frequency = 128;//zDrvSysClk_GetArmCoreFreq();

+    

+    return zOss_TaskSendData(OSS_MON_CPU_FREQUENCY,

+                             &oss_mon_ele_ptr.monCpuFrequency,

+                             sizeof(T_ZOss_Mon_Cpu_Frequency),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_CpuLoadInfo

+* ¹¦ÄÜÃèÊö£ºÌṩCPU¸ºÔØÂÊ

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_CpuLoadInfo(UINT8 *buf)

+{

+    oss_mon_ele_ptr.monCpuLoad.load = 

+        (unsigned short)( (OSS_MON_PERCENT_RADIO - Osa_GetProcessCPU(zOss_GetThreadIDByName(EXCEP_IDLETHREADNAME)))

+        * OSS_MON_PERCENT_RADIO);

+

+    return zOss_TaskSendData(OSS_MON_CPU_LOAD,

+                             &oss_mon_ele_ptr.monCpuLoad,

+                             sizeof(T_ZOss_Mon_Cpu_Load),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_PoolInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÄÚ´æ³ØµÄʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÄÚ´æ³Øµ±Ç°µÄͳ¼ÆÐÅϢΪ¸÷sizeµÄʹÓøöÊý

+**************************************************************************/

+static UINT32 monitor_PoolInfo(UINT8 *buf)

+{

+    pool_used_info(&oss_mon_ele_ptr.monPoolInfo);

+    

+#ifdef POOL_DEBUG

+    return zOss_TaskSendData(OSS_MON_POOL,

+                             &oss_mon_ele_ptr.monPoolInfo,

+                             sizeof(T_ZOss_Mon_Pool),

+                             gMon_OsAgtID);

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+  

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_PoolAllocInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÄÚ´æ³ØµÄÉêÇëʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_PoolAllocInfo(UINT8 *buf)

+{

+    pool_alloc_info(&oss_mon_ele_ptr.monPoolAlloc);

+

+#ifdef POOL_DEBUG

+    return zOss_TaskSendData(OSS_MON_POOL_ALLOC,

+                             &oss_mon_ele_ptr.monPoolAlloc,

+                             sizeof(T_ZOss_Mon_Pool_Alloc),

+                             gMon_OsAgtID);

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_PoolLeakInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÄÚ´æ³ØµÄÉêÇëʹÓÃй¶Çé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_PoolLeakInfo(UINT8 *buf)

+{

+    pool_leak_info(&oss_mon_ele_ptr.monPoolLeak);

+    

+#ifdef POOL_DEBUG

+    return zOss_TaskSendData(OSS_MON_POOL_LEAK,

+                             &oss_mon_ele_ptr.monPoolLeak,

+                             sizeof(T_ZOss_Mon_Pool_Leak),

+                             gMon_OsAgtID);

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_HeapInfo

+* ¹¦ÄÜÃèÊö£ºÌṩ¶ÑÄÚ´æµÄʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_HeapInfo(UINT8 *buf)

+{

+    z0ss_GetHeapInfo(&oss_mon_ele_ptr.monHeapInfo);

+    

+    return zOss_TaskSendData(OSS_MON_HEAP, 

+                             &oss_mon_ele_ptr.monHeapInfo, 

+                             sizeof(T_ZOss_Mon_Heap), 

+                             gMon_OsAgtID); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_ThreadInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÏ̵߳ÄÏà¹Ø×´Ì¬ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_ThreadInfo(UINT8 *buf)

+{

+    z0ss_GetAllThreadInfo(&oss_mon_ele_ptr.monThreadInfo);

+    

+    return zOss_TaskSendData(OSS_MON_THREAD,

+                             &oss_mon_ele_ptr.monThreadInfo,

+                             sizeof(T_ZOss_Mon_Thread),

+                             gMon_OsAgtID); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_TaskInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÈÎÎñµÄÏà¹Ø×´Ì¬ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_TaskInfo(UINT8 *buf)

+{       

+    zOss_GetAllTaskInfo(&oss_mon_ele_ptr.monTaskInfo);

+

+    return zOss_TaskSendData(OSS_MON_TASK, 

+                             &oss_mon_ele_ptr.monTaskInfo, 

+                             sizeof(T_ZOss_Mon_Task), 

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_EventInfo

+* ¹¦ÄÜÃèÊö£ºÌṩϵͳµ÷¶ÈʼþÏà¹ØÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_EventInfo(UINT8 *buf)

+{

+    z0ss_GetEventInfo(&oss_mon_ele_ptr.monEventInfo);

+    

+    return zOss_TaskSendData(OSS_MON_EVENT,

+                             &oss_mon_ele_ptr.monEventInfo,

+                             sizeof(T_ZOss_Mon_Event),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_MsgInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÏûÏ¢µÄÊÕ·¢ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_MsgInfo(UINT8 *buf)

+{

+    z0ss_GetMsgInfo(&oss_mon_ele_ptr.monMsgInfo);

+    

+    return zOss_TaskSendData(OSS_MON_MSG,

+                             &oss_mon_ele_ptr.monMsgInfo,

+                             sizeof(T_ZOss_Mon_Msg),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_RamlogInfo

+* ¹¦ÄÜÃèÊö£ºÌṩRamlogÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_RamlogInfo(UINT8 *buf)

+{    

+    z0ss_GetRamlogInfo(&oss_mon_ele_ptr.monRamlogInfo);

+

+    return zOss_TaskSendData(OSS_MON_RAMLOG,

+                             &oss_mon_ele_ptr.monRamlogInfo,

+                             sizeof(T_ZOss_Mon_Ramlog),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_PrivodeVarInfo

+* ¹¦ÄÜÃèÊö£ºÌṩָ¶¨±äÁ¿µÄÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_GetVarInfo(UINT8 *buf)

+{

+    T_ZOss_Mon_Get_Var_Req *varInfo = NULL;

+

+    if (buf == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+

+    varInfo = (T_ZOss_Mon_Get_Var_Req *)buf;

+    if (varInfo->base == 0 || varInfo->size == 0)

+    {

+        return ZOSS_ERROR;

+    }

+

+    oss_mon_ele_ptr.monGetVarInfo.size  = varInfo->size;

+    oss_mon_ele_ptr.monGetVarInfo.value = (unsigned char *)zOss_GetUB(oss_mon_ele_ptr.monGetVarInfo.size);

+    zOss_AssertEx(oss_mon_ele_ptr.monGetVarInfo.value != NULL, ZOSS_ERROR);

+        

+    zOss_Memcpy((VOID *)oss_mon_ele_ptr.monGetVarInfo.value, (const VOID *)varInfo->base, varInfo->size); 

+    zOss_RetUB((VOID *)varInfo);

+    varInfo = NULL;

+    return zOss_TaskSendData(OSS_MON_GET_VAR_ACK,

+                             &oss_mon_ele_ptr.monGetVarInfo,

+                             sizeof(T_ZOss_Mon_Get_Var_Ack),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_SetVarInfo

+* ¹¦ÄÜÃèÊö£ºÐÞ¸ÄÖ¸¶¨ÄÚ´æ¶ÎµÄÖµ

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_SetVarInfo(UINT8 *buf)

+{    

+    T_ZOss_Mon_Set_Var   *varInfo   = NULL;

+    ZOSS_INTR           old_intr    = 0;

+

+    if (buf == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+    varInfo = (T_ZOss_Mon_Set_Var *)buf;

+    if (varInfo->base == 0 || varInfo->size == 0)

+    {

+        return ZOSS_ERROR;

+    } 

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    zOss_Memcpy((VOID *)varInfo->base, (const VOID *)varInfo->value, varInfo->size);

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    zOss_RetUB((VOID *)varInfo->value);

+    zOss_RetUB((VOID *)varInfo);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_TimerInfo

+* ¹¦ÄÜÃèÊö£ºÌṩTimerµÄʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_TimerInfo(UINT8 *buf)

+{  

+    zOss_GetTimerInfo(&oss_mon_ele_ptr.monTimerInfo);

+    

+    return zOss_TaskSendData(OSS_MON_TIMER,

+                             &oss_mon_ele_ptr.monTimerInfo,

+                             sizeof(T_ZOss_Mon_Timer),

+                             gMon_OsAgtID); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_MmuInfo

+* ¹¦ÄÜÃèÊö£ºÌṩMMUÄÚ´æÅäÖÃÓ³Éä±íÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_MmuInfo(UINT8 *buf)

+{

+    return zOss_TaskSendData(OSS_MON_MMU,

+                             &oss_mon_ele_ptr.monMmuInfo,

+                             sizeof(T_ZOss_Mon_Mmu),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_MonFlagInfo

+* ¹¦ÄÜÃèÊö£ºÐÞ¸Ä¼à¿ØÄ£¿é±ê־λ

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_SetMonFlag(UINT8 *buf)

+{

+    T_ZOss_Mon_Set_Flag *flagInfo = NULL;

+

+    if (buf)

+    {

+        flagInfo = (T_ZOss_Mon_Set_Flag *)buf;

+        if (flagInfo->flag)

+        {

+#ifdef OSS_TRACE_THREAD

+            oss_trace_thread_open();

+#endif

+

+#ifdef TOS_STATISTIC_IRQ

+            tos_statistic_irq_open();

+#endif

+

+#ifdef TOS_TRACE_IRQ

+            tos_trace_irq_open();

+#endif

+        }

+        else

+        {

+#ifdef TOS_TRACE_IRQ        

+            tos_trace_irq_close();

+#endif

+

+#ifdef TOS_STATISTIC_IRQ

+            tos_statistic_irq_close();

+#endif

+

+#ifdef OSS_TRACE_THREAD

+            oss_trace_thread_close();

+#endif

+        }

+        gOsa_MonitorFlag = flagInfo->flag;

+        zOss_RetUB((VOID *)flagInfo);

+        return ZOSS_SUCCESS;

+    } 

+    return ZOSS_ERROR;

+}

+

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_nvm.c b/cp/ps/plat/src/oss/sup/src/sup_nvm.c
new file mode 100755
index 0000000..d5f927d
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_nvm.c
@@ -0,0 +1,1041 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98_NVM

+* ÎÄ ¼þ Ãû : nvm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : nvÊý¾Ý¹ÜÀí½Ó¿Ú

+* ×÷    Õß : ¬л¼ª

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2009-08-06

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é  EC:617001781798

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é   EC:617001781846 

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : wangqing

+* ÐÞ¸ÄÈÕÆÚ : 2018-08-27

+* ÐÞ¸ÄÄÚÈÝ : ¸ÄΪÎļþϵͳʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_nvm.h"

+#include "drv_api.h"

+#include "oss_cfg.h"

+#include "RWNvConfig.h"

+#ifdef _OS_LINUX

+#include <linux/unistd.h>

+#include <linux/ctype.h>

+#include <linux/syscalls.h>

+#include <linux/statfs.h>

+#include <linux/fs.h>

+#include <linux/uaccess.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+#ifdef USE_CPPS_KO

+#define CPPS_KO_FUNC(func) kernel_##func

+#else

+#define CPPS_KO_FUNC(func) func

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+extern void msleep(unsigned int msecs);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define NV_SYMBOL_DOWN   	0xA2        /* unused */

+#define NV_SYMBOL_NORMAL    0xB3        /* Õý³£Çé¿öϱê־λµÄÖµ */

+#define NV_SYMBOL_WRITE     0xC4        /* дNVÇé¿öϱê־λµÄÖµ */

+#define NV_SYMBOL_FACTORY   0xD5        /* ³ö³§»Ö¸´±ê־λµÄÖµ   */

+

+#define NV_WORK_AREA        0x01        /* ¹¤×÷Çø±êʶ           */

+#define NV_BACKUP_AREA      0x02        /* ±¸·ÝÇø±êʶ           */

+

+#define NVM_FS_RO_FAC_PATH         	"/mnt/nvrofs/nvroall.bin"

+#define NVM_FS_ROW_FAC_PATH         "/mnt/nvrofs/nvrowall.bin"

+#define NVM_FS_ROW_C0_FAC_PATH      "/mnt/nvrofs/nvroc0wall.bin"

+#define NVM_FS_RWO_FAC_PATH         "/mnt/imagefs/nvrwoall.bin"

+#define NVM_FS_RW_FAC_PATH         	"/mnt/imagefs/nvrwall.bin"

+#define NVM_FS_RW_HASH_FAC_PATH     "/mnt/imagefs/nvrwall.hash"

+

+#define NVM_FS_RW_DIR        		"/etc_rw/psnv"

+#define NVM_FS_RW_MAIN_PATH         "/etc_rw/psnv/rw_work"

+#define NVM_FS_RW_BACKUP_PATH       "/etc_rw/psnv/rw_backup"

+

+#define NVM_FS_FAC_SYMBOL_PATH    		"/etc_rw/psnv/fac_flag"

+#define NVM_FS_RW_MAIN_SYMBOL_PATH    	"/etc_rw/psnv/work_flag"

+#define NVM_FS_RW_BACKUP_SYMBOL_PATH    "/etc_rw/psnv/backup_flag"

+#define NVM_FS_RW_HASH_WORK_PATH        "/etc_rw/psnv/nvrwall.hash"

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static BOOL   Nvram_Check_Data(VOID);

+static UINT32 Nvram_WriteWithFlag(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen, UINT8 iNvm);

+static UINT32 Nvram_WriteRO(const CHAR *part_name, UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen);

+static UINT32 Nvram_FsRead(const CHAR *part_name, UINT32 dwStart, UINT32 dwLen, UINT8 *to);

+static UINT32 Nvram_FsWrite(const CHAR *part_name, UINT32 dwStart, UINT32 dwLen, UINT8 *from);

+static UINT32 Nvram_Remount(CHAR *DevName, CHAR *DirName, CHAR *Type, UINT32 Flag);

+static UINT32 Nvram_CopyFile(const CHAR *pDstFile, const CHAR *pSrcFile);

+static UINT32 Nvram_CmpFile(const CHAR *pDstFile, const CHAR *pSrcFile);

+static UINT32 Nvram_DirInit(VOID);

+static UINT32 Nvram_RoInit(VOID);

+static UINT32 Nvram_RwInit(VOID);

+static SINT32 Nvram_WriteFile(const CHAR *pFile, UINT8 *pBuf, UINT32 len);

+static UINT8  *Nvram_ReadFile(const CHAR *pFile, UINT32 *len);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static ZOSS_MUTEX_ID	gNV_Mutex	= NULL;   	   /* Flash²Ù×÷»¥³âÌå   */

+static BOOL             gNV_Inited 	= FALSE;       /* NV¶ÁдʹÄÜ        */

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º NV_Init

+* ¹¦ÄÜÃèÊö£º NV³õʼ»¯

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 NV_Init(VOID)

+{

+    T_OSS_PARAM *pOssParam = NULL;

+

+    if (gNV_Inited)

+        return ZOSS_SUCCESS;

+

+    /* ´´½¨NV»¥³âÁ¿ */

+    gNV_Mutex = zOss_CreateMutex("NV_Mutex", ZOSS_INHERIT);

+    if (gNV_Mutex == NULL)

+        return ZOSS_ERROR;

+

+	/* ²é¿´¹¤×÷ÇøºÍ±¸·ÝÇøÊý¾ÝÊÇ·ñÓÐЧ£¬ÈçÎÞЧÔò»Ö¸´ */

+    Nvram_Check_Data();

+

+	gNV_Inited = TRUE;

+	

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvItemRead

+* ¹¦ÄÜÃèÊö£º ¶ÁÒ»ÏîNVÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            NvItemID:     ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:   ¶Á³öµÄÊý¾Ý

+*            NvItemLen:    Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_NvItemRead(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen)

+{

+    SINT32 status = -1;

+	SINT8 *pNvFile = NULL;

+

+    if (gNV_Inited == FALSE || NvItemLen == 0 || NvItemData == NULL)

+        return ZOSS_ERROR;

+

+	if(NvItemID >= OS_FLASH_RO_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RO_OFFSET_FROM_NV + OS_FLASH_RO_NVRAM_SIZE))

+	{

+		pNvFile = NVM_FS_RO_FAC_PATH;

+		NvItemID -= OS_FLASH_RO_OFFSET_FROM_NV;

+	}

+	else if(NvItemID >= OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV + OS_FLASH_LOCKNET_ROW_SIZE))

+	{

+		pNvFile = NVM_FS_ROW_FAC_PATH;

+		NvItemID -= OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV;

+	}

+	else if(NvItemID >= OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV + OS_FLASH_C0CALIINFO_ROW_SIZE))

+	{

+		pNvFile = NVM_FS_ROW_C0_FAC_PATH;

+		NvItemID -= OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV;

+	}

+	else if(NvItemID >= OS_FLASH_RWO_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RWO_OFFSET_FROM_NV + OS_FLASH_RWO_NVRAM_SIZE))

+	{

+		pNvFile = NVM_FS_RWO_FAC_PATH;

+		NvItemID -= OS_FLASH_RWO_OFFSET_FROM_NV;

+	}

+	else if(NvItemID >= OS_FLASH_RW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RW_OFFSET_FROM_NV + OS_FLASH_RW_NVRAM_SIZE))

+	{

+		pNvFile = NVM_FS_RW_MAIN_PATH;

+		NvItemID -= OS_FLASH_RW_OFFSET_FROM_NV;

+	}

+	else

+		return ZOSS_ERROR;

+

+    /* »ñÈ¡NV²Ù×÷»¥³âÁ¿ */

+    zOss_GetMutex(gNV_Mutex, ZOSS_WAIT_FOREVER);

+	status = Nvram_FsRead(pNvFile, NvItemID, NvItemLen, NvItemData);

+    zOss_PutMutex(gNV_Mutex);

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvItemWrite

+* ¹¦ÄÜÃèÊö£º дһÏîNVÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            NvItemID:    ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:  дÈëµÄÊý¾Ý

+*            NvItemLen:   Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_NvItemWrite(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen)

+{

+    UINT32 status = ZOSS_ERROR;

+

+    if (gNV_Inited == FALSE || NvItemLen == 0 || NvItemData == NULL)

+        return ZOSS_ERROR;

+

+	zOss_GetMutex(gNV_Mutex, ZOSS_WAIT_FOREVER);  

+

+	if(NvItemID >= OS_FLASH_RW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RW_OFFSET_FROM_NV + OS_FLASH_RW_NVRAM_SIZE))

+	{//rw

+		NvItemID -= OS_FLASH_RW_OFFSET_FROM_NV;

+	    status = Nvram_WriteWithFlag(NvItemID, NvItemData, NvItemLen, NV_WORK_AREA);/* ½«Êý¾ÝдÈ빤×÷Çø */

+	    if (status == ZOSS_SUCCESS)

+	        status = Nvram_WriteWithFlag(NvItemID, NvItemData, NvItemLen, NV_BACKUP_AREA);/* ½«Êý¾ÝдÈ뱸·ÝÇø */

+	}

+	else if(NvItemID >= OS_FLASH_RO_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RO_OFFSET_FROM_NV + OS_FLASH_RO_NVRAM_SIZE))

+	{// ro

+		NvItemID -= OS_FLASH_RO_OFFSET_FROM_NV;

+		status = Nvram_FsWrite(NVM_FS_RO_FAC_PATH, NvItemID, NvItemLen, NvItemData);

+	}

+	else if(NvItemID >= OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV + OS_FLASH_LOCKNET_ROW_SIZE))

+	{// row_locknet

+		NvItemID -= OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV;

+		status = Nvram_FsWrite(NVM_FS_ROW_FAC_PATH, NvItemID, NvItemLen, NvItemData);

+	}

+	else if(NvItemID >= OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV + OS_FLASH_C0CALIINFO_ROW_SIZE))

+	{// ro_c0cail

+		NvItemID -= OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV;

+		status = Nvram_FsWrite(NVM_FS_ROW_C0_FAC_PATH, NvItemID, NvItemLen, NvItemData);

+	}

+ 

+    zOss_PutMutex(gNV_Mutex);

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ResetNVFactory

+* ¹¦ÄÜÃèÊö£º »Ö¸´³ö³§ÉèÖÃ(ÖØÆôºóÉúЧ)

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_ResetNVFactory(VOID)

+{

+    UINT8   Symbol = NV_SYMBOL_FACTORY;

+    UINT32  status = ZOSS_ERROR;

+

+	status = Nvram_FsWrite(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Symbol);

+

+    return (status == 0) ? ZOSS_SUCCESS : ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvInResume

+* ¹¦ÄÜÃèÊö£º ÊÇ·ñ´¦ÓÚNV»Ö¸´Á÷³ÌÖÐ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º TRUE:´¦ÓÚ»Ö¸´Á÷³Ì£»FLASE:²»´¦ÓÚ»Ö¸´Á÷³Ì

+* ÆäËü˵Ã÷£º Çý¶¯Ê¹ÓÃ

+**************************************************************************/

+BOOL zOss_NvInResume(VOID)

+{

+    return 0;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvramFlush

+* ¹¦ÄÜÃèÊö£º ½«»º´æÊý¾Ýдµ½NVÖÐ

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_NvramFlush(VOID)

+{

+    return Nvram_Flush();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvCheck

+* ¹¦ÄÜÃèÊö£º ¼ì²âNV±êÖ¾£¬²¢½øÐлָ´

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º Çý¶¯Ê¹ÓÃ

+**************************************************************************/

+VOID zOss_NvCheck(VOID)

+{   

+    return;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvItemWriteFactory

+* ¹¦ÄÜÃèÊö£º дһÏîNV ³ö³¡ÇøÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            NvItemID:    ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:  дÈëµÄÊý¾Ý

+*            NvItemLen:   Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ×èÈûº¯Êý£¬²»ÔÊÐíÖжϼäÖ´ÐÐ

+**************************************************************************/

+UINT32 zOss_NvItemWriteFactory(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen)

+{

+    UINT32  status = ZOSS_ERROR;

+	mm_segment_t old_fs = get_fs();

+	

+    if (gNV_Inited == FALSE || NvItemLen == 0 || NvItemData == NULL)

+		return ZOSS_ERROR;

+

+	if(NvItemID >= OS_FLASH_RW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RW_OFFSET_FROM_NV + OS_FLASH_RW_NVRAM_SIZE))

+		NvItemID -= OS_FLASH_RW_OFFSET_FROM_NV;

+	else

+		return ZOSS_ERROR;

+

+	zOss_GetMutex(gNV_Mutex, ZOSS_WAIT_FOREVER); 

+	

+	//status = Nvram_Remount("mtd:imagefs", "/mnt/imagefs", "jffs2", MS_REMOUNT |MS_VERBOSE);

+	//if(ZOSS_SUCCESS != status)

+	//{

+	//	zOss_PutMutex(gNV_Mutex);

+	//	return ZOSS_ERROR;

+	//}

+	

+	status = Nvram_FsWrite(NVM_FS_RW_FAC_PATH, NvItemID, NvItemLen, NvItemData);

+	//status |= Nvram_Remount("mtd:imagefs", "/mnt/imagefs", "jffs2", MS_REMOUNT |MS_VERBOSE | MS_RDONLY);

+

+	zOss_PutMutex(gNV_Mutex);

+	return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvGetEccLogInfo

+* ¹¦ÄÜÃèÊö£º »ñÈ¡ECC LogÐÅÏ¢

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_NvGetEccLogInfo(T_ZOss_NvEccLog *logInfo)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ChangeNvroAttr

+* ¹¦ÄÜÃèÊö£º ¸Ä±äNVRO·ÖÇøµÄÊôÐÔ

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_ChangeNvroAttr(int writable)

+{

+	if (cpnv_ChangeNvroAttr(writable) < 0)

+		return ZOSS_ERROR;

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_Finish

+* ¹¦ÄÜÃèÊö£º ½áÊøNV²Ù×÷£¬½«Êý¾Ýдµ½NVÖÐ

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 Nvram_Finish(VOID)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_Flush

+* ¹¦ÄÜÃèÊö£º ½«»º´æÊý¾Ýдµ½NVÖÐ

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 Nvram_Flush(VOID)

+{

+	return ZOSS_SUCCESS;

+}

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_DirInit

+* ¹¦ÄÜÃèÊö£º ³õʼ»¯nvmĿ¼

+* ²ÎÊý˵Ã÷£º (IN)

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_DirInit(VOID)

+{

+	if(CPPS_KO_FUNC(sys_access)(NVM_FS_RW_DIR, 0) != 0)

+	{

+		if(CPPS_KO_FUNC(sys_mkdir)(NVM_FS_RW_DIR, 0755) != 0)

+		{

+			printk("cpnv mkdir %s fali\n", NVM_FS_RW_DIR);

+			return ZOSS_ERROR;

+		}

+	}

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_RoInit

+* ¹¦ÄÜÃèÊö£º ³õʼ»¯Ro nv

+* ²ÎÊý˵Ã÷£º (IN)

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_RoInit(VOID)

+{

+	UINT8 *pNvdata;

+	UINT32  status = ZOSS_ERROR;

+	

+	if(CPPS_KO_FUNC(sys_open)(NVM_FS_RO_FAC_PATH, O_RDONLY, 0) == -ENOENT)

+	{

+		pNvdata = zOss_GetUB(OS_FLASH_RO_NVRAM_SIZE);

+		if (pNvdata == NULL)

+		{

+			printk("cpnv malloc rodata fail\n");

+			return ZOSS_ERROR;

+		}

+

+		memset(pNvdata, 0xff, OS_FLASH_RO_NVRAM_SIZE);

+		

+		status = Nvram_WriteRO(NVM_FS_RO_FAC_PATH, 0, pNvdata, OS_FLASH_RO_NVRAM_SIZE);

+		zOss_RetUB(pNvdata);

+		if(status != ZOSS_SUCCESS)

+			return ZOSS_ERROR;

+		else

+			printk("cpnv clean ro fs success!\n");

+	}

+

+	if(CPPS_KO_FUNC(sys_open)(NVM_FS_ROW_FAC_PATH, O_RDONLY, 0) == -ENOENT)

+	{

+		pNvdata = zOss_Malloc(OS_FLASH_LOCKNET_ROW_SIZE);

+		if (pNvdata == NULL)

+		{

+			printk("cpnv malloc rowdata fail\n");

+			return ZOSS_ERROR;

+		}

+

+		memset(pNvdata, 0xff, OS_FLASH_LOCKNET_ROW_SIZE);

+		status = Nvram_WriteRO(NVM_FS_ROW_FAC_PATH, 0, pNvdata, OS_FLASH_LOCKNET_ROW_SIZE);

+		zOss_Free(pNvdata);

+		if(status != ZOSS_SUCCESS)

+			return ZOSS_ERROR;

+		else

+			printk("cpnv clean row_locknet fs success!\n");

+	}

+

+	if(CPPS_KO_FUNC(sys_open)(NVM_FS_ROW_C0_FAC_PATH, O_RDONLY, 0) == -ENOENT)

+	{

+		pNvdata = zOss_Malloc(OS_FLASH_C0CALIINFO_ROW_SIZE);

+		if (pNvdata == NULL)

+		{

+			printk("cpnv malloc rowdata fail\n");

+			return ZOSS_ERROR;

+		}

+

+		memset(pNvdata, 0xff, OS_FLASH_C0CALIINFO_ROW_SIZE);

+		status = Nvram_WriteRO(NVM_FS_ROW_C0_FAC_PATH, 0, pNvdata, OS_FLASH_C0CALIINFO_ROW_SIZE);

+		zOss_Free(pNvdata);

+		if(status != ZOSS_SUCCESS)

+			return ZOSS_ERROR;

+		else

+			printk("cpnv clean row_cocail fs success!\n");

+	}

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_RwInit

+* ¹¦ÄÜÃèÊö£º ³õʼ»¯Ro nv

+* ²ÎÊý˵Ã÷£º (IN)

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_RwInit(VOID)

+{

+    UINT8   WorkArea_Symbol = 0;

+    UINT8   BackUp_Symbol   = 0;

+    UINT8   Factory_Symbol  = 0;

+    SINT32  WorkArea_Status = -1;

+    SINT32  BackUp_Status   = -1;

+    UINT32  status          = ZOSS_ERROR;

+

+factory_check:

+

+    /* °æ±¾ÏÂÔØ */ /* »Ö¸´³ö³§ */ /* FotaÉý¼¶ */

+    status = Nvram_FsRead(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Factory_Symbol);

+    if(status || Factory_Symbol == NV_SYMBOL_FACTORY || Nvram_CmpFile(NVM_FS_RW_HASH_FAC_PATH, NVM_FS_RW_HASH_WORK_PATH))

+    {

+        status = Nvram_CopyFile(NVM_FS_RW_MAIN_PATH, NVM_FS_RW_FAC_PATH);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+        status = Nvram_CopyFile(NVM_FS_RW_BACKUP_PATH, NVM_FS_RW_FAC_PATH);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+        status = Nvram_CopyFile(NVM_FS_RW_HASH_WORK_PATH, NVM_FS_RW_HASH_FAC_PATH);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+

+        WorkArea_Symbol = NV_SYMBOL_NORMAL;

+        status = Nvram_FsWrite(NVM_FS_RW_MAIN_SYMBOL_PATH, 0, 1, &WorkArea_Symbol);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+        BackUp_Symbol = NV_SYMBOL_NORMAL;

+        status = Nvram_FsWrite(NVM_FS_RW_BACKUP_SYMBOL_PATH, 0, 1, &BackUp_Symbol);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+

+        Factory_Symbol = NV_SYMBOL_NORMAL;

+        status = Nvram_FsWrite(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Factory_Symbol);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+

+        printk("cpnv version download or restore fac or fota update!\n");

+        return ZOSS_SUCCESS;

+    }

+

+    /* ¶ÁÈ¡¹¤×÷ÇøºÍ±¸·ÝÇøÖеıê־λ */

+    WorkArea_Status = Nvram_FsRead(NVM_FS_RW_MAIN_SYMBOL_PATH, 0, 1, &WorkArea_Symbol);

+    BackUp_Status   = Nvram_FsRead(NVM_FS_RW_BACKUP_SYMBOL_PATH, 0, 1, &BackUp_Symbol);

+    if(WorkArea_Status != 0 || WorkArea_Symbol != NV_SYMBOL_NORMAL) 

+    {

+        /* work area check fail */

+        if(BackUp_Status == 0 && BackUp_Symbol == NV_SYMBOL_NORMAL)

+        {

+            /* backup area check ok */

+            WorkArea_Symbol = NV_SYMBOL_WRITE;

+            status = Nvram_FsWrite(NVM_FS_RW_MAIN_SYMBOL_PATH, 0, 1, &WorkArea_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            status = Nvram_CopyFile(NVM_FS_RW_MAIN_PATH, NVM_FS_RW_BACKUP_PATH);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            WorkArea_Symbol = NV_SYMBOL_NORMAL;

+            status = Nvram_FsWrite(NVM_FS_RW_MAIN_SYMBOL_PATH, 0, 1, &WorkArea_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            printk("cpnv restore backup to main!\n");

+        }

+        else

+        {

+            /* backup and work area check both fail */

+            Factory_Symbol = NV_SYMBOL_FACTORY;

+            status = Nvram_FsWrite(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Factory_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            printk("cpnv work and backup both fail restore fac!\n");

+            goto factory_check;

+        }

+    }

+    else

+    {

+        /* WorkArea ok*/

+        if(BackUp_Status != 0 || BackUp_Symbol != NV_SYMBOL_NORMAL)

+        {

+            /* backup area check fail */

+            BackUp_Symbol = NV_SYMBOL_WRITE;

+            status = Nvram_FsWrite(NVM_FS_RW_BACKUP_SYMBOL_PATH, 0, 1, &BackUp_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            status = Nvram_CopyFile(NVM_FS_RW_BACKUP_PATH, NVM_FS_RW_MAIN_PATH);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            BackUp_Symbol = NV_SYMBOL_NORMAL;

+            status = Nvram_FsWrite(NVM_FS_RW_BACKUP_SYMBOL_PATH, 0, 1, &BackUp_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            printk("cpnv restore main to backup!\n");

+        }

+        else

+        {

+            /* WorkArea and Backup Area both ok */

+            if(ZOSS_ERROR == Nvram_CmpFile(NVM_FS_RW_BACKUP_PATH, NVM_FS_RW_MAIN_PATH))

+            {

+                Factory_Symbol = NV_SYMBOL_FACTORY;

+                status = Nvram_FsWrite(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Factory_Symbol);

+                zOss_ASSERT(status == ZOSS_SUCCESS);

+

+                printk("cpnv cmp wrong!, restore fac!\n");

+

+                goto factory_check;

+            }

+        }

+    }

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_WriteRO

+* ¹¦ÄÜÃèÊö£º дһÏîNV ROÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            part_name:   ÎļþÃû³Æ

+*            NvItemID:    ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:  дÈëµÄÊý¾Ý

+*            NvItemLen:   Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÁÙʱ·½°¸ÊÊÓ㬺óÐøÉ¾³ý

+**************************************************************************/

+static UINT32 Nvram_WriteRO(const CHAR *part_name, UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen)

+{

+    UINT32  status = ZOSS_ERROR;

+

+	status = Nvram_Remount("mtd:nvrofs", "/mnt/nvrofs", "jffs2", MS_REMOUNT |MS_VERBOSE);

+	if(ZOSS_SUCCESS != status)

+		return ZOSS_ERROR;

+	

+	status = Nvram_FsWrite(part_name, NvItemID, NvItemLen, NvItemData);

+	status |= Nvram_Remount("mtd:nvrofs", "/mnt/nvrofs", "jffs2", MS_REMOUNT |MS_VERBOSE|MS_RDONLY);

+		

+	return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_Check_Data

+* ¹¦ÄÜÃèÊö£º ²é¿´¹¤×÷ÇøºÍ±¸·ÝÇøÊý¾ÝÊÇ·ñÓÐЧ£¬ÈçÎÞЧÔò»Ö¸´

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØTRUE, ·ñÔò·µ»ØFALSE

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL Nvram_Check_Data(VOID)

+{

+	if(Nvram_DirInit() != ZOSS_SUCCESS)

+	{

+		printk("cpnv Nvram_DirInit fail!\n");

+		zOss_ASSERT(0);

+	}

+

+	 if(Nvram_RoInit() != ZOSS_SUCCESS)

+	 {

+		 printk("cpnv Nvram_RoInit fail!\n");

+		 zOss_ASSERT(0);

+	 }

+

+	 if(Nvram_RwInit() != ZOSS_SUCCESS)

+	 {

+		 printk("cpnv Nvram_RwInit fail!\n");

+		 zOss_ASSERT(0);

+	 }

+

+    return TRUE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_WriteWithFlag

+* ¹¦ÄÜÃèÊö£º дһÏîNV RW´ø±êÖ¾

+* ²ÎÊý˵Ã÷£º (IN)

+*            NvItemID:    ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:  дÈëµÄÊý¾Ý

+*            NvItemLen:   Êý¾Ý³¤¶È

+*            iNvm:   	  Ö÷»¹ÊDZ¸·Ý

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static UINT32 Nvram_WriteWithFlag(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen, UINT8 iNvm)

+{

+    CHAR          	*pSymbol_File   = NULL;

+	CHAR          	*pWrite_File   	= NULL;

+    UINT32          Start_Addr      = 0;

+    UINT8           NV_Symbol       = 0;

+    UINT32          status          = ZOSS_ERROR;

+

+    if (iNvm == NV_WORK_AREA)

+    {

+        pSymbol_File = NVM_FS_RW_MAIN_SYMBOL_PATH;

+		pWrite_File = NVM_FS_RW_MAIN_PATH;

+    }

+    else if (iNvm == NV_BACKUP_AREA)

+    {

+        pSymbol_File = NVM_FS_RW_BACKUP_SYMBOL_PATH;

+		pWrite_File = NVM_FS_RW_BACKUP_PATH;

+    }

+    else

+        return ZOSS_ERROR;

+

+    NV_Symbol   = NV_SYMBOL_WRITE;

+	status 		= Nvram_FsWrite(pSymbol_File, 0, 1, &NV_Symbol);

+    if (status != ZOSS_SUCCESS)

+        return ZOSS_ERROR;

+   

+	status = Nvram_FsWrite(pWrite_File, NvItemID, NvItemLen, NvItemData);

+    if (status != ZOSS_SUCCESS)

+        return ZOSS_ERROR;

+

+    NV_Symbol   = NV_SYMBOL_NORMAL;

+	

+    return Nvram_FsWrite(pSymbol_File, 0, 1, &NV_Symbol);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_FsRead

+* ¹¦ÄÜÃèÊö£º ´ÓÎļþ

+* ²ÎÊý˵Ã÷£º (IN)¶ÁÈ¡nv

+*            part_name: ÎļþÃû

+*            dwStart:   ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            from:  	дÈëµÄÊý¾Ý

+*            dwLen:   	Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÁÙʱ·½°¸ÊÊÓ㬺óÐøÉ¾³ý

+**************************************************************************/

+static UINT32 Nvram_FsRead(const CHAR *part_name, UINT32 dwStart, UINT32 dwLen, UINT8 *to)

+{

+	SINT32 ret = 0;

+	SINT32 fd = 0;

+	mm_segment_t old_fs = get_fs();

+

+	if((part_name == NULL) || (to == NULL))

+		return ZOSS_ERROR;

+

+	set_fs(KERNEL_DS);

+	fd = CPPS_KO_FUNC(sys_open)(part_name, O_RDONLY, 0);

+	if(fd < 0) 

+	{

+		printk("cpnv open %s fail,errno = %d\n", part_name, fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_lseek)(fd, dwStart, 0);

+	if(ret < 0) 

+	{

+		printk("cpnv lseek %s fail,errno = %d\n", part_name, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_read)(fd, to, dwLen);

+	if(ret != dwLen) 

+	{

+		printk("cpnv read %s fail, len = %d, errno = %d\n", part_name, dwLen, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	CPPS_KO_FUNC(sys_close)(fd);

+	set_fs(old_fs);

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_FsWrite

+* ¹¦ÄÜÃèÊö£º дNVÊý¾Ýµ½Îļþ

+* ²ÎÊý˵Ã÷£º (IN)

+*            part_name: ÎļþÃû

+*            dwStart:   ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            from:  	дÈëµÄÊý¾Ý

+*            dwLen:   	Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÁÙʱ·½°¸ÊÊÓ㬺óÐøÉ¾³ý

+**************************************************************************/

+static UINT32 Nvram_FsWrite(const CHAR *part_name, UINT32 dwStart, UINT32 dwLen, UINT8 *from)

+{

+	SINT32 ret = 0;

+	SINT32 fd = 0;

+	mm_segment_t old_fs = get_fs();;

+

+	if(part_name == NULL || from == NULL)

+		return ZOSS_ERROR;

+	

+	set_fs(KERNEL_DS);

+	fd = CPPS_KO_FUNC(sys_open)(part_name, O_SYNC | O_RDWR | O_CREAT , 0);

+	if(fd < 0) 

+	{

+		printk("cpnv open %s fail,errno = %d\n", part_name, fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_lseek)(fd, dwStart, 0);

+	if(ret < 0) 

+	{

+		printk("cpnv lseek %s fail,errno = %d\n", part_name, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_write)(fd, from, dwLen);

+	if(ret != dwLen) 

+	{

+		printk("cpnv write %s fail,errno = %d\n", part_name, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	CPPS_KO_FUNC(sys_fsync)(fd);

+	CPPS_KO_FUNC(sys_close)(fd);

+	set_fs(old_fs);

+	

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_Remount

+* ¹¦ÄÜÃèÊö£º ÖØÐ¹ÒÔØ·ÖÇø

+* ²ÎÊý˵Ã÷£º (IN)

+*            DevName:   É豸Ãû³Æ

+*            DirName:  	¹ÒÔØÂ·¾¶

+*            Type:   	ÎļþÀàÐÍ

+*            Flag:   	±êÖ¾

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ×èÈûº¯Êý£¬²»ÔÊÐíÖжϼäÖ´ÐÐ

+**************************************************************************/

+UINT32 Nvram_Remount(CHAR *DevName, CHAR *DirName, CHAR *Type, UINT32 Flag)

+{

+	int ret = 0;

+	mm_segment_t old_fs = get_fs();

+

+	set_fs(KERNEL_DS);

+retry1:	

+	ret = CPPS_KO_FUNC(sys_mount)(DevName, DirName, Type, Flag , 0);

+	if(ret == EBUSY)

+	{

+		msleep(10);

+		goto retry1;

+	}

+	set_fs(old_fs);

+	

+	if(ret < 0) 

+	{

+		printk("cpnv sys_mount fail,errno = %d\n", ret);

+		return ZOSS_ERROR;

+	}

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_CopyFile

+* ¹¦ÄÜÃèÊö£º ±È½Ï¹¤×÷ÇøºÍ±¸·ÝÇø

+* ²ÎÊý˵Ã÷£º (IN)

+*            pDstFile:  Ä¿±êÎļþ

+*            pSrcFile:  Ô´Îļþ

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_CopyFile(const CHAR *pDstFile, const CHAR *pSrcFile)

+{

+	UINT8 *pBuf;

+	UINT32 len;

+	UINT32 ret;

+	

+	if(pDstFile == NULL || pSrcFile == NULL)

+		return ZOSS_ERROR;

+

+	pBuf = Nvram_ReadFile(pSrcFile, &len);

+	if(!pBuf)

+		return ZOSS_ERROR;

+

+	ret = Nvram_FsWrite(pDstFile, 0, len, pBuf);

+

+	zOss_Free(pBuf);

+	

+    return ret;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_CmpFile

+* ¹¦ÄÜÃèÊö£º ±È½Ï¹¤×÷ÇøºÍ±¸·ÝÇø

+* ²ÎÊý˵Ã÷£º (IN)

+*            pDstFile:  Ä¿±êÎļþ

+*            pSrcFile:  Ô´Îļþ

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_CmpFile(const CHAR *pDstFile, const CHAR *pSrcFile)

+{

+	UINT8 *pDst;

+	UINT8 *pSrc;

+	UINT32 DstLen;

+	UINT32 SrcLen;

+

+	if(pDstFile == NULL || pSrcFile == NULL)

+		return ZOSS_ERROR;

+

+	pDst = Nvram_ReadFile(pDstFile, &DstLen);

+	if(!pDst)

+		return ZOSS_ERROR;

+	

+	pSrc = Nvram_ReadFile(pSrcFile, &SrcLen);

+	if(!pSrc)

+	{

+		zOss_Free(pDst);

+		return ZOSS_ERROR;

+	}

+	

+	if(DstLen != SrcLen)

+	{

+		zOss_Free(pSrc);

+		zOss_Free(pDst);

+		

+		printk("Nvram_CmpFile Dstbuf = %d, Srcbuf = %d\n", DstLen, SrcLen);

+		return ZOSS_ERROR;

+	}

+

+	if(memcmp(pSrc, pDst, SrcLen) != 0)

+	{

+		zOss_Free(pSrc);

+		zOss_Free(pDst);

+		return ZOSS_ERROR;

+	}

+

+	zOss_Free(pSrc);

+	zOss_Free(pDst);

+	

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_ReadFile

+* ¹¦ÄÜÃèÊö£º ¶ÁÈ¡Õû¸önvÎļþ

+* ²ÎÊý˵Ã÷£º (IN)

+*            pFile:  Îļþ

+*            len:    ³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º·µ»ØÖµµ÷ÓÃÕßÊÍ·Å

+**************************************************************************/

+static UINT8 *Nvram_ReadFile(const CHAR *pFile, UINT32 *len)

+{

+	SINT32 fd  		= 0;

+	SINT32 ret 		= 0;

+    struct stat buf = {0};

+	UINT8 *pBuf 		= {0};

+

+	if(pFile == NULL)

+		return NULL;

+

+	fd = CPPS_KO_FUNC(sys_open)(pFile, O_RDONLY, 0);

+	if(fd < 0) 

+	{

+		printk("cpnv open %s fail,errno = %d\n", pFile, fd);

+		return NULL;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_newfstat)(fd, &buf);

+    if(0 != ret)

+    {

+    	printk("cpnv stat %s fail,errno = %d\n", pFile, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+        return NULL;

+    }

+	

+	pBuf = zOss_Malloc(buf.st_size);

+	if (pBuf == NULL)

+	{

+		printk("cpnv malloc fail\n");

+		CPPS_KO_FUNC(sys_close)(fd);

+		return NULL;

+	}

+

+	ret = CPPS_KO_FUNC(sys_read)(fd, pBuf, buf.st_size);

+	if(ret != buf.st_size) 

+	{

+		printk("cpnv read %s fail,errno = %d\n", pFile, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		zOss_Free(pBuf);

+		return NULL;

+	}

+	CPPS_KO_FUNC(sys_close)(fd);

+	*len = buf.st_size;

+	

+    return pBuf;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_WriteFile

+* ¹¦ÄÜÃèÊö£º дÕû¸önvÎļþ

+* ²ÎÊý˵Ã÷£º (IN)

+*            pFile:  Îļþ

+*            len:    ³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º·µ»ØÖµµ÷ÓÃÕßÊÍ·Å

+**************************************************************************/

+/*

+static SINT32 Nvram_WriteFile(const CHAR *pFile, UINT8 *pBuf, UINT32 len)

+{

+	SINT32 fd  		= 0;

+	SINT32 ret 		= 0;

+

+	fd = CPPS_KO_FUNC(sys_open)(pFile, O_SYNC | O_RDWR | O_CREAT | O_TRUNC, 0);

+	if(fd < 0) 

+	{

+		printk("cpnv11 open %s fail,errno = %d\n", pFile, fd);

+		return 0;

+	}

+

+	ret = CPPS_KO_FUNC(sys_write)(fd, pBuf, len);

+	if(ret != len) 

+	{

+		printk("cpnv write %s fail,errno = %d\n", pFile, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		return ret;

+	}

+	

+	CPPS_KO_FUNC(sys_fsync)(fd);

+	CPPS_KO_FUNC(sys_close)(fd);

+

+    return ret;

+}

+*/

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_printf.c b/cp/ps/plat/src/oss/sup/src/sup_printf.c
new file mode 100644
index 0000000..bf78ce8
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_printf.c
@@ -0,0 +1,114 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : printagt.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ´òÓ¡´úÀíÔ´Îļþ

+* ×÷    Õß : ÀîÑô 

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-06-09

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÐíÐË¿ü

+* ÐÞ¸ÄÈÕÆÚ : 2007-09-12

+* ÐÞ¸ÄÄÚÈÝ : ÐÞ¸ÄÁËOSS_Printfʹ֮¿ÉÒÔÔÚOSE¶Ë´òÓ¡

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : ÐíÐË¿ü

+* ÐÞ¸ÄÈÕÆÚ : 2008-04-29

+* ÐÞ¸ÄÄÚÈÝ : ¶Ô´òÓ¡µÄЧÂʽøÐÐÁËÓÅ»¯

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : Ï°Ö¾Ùæ

+* ÐÞ¸ÄÈÕÆÚ : 2009-03-20

+* ÐÞ¸ÄÄÚÈÝ : ÓÅ»¯´òӡЧÂÊ¡¢Ö§³Ö´òÓ¡µ½Îļþ¡¢¼Ç¼×îºó´òÓ¡¹¦ÄܺʹòÓ¡»º³å¸ßЧ»¯

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0004

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0005

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷                                          

+**************************************************************************/

+#ifdef _OS_WIN

+#define vsnprintf _vsnprintf

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**********************************************************************

+* º¯ÊýÃû³Æ£ºvsnformat

+* ¹¦ÄÜÃèÊö£º¸ñʽ»¯×Ö·û´®²¢Êä³öÖÁ»º³åÇø

+* ²ÎÊý˵Ã÷: (IN)

+            dwMaxCount£º»º³åÇø´óС£¨°üÀ¨NULL½áÊø·û£©

+            format    £ºÒªÊ¹Óõĸñʽ´®

+            vaList    £º¿É±ä²ÎÊýÁбí

+            (OUT)

+            pcBuffer  £ºÊä³ö»º³åÇø

+* ·µ »Ø Öµ£º-1  £ºÊµ¼ÊÒªÊä³öµÄ×Ö½ÚÊý³¬³ö»º³åÇø´óС

+            ÆäËü£ºÊµ¼ÊÊä³öµÄ×Ö½ÚÊý¡£

+* ÆäËü˵Ã÷£º²»Ö§³Ö¸¡µãÊä³ö

+***********************************************************************/

+SINT32 vsnformat(CHAR *pcBuffer, UINT32 dwMaxCount, const CHAR *pcParamFormat, va_list vaList)

+{

+    return vsnprintf(( char *)pcBuffer, dwMaxCount, (char *)pcParamFormat, vaList);

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_arm.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_arm.c
new file mode 100644
index 0000000..5e62528
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_arm.c
@@ -0,0 +1,267 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_arm.c

+* Ïà¹ØÎļþ : Éú³ÉramdumpµÄarmv6¡¢armv5Ìåϵ½á¹¹µÄcmm½Å±¾Îļþ£»

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/10/19

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ¸ß»ª·å

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é              

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_ramdump.h"

+#ifdef _OS_TOS

+#include "tos_except_arm.h"

+#elif defined (_OS_LINUX)

+#include "linux_except_arm.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_ARM_MODE_NUM               6

+#define ZOSS_BANK_REG_NUM               3

+#define ZOSS_NORMAL_REG_NUM             15

+

+#define ZOSS_EXCEPT_UNDEF_INSTRUTION    0x04 

+#define ZOSS_EXCEPT_PREFETCH_ABORT      0x0C

+#define ZOSS_EXCEPT_DATA_ABORT          0x10

+#define ZOSS_EXCEPT_IRQ                 0x18

+#define ZOSS_EXCEPT_FIQ                 0x1C

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/**************************************************************************

+*Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_TOS

+extern char *zTos_MpuDisplayCp15(char *addr);

+extern char *zTos_MmuDisplayCp15(char *addr);

+#elif defined (_OS_LINUX)

+extern char *ramdump_mpu_cp15(char *addr);

+extern char *ramdump_mmu_cp15(char *addr);

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static CHAR *ramdump_CreateCpsrCmmFile(CHAR *address);

+static CHAR *ramdump_CreateRegsitersCmmFile(CHAR *address);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+struct cpu_core Osa_CoreRegisters   = {0}; 

+static struct cpu_regdump *g_zRadmumpRegInfo        = NULL;

+static UINT8 g_zRamdump_ArmMode[ZOSS_ARM_MODE_NUM]  =   /* Êý×é˳ÐòÓëstruc coreÖеÄ˳ÐòÒ»Ö£¬²»Äܸü¸Ä */

+{

+    0xdf,   /* SYS */

+    0xd3,   /* SVC */

+    0xd7,   /* ABT */

+    0xdb,   /* UND */

+    0xd2,   /* IRQ */

+    0xd1,   /* FIQ */

+}; 

+static CHAR *g_zRamdumpBankReg[ZOSS_BANK_REG_NUM]   = {(CHAR *)"r13", (CHAR *)"r14", (CHAR *)"spsr"};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_CreateCpsrCmmFile

+ * ¹¦ÄÜÃèÊö£º´´½¨cpsr½Å±¾£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *                cmmAddress : ½Å±¾µÄµØÖ·Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º ·µ»Ø½Å±¾µØÖ·£»

+**************************************************************************/

+static CHAR *ramdump_CreateCpsrCmmFile(CHAR *cmmAddress)

+{

+    UINT32  value       = 0;

+    

+    /* Êä³öcpsr */

+    if(g_zRadmumpRegInfo != NULL)

+    {

+        switch(g_zRadmumpRegInfo->vector)

+        {

+        case ZOSS_EXCEPT_UNDEF_INSTRUTION:  /* undefined instruction */

+            {

+                value = Osa_CoreRegisters.undefined.psr;

+                break;

+            }

+        case ZOSS_EXCEPT_PREFETCH_ABORT:    /* prefetch abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+        case ZOSS_EXCEPT_DATA_ABORT:        /* data abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+        case ZOSS_EXCEPT_IRQ:               /* IRQ */

+            {

+                value = Osa_CoreRegisters.irq.psr;

+                break;

+            }

+        case ZOSS_EXCEPT_FIQ:               /* FIQ */

+            {

+                value = Osa_CoreRegisters.fiq.psr;

+                break;

+            }

+        default:

+            {

+                break;

+            }

+        }

+    }

+    else

+    {

+        value =zOss_ReadCpsr();

+    }

+    

+    return cmmAddress += (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", value);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_CreateRegsitersCmmFile

+ * ¹¦ÄÜÃèÊö£º´´½¨cpsr½Å±¾£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *                  cmmAddress: ½Å±¾µÄµØÖ·Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º·µ»Ø½Å±¾µØÖ·£»   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static CHAR *ramdump_CreateRegsitersCmmFile(CHAR *cmmAddress)

+{

+    UINT32  value       = 0;

+    UINT32  *paddress   = NULL; 

+    UINT32  i           = 0;

+    UINT32  j           = 0;

+

+    zOss_ASSERT(cmmAddress != NULL);

+    if(g_zRadmumpRegInfo != NULL)

+    {

+        value = g_zRadmumpRegInfo->pc;

+    }

+    else

+    {

+        value = Osa_CoreRegisters.supervisor.lr;

+    }

+    cmmAddress += sprintf(cmmAddress, "r.s pc %#lx\r\n", value);

+    

+    /* Çл»µ½svcģʽ£¬»¹Ô­r0-r12 */

+    cmmAddress += sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)g_zRamdump_ArmMode[0]);

+

+    for(i = 0; i < ZOSS_NORMAL_REG_NUM-2; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "r.s r%d %#lx\r\n",(int)i, Osa_CoreRegisters.r[i]);

+    }

+    paddress = (UINT32 *)(&Osa_CoreRegisters.user.sp);

+    /* Êä³ö³ýfiqÖ®ÍâµÄÆäËûģʽ±¸·Ý¼Ä´æÆ÷ */

+    for(i = 0; i < ZOSS_ARM_MODE_NUM-1; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)g_zRamdump_ArmMode[i]);

+        for(j = 0; j < ZOSS_BANK_REG_NUM; j++)

+        {

+            cmmAddress += sprintf(cmmAddress, "r.s %s %#lx\r\n", g_zRamdumpBankReg[j], *paddress);

+            paddress++; 

+        }

+    }  

+    /* Êä³öFIQ r8-r14 */

+    cmmAddress += sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)g_zRamdump_ArmMode[5]);

+    for(i = 8; i < ZOSS_NORMAL_REG_NUM; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "r.s r%d %#lx\r\n", (int)i, *paddress);

+        paddress++;

+    }

+    /* Êä³öFIQ spsr */

+    cmmAddress += sprintf(cmmAddress, "r.s spsr %#lx\r\n", *paddress);

+    /* ´´½¨cpsr½Å±¾ */

+    return  ramdump_CreateCpsrCmmFile(cmmAddress);

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpCreateCmmFile

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄT32½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                  pCmmFileInfo: ½Å±¾ÎļþÐÅÏ¢Ö¸Õ룻

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+VOID zOss_RamdumpCreateCmmFile(T_zOss_RamdumpCmmFileInfo  *pCmmFileInfo)

+{

+    CHAR    *cmmAddress = NULL;

+   

+    cmmAddress  =  pCmmFileInfo->cmmFileBuffer; 

+    cmmAddress  += sprintf(cmmAddress, "ENTRY &%s\r\n", ZOSS_RAMDUMP_DIR_NAME);

+    /*´´½¨¼Ä´æÆ÷½Å±¾ */

+    cmmAddress  =  ramdump_CreateRegsitersCmmFile(cmmAddress);

+    /* ½ûÖ¹MMU»òMPU */   

+    cmmAddress  += sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", (zOss_Cp15ReadControlRegister() & 0xfffffffe));  

+    /* ´´½¨region ½Å±¾ */

+    cmmAddress  =  zOss_RamdumpCreateRegionsCmmFile(cmmAddress);

+    /* Êä³öcp15 c1 ¿ØÖƼĴæÆ÷ */

+    cmmAddress  += sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", zOss_Cp15ReadControlRegister());

+

+#ifdef _OS_TOS

+# ifdef CYGOPT_HAL_ARM_MMU

+    /* Êä³ömmuÏà¹ØµÄ¼Ä´æÆ÷ */

+    cmmAddress = zTos_MmuDisplayCp15(cmmAddress);

+# endif

+

+# ifdef CYGOPT_HAL_ARM_MPU

+    /* Êä³ömpuÏà¹ØµÄ¼Ä´æÆ÷ */

+    cmmAddress = zTos_MpuDisplayCp15(cmmAddress);

+# endif

+#elif defined (_OS_LINUX)

+# ifdef CONFIG_MMU

+    /* Êä³ömmuÏà¹ØµÄ¼Ä´æÆ÷ */

+    cmmAddress = ramdump_mmu_cp15(cmmAddress);

+# else

+    /* Êä³ömpuÏà¹ØµÄ¼Ä´æÆ÷ */

+    cmmAddress = ramdump_mpu_cp15(cmmAddress);

+# endif

+#endif

+    

+    /* Êä³ö½áÊø·û */

+    cmmAddress  += sprintf(cmmAddress, "ENDDO\r\n");

+    

+    pCmmFileInfo->cmmFileSize = (UINT32)(cmmAddress - pCmmFileInfo->cmmFileBuffer);

+    zOss_AssertExN(pCmmFileInfo->cmmFileSize <= pCmmFileInfo->cmmFileMaxSize);

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_client.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_client.c
new file mode 100644
index 0000000..c8cd6ea
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_client.c
@@ -0,0 +1,443 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_ramdump_arm_client.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/07/18

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_ramdump.h"

+#include "drvs_icp.h"

+#include "ram_config.h"

+

+#ifdef _OS_TOS

+#include <cyg/hal/tos_arm_mmu.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/*************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_zOss_RamdumpOpt           g_zRamdump_Optfunc      = {NULL,NULL};

+T_zOss_RamdumpClientInfo    *g_zRamdump_ClientInfo  = NULL;

+T_zOss_RamdumpClientMsgInfo g_zRamdump_IcpMsgInfo   = {0};

+

+#define ZRAMDUMP_CLIENT_FILE "sup_ramdump_client.con"

+#define ZRAMDUMP_CLIENT_ICP_TABLE(srcModId,desModId,chID)

+#define ZRAMDUMP_CLIENT_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize) 

+#define ZRAMDUMP_SERVER_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize,serverFlagBase)

+#undef  ZRAMDUMP_CLIENT_ICP_TABLE

+#define ZRAMDUMP_CLIENT_ICP_TABLE(identifier,actorID,chID)                      \

+                             (UINT32)(identifier),(T_HalIcp_MsgActor)(actorID), \

+                             (T_ZDrvRpMsg_ChID)(chID)

+static T_zOss_RamdumpIcpInfo s_zRamdump_IcpClientInfo = 

+{

+    #include ZRAMDUMP_CLIENT_FILE

+};

+

+#undef  ZRAMDUMP_CLIENT_ICP_TABLE

+#define ZRAMDUMP_CLIENT_ICP_TABLE(identifier,actorID,chID)

+#undef  ZRAMDUMP_CLIENT_MEM_TABLE

+#define ZRAMDUMP_CLIENT_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)     \

+                              (UINT32)(identifier),(CHAR *)(pRamdumpStartAddr), \

+                              (UINT32)(ramdumpSize)                           

+static T_zOss_RamdumpClientConInfo s_zRamdump_ClientCfgInfo = 

+{

+    #include ZRAMDUMP_CLIENT_FILE

+};

+#undef  ZRAMDUMP_CLIENT_MEM_TABLE

+#define ZRAMDUMP_CLIENT_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)

+static BOOL s_zRamdump_InitFlag = FALSE;

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_RAMDUMP_CLIENT_ICP_SIZE        0x40

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID ramdump_ClientSendMsg(T_zOss_RamdumpIcpInfo *IcpInfo, T_zOss_RamdumpClientMsgInfo *pMsgInfo);

+static VOID ramdump_ClientProcessMsg(VOID *pMsg, UINT32 len);

+static VOID ramdump_Main(VOID);

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ClientSendMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶÏûÏ¢·¢ËͽӿÚ

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pIcpInfo: ramdump ICPÐÅÏ¢

+ *              pMsgInfo: ICPÏûÏ¢

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ClientSendMsg(T_zOss_RamdumpIcpInfo *pIcpInfo, T_zOss_RamdumpClientMsgInfo *pMsgInfo)

+{

+    T_ZDrvRpMsg_Msg icpMsg  = { 0 };

+

+    icpMsg.actorID = pIcpInfo->actorID;

+    icpMsg.chID    = pIcpInfo->chID;

+    icpMsg.flag    = 1;

+    icpMsg.buf     = pMsgInfo;

+    icpMsg.len     = sizeof(T_zOss_RamdumpClientMsgInfo);

+    zDrvRpMsg_WriteLockIrq(&icpMsg);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_GetConfigRegion

+ * ¹¦ÄÜÃèÊö£º»ñÈ¡ramdÒªµ¼³öµÄÇøÓò£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+#ifdef CYGOPT_HAL_ARM_MMU

+static VOID ramdump_GetConfigRegion(VOID)

+{    

+    T_zOss_RamdumpRegion regionInfo = {0};

+    UINT32               cnt        = 0;

+    T_zTos_MmuConfigItem *pItem     = NULL;

+    

+    for (cnt = 0; cnt < g_zTos_MmuConfigTable.count; cnt++)

+    {   

+        pItem = &g_zTos_MmuConfigTable.item[cnt];

+        if (pItem->attr & ZTOS_MMU_REGION_DUMP)

+        {

+            regionInfo.baseForServer = pItem->server_base;

+            regionInfo.baseForSelf   = pItem->physical_base;

+            regionInfo.size          = pItem->size;

+            regionInfo.baseForCopy   = (pItem->attr & ZTOS_MMU_REGION_COPY) ? pItem->server_base : 0;

+            zOss_RamdumpConfigureMem(&regionInfo);

+        }

+    }

+}

+#endif

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SetPartition

+ * ¹¦ÄÜÃèÊö£ºramdump¿Õ¼ä»®·Ö£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SetPartition(VOID)

+{    

+    UINT32 size;

+    UINT32 sizeUnit = s_zRamdump_ClientCfgInfo.ramdumpSize/ZOSS_RAMDUMP_CLIENT_TOTAL_RATE;;

+   

+    /* ramdumpµØÖ·»®·Ö */

+    memset(s_zRamdump_ClientCfgInfo.pRamdumpStartAddr, 0, s_zRamdump_ClientCfgInfo.ramdumpSize);

+    g_zRamdump_ClientInfo  = (T_zOss_RamdumpClientInfo *)(((UINT32)s_zRamdump_ClientCfgInfo.pRamdumpStartAddr + sizeof(UINT32) - 1) & ~(sizeof(UINT32) - 1));

+    g_zRamdump_ClientInfo->clientFlagBase = (UINT32)g_zRamdump_ClientInfo+((sizeof(T_zOss_RamdumpClientInfo) + sizeof(UINT32) - 1)& ~(sizeof(UINT32) - 1));

+    g_zRamdump_ClientInfo->pCmmInfo = (T_zOss_RamdumpCmmFileInfo *)((char *)g_zRamdump_ClientInfo->clientFlagBase+4);

+    g_zRamdump_ClientInfo->pCmmInfo->cmmFileSize = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_CMM_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ClientInfo->pCmmInfo->cmmFileMaxSize = (size - sizeof(T_zOss_RamdumpCmmFileInfo));

+     

+    g_zRamdump_ClientInfo->pConfigureInfo= (T_zOss_RamdumpRegionInfo *)((CHAR*)g_zRamdump_ClientInfo->pCmmInfo + size);

+    g_zRamdump_ClientInfo->pConfigureInfo->regionNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_CONFIGURED_REGION_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ClientInfo->pConfigureInfo->regionMaxNum = (size - sizeof(T_zOss_RamdumpRegionInfo)) / sizeof(T_zOss_RamdumpRegion);

+    

+    g_zRamdump_ClientInfo->pParsedInfo = (T_zOss_RamdumpRegionInfo *)((CHAR*)g_zRamdump_ClientInfo->pConfigureInfo + size);

+    g_zRamdump_ClientInfo->pParsedInfo->regionNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_PARSED_REGION_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ClientInfo->pParsedInfo->regionMaxNum = (size - sizeof(T_zOss_RamdumpRegionInfo)) / sizeof(T_zOss_RamdumpRegion);

+    

+    g_zRamdump_ClientInfo->pErrInfo = (T_zOss_RamdumpBuffInfo *)((CHAR *)g_zRamdump_ClientInfo->pParsedInfo + size);

+    size = (sizeUnit * ZOSS_RAMDUMP_ERR_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);  

+    g_zRamdump_ClientInfo->pErrInfo->pBuff = (CHAR *)g_zRamdump_ClientInfo->pErrInfo + sizeof(T_zOss_RamdumpBuffInfo);

+    g_zRamdump_ClientInfo->pErrInfo->buffLen = size - sizeof(T_zOss_RamdumpBuffInfo);  

+    g_zRamdump_ClientInfo->clientId    = s_zRamdump_ClientCfgInfo.clientId;

+    sprintf((char *)g_zRamdump_ClientInfo->pErrInfo->pBuff, "%d_c_core: exact error!\n",(int)s_zRamdump_ClientCfgInfo.clientId); 

+

+    zOss_AssertExN(((CHAR *)g_zRamdump_ClientInfo->pErrInfo->pBuff+ size) <= 

+                   (s_zRamdump_ClientCfgInfo.pRamdumpStartAddr + s_zRamdump_ClientCfgInfo.ramdumpSize));

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ClientProcessMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶserverÏûÏ¢´¦Àí½Ó¿Ú

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pBuff:ÏûÏ¢µÄbuff

+ *              len  :ÏûÏ¢µÄ³¤¶È

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ClientProcessMsg(VOID *pBuff, UINT32 len)

+{

+    T_zOss_RamdumpServerMsgInfo *ramdumpMsg = (T_zOss_RamdumpServerMsgInfo *)pBuff;

+

+    switch(ramdumpMsg->msgType)

+    { 

+    case ZOSS_RAMDUMP_EXCPT_TYPE:

+        {

+            sprintf((char *)g_zRamdump_ClientInfo->pErrInfo->pBuff, "%d_c_core: force error!\n",(int)g_zRamdump_ClientInfo->clientId); 

+            zOss_RamdumpHandle(1, 1, 1);

+            break;

+        }

+    case ZOSS_RAMDUMP_TEST_EXCPT_TYPE:

+        {

+            sprintf((char *)g_zRamdump_ClientInfo->pErrInfo->pBuff, "%d_c_core: exact error!\n",(int)g_zRamdump_ClientInfo->clientId); 

+            zOss_RamdumpHandle(1, 1, 1);

+            break;

+        }

+    default:

+        {

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ClientIcpInit

+ * ¹¦ÄÜÃèÊö£ºclient ICP ³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ClientIcpInit(VOID)

+{

+    zDrvRpMsg_CreateChannel(s_zRamdump_IcpClientInfo.actorID, s_zRamdump_IcpClientInfo.chID, ZOSS_RAMDUMP_CLIENT_ICP_SIZE);

+    zDrvRpMsg_RegCallBack(s_zRamdump_IcpClientInfo.actorID, s_zRamdump_IcpClientInfo.chID, ramdump_ClientProcessMsg);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_NotifyServerExceptionOccur

+ * ¹¦ÄÜÃèÊö£ºÍ¨Öªserver·¢ÉúÁËÒì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_NotifyServerExceptionOccur(VOID)

+{

+    T_zOss_RamdumpClientMsgInfo msgInfo = {0};

+

+    msgInfo.Identifier        = s_zRamdump_ClientCfgInfo.clientId;

+    msgInfo.msgType           = ZOSS_RAMDUMP_EXCPT_TYPE;

+    msgInfo.pRamdumpStartAddr = s_zRamdump_ClientCfgInfo.pRamdumpStartAddr;

+    msgInfo.radmumpSize       = s_zRamdump_ClientCfgInfo.ramdumpSize;

+    ramdump_ClientSendMsg(&s_zRamdump_IcpClientInfo, &msgInfo);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessException

+ * ¹¦ÄÜÃèÊö£º´¦ÀíÒì³£ÐÅÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessException(VOID)

+{

+    *(UINT32 *)g_zRamdump_ClientInfo->clientFlagBase = ZOSS_RAMDUMP_FLAG_SECOND_VALUE;

+    zOss_CleanCache();

+    while (*(UINT32 *)g_zRamdump_ClientInfo->clientFlagBase != ZOSS_RAMDUMP_FLAG_THIRD_VALUE);

+    zOss_RamdumpCreateCmmFile(g_zRamdump_ClientInfo->pCmmInfo);

+    *(UINT32 *)g_zRamdump_ClientInfo->clientFlagBase = ZOSS_RAMDUMP_FLAG_FOUR_VALUE;

+    zOss_CleanCache();

+}

+

+/*****************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_Main

+ * ¹¦ÄÜÃèÊö£º Ö´ÐÐramdump

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID ramdump_Main(VOID)

+{

+    ramdump_NotifyServerExceptionOccur();

+    ramdump_ProcessException();

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpHandle

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º ²ÎÊýÔÚTOS²Ù×÷ϵͳÉÏûÓÐʵ¼ÊÒâÒ壻

+ **************************************************************************/

+VOID zOss_RamdumpHandle(UINT16 user_called, UINT16 ecode, UINT16 extra)

+{

+    static UINT32   excepNum = 0;

+    ZOSS_INTR       old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    if (++excepNum > 1 || !s_zRamdump_InitFlag)   /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */

+    {

+        for( ; ; ) ;

+    }

+    zOss_RamdumpEncodeError(g_zRamdump_ClientInfo->pErrInfo->pBuff, user_called, ecode, extra);

+    ramdump_Main();

+    for( ; ; ) ;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_RegionsCmmFile

+ * ¹¦ÄÜÃèÊö£ºT32cmm½Å±¾ÄÚ´æ¶ÎдÈë

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              address: cmm½Å±¾µÄµØÖ·£»             

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+CHAR *zOss_RamdumpCreateRegionsCmmFile(CHAR *address)

+{

+    CHAR    fileName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    UINT32  i                                   = 0;

+  

+    sprintf(fileName, "%d_c_mem.bin", (int)g_zRamdump_ClientInfo->clientId);

+    for (i = 0; i < g_zRamdump_ClientInfo->pParsedInfo->regionNum; i++)

+    {   

+        T_zOss_RamdumpRegion *pRegion = &(g_zRamdump_ClientInfo->pParsedInfo->regions[i]);

+        if (pRegion->baseForSelf != pRegion->baseForServer)

+        {

+            UINT32 parsedEnd  = pRegion->baseForSelf + pRegion->size - 1;

+            address += sprintf(address, "data.load.binary &%s\\%d_%s %#lx--%#lx /noclear\r\n", ZOSS_RAMDUMP_DIR_NAME, 

+                               (int)i, fileName, pRegion->baseForSelf, parsedEnd);

+            if (pRegion->baseForCopy != 0)

+            {

+                memcpy((void*)pRegion->baseForCopy, (void*)pRegion->baseForSelf,(parsedEnd - pRegion->baseForSelf + 1));

+            }

+        }

+        else

+        {      

+            address += (UINT32)sprintf(address, "data.load.binary &%s\\%d_%s %#lx--%#lx /noclear\r\n", ZOSS_RAMDUMP_DIR_NAME,

+                                       (int)i, fileName, pRegion->baseForSelf, pRegion->baseForSelf + pRegion->size - 1);

+        }

+    }

+    

+    return address;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpConfigureMem

+ * ¹¦ÄÜÃèÊö£º ±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              regionInfo: ÅäÖÃÇøÓòÖ¸Õ룻

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpConfigureMem(T_zOss_RamdumpRegion *regionInfo)

+{

+    T_zOss_RamdumpRegionInfo *pCfgInfo = g_zRamdump_ClientInfo->pConfigureInfo;

+    

+    if (regionInfo->size == 0)

+        return;

+    zOss_AssertExN(pCfgInfo->regionNum < pCfgInfo->regionMaxNum);

+    zOss_AssertExN((regionInfo->size - 1) <= (0xFFFFFFFF - regionInfo->baseForServer));

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForServer = regionInfo->baseForServer;

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForSelf   = regionInfo->baseForSelf;

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForCopy   = regionInfo->baseForCopy;

+    pCfgInfo->regions[pCfgInfo->regionNum].size          = regionInfo->size;

+    (pCfgInfo->regionNum)++;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpSetOperation

+ * ¹¦ÄÜÃèÊö£º ramdumpÓû§×¢²á½Ó¿Ú£»

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *              funcObjPtr: »Øµ÷º¯Êý£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpSetOperation(T_zOss_RamdumpOpt *funcObjPtr)

+{

+    zOss_AssertExN(funcObjPtr != NULL);

+    

+    if (funcObjPtr->ramdump_Process_PreHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_PreHook = funcObjPtr->ramdump_Process_PreHook;

+    }

+    

+    if (funcObjPtr->ramdump_Process_AftHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_AftHook = funcObjPtr->ramdump_Process_AftHook;

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ: zOss_RamdumpInit

+ * ¹¦ÄÜÃèÊö£ºRamdump³õʼ»¯£» 

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ***************************************************************************/     

+VOID zOss_RamdumpInit(VOID)

+{    

+    ramdump_SetPartition();

+#ifdef CYGOPT_HAL_ARM_MMU

+    ramdump_GetConfigRegion();   

+#endif

+    ramdump_ClientIcpInit();

+    *(UINT32 *)g_zRamdump_ClientInfo->clientFlagBase = ZOSS_RAMDUMP_FLAG_FIRST_VALUE;

+    g_zRamdump_IcpMsgInfo.Identifier        = s_zRamdump_ClientCfgInfo.clientId;

+    g_zRamdump_IcpMsgInfo.msgType           = ZOSS_RAMDUMP_INIT_TYPE;

+    g_zRamdump_IcpMsgInfo.pRamdumpStartAddr = s_zRamdump_ClientCfgInfo.pRamdumpStartAddr;

+    g_zRamdump_IcpMsgInfo.radmumpSize       = s_zRamdump_ClientCfgInfo.ramdumpSize;

+

+    ramdump_ClientSendMsg(&s_zRamdump_IcpClientInfo, &g_zRamdump_IcpMsgInfo);

+    zOss_CleanCache();

+    s_zRamdump_InitFlag = TRUE;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºOsa_SysErrHndInit

+ * ¹¦ÄÜÃèÊö£ºµØÖ·È«¾Ö±äÁ¿³õʼ»¯,»ñÈ¡ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ

+                                  arm0ºÍarm1ͬ²½»úÖÆ

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º´ò×®£¬ÎªÁ˼æÈÝose¡¢cskyµÈramdump¹¦ÄÜ£»

+ ***************************************************************************/

+VOID Osa_SysErrHndInit(VOID)

+{

+

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_client_lib.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_client_lib.c
new file mode 100644
index 0000000..f50dd73
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_client_lib.c
@@ -0,0 +1,412 @@
+/*******************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+********************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_m0_adapt.c

+* Ïà¹ØÎļþ : sup_ramdump_m0_adapt.c

+* ʵÏÖ¹¦ÄÜ : ʵÏÖm0°æ±¾È±ÉÙµÄc¿âº¯Êý£»

+* ×÷    Õß : ¸ß»ª·å

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/10/17 

+* ÆäËü˵Ã÷ : 

+*******************************************************************************/

+

+/*******************************************************************************

+* Ð޸ļǼ

+*******************************************************************************/

+

+/*******************************************************************************

+* #includeÇø

+*******************************************************************************/

+#include <stdarg.h>

+#include "oss_api.h"

+#include "sup_ramdump.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/*******************************************************************************

+* ºê¶¨ÒåÇø

+*******************************************************************************/

+#define ZOSS_VSNFORMAT_BUFF_SIZE        100

+#define ZOSS_VSNFORMAT_TOCHAR(n)        ((n) + '0')

+#define ZOSS_VSNFORMAT__DECIMAL         10

+#define ZOSS_VSNFORMAT_HEX              16

+#define ZOSS_VSNFORMAT_HEXPREFIX_LEN    2

+#define ZOSS_VSNFORMAT_LONG             0X0

+#define ZOSS_VSNFORMAT_PREFIX           0X1

+#define ZOSS_VSNFORMAT_HEXPREFIX        0X4

+#define ZOSS_INT_MAX                    0xFF

+

+/*******************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+*******************************************************************************/

+/* ¸ñʽ»¯·µ»ØÖµÀàÐÍ */

+typedef enum

+{

+    FORMAT_TYPE_CONTINUE,

+    FORMAT_TYPE_PUTFMTSTR,

+    FORMAT_TYPE_INTVALUE,

+    FORMAT_TYPE_ERROR,

+    FORMAT_TYPE_MAX    

+}T_zOss_FormatTypeRet;

+

+/*******************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+*******************************************************************************/

+static SINT32 vsnformat(CHAR *pcBuffer, UINT32 dwMaxCount, const CHAR *pcParamFormat, va_list vaList);

+static SINT32 getVareIntValue(UINT32 *pFormatType, SINT32 swBase, va_list *vaList);

+static CHAR   *translateNumberToStr(CHAR *pAcBuf, SINT32 dwVal, SINT32 swBase, SINT32 *sdwSize);

+static CHAR   *getStrLen(va_list *vaList, SINT32 *pSdwSize);

+static T_zOss_FormatTypeRet  getFormatType(SINT32 swCh, UINT32 *pFormatType, SINT32 *pSwBase);

+

+/*******************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+*******************************************************************************/

+static  CHAR BIG_HEX_DIGIT[]    = "0123456789ABCDEF";

+static  CHAR NULLSTRING[]       = "(null)";

+

+/*******************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+*******************************************************************************/

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º getVareIntValue

+ * ¹¦ÄÜÃèÊö£º »ñÈ¡±ä²ÎÖÐÕûÐεÄÊýÖµ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pFormatType: ¸ñʽ»¯ÀàÐÍ£»

+ *            (OUT):

+ *              swBase: ÖÆÊ½£»

+ *              vaList: ¿É±ä²ÎÊý£»

+ * ·µ »Ø Öµ£º ·µ»Ø±ä²ÎÖеÄÕûÐÎÊýÖµ£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+static SINT32 getVareIntValue(UINT32 *pFormatType, SINT32 swBase, va_list *vaList)

+{

+    SINT32 dwVal    = 0;

+    

+    if (*pFormatType & (1 << ZOSS_VSNFORMAT_LONG))

+    {

+        dwVal = va_arg(*vaList, unsigned long);

+    }

+    else

+    {

+        dwVal = va_arg(*vaList, unsigned int);

+    }

+

+    if ((*pFormatType & (1 << ZOSS_VSNFORMAT_PREFIX)) && (ZOSS_VSNFORMAT_HEX == swBase) && (0 != dwVal))

+    {

+        *pFormatType = *pFormatType | (1<< ZOSS_VSNFORMAT_HEXPREFIX);

+    }

+    

+    return dwVal;    

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º translateNumberToStr

+ * ¹¦ÄÜÃèÊö£º ½«Êý×Öת»¯ÎªÊý×Ö×Ö·û´®£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pAcBuf: »º´æµÄÖ¸Õ룻

+ *              dwVal: ÕûÐÎÊýÖµ£»

+ *              swBase: ÖÆÊ½£»

+ *            (OUT):

+ *              sdwSize: ת»¯ºóÊýÖµµÄ´óС£»

+ * ·µ »Ø Öµ£º ·µ»ØÊýÖµ´æ·ÅµÄµØÖ·£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+static CHAR *translateNumberToStr(CHAR *pAcBuf, SINT32 dwVal, SINT32 swBase, SINT32 *sdwSize)

+{

+    CHAR *pch = pAcBuf + ZOSS_VSNFORMAT_BUFF_SIZE;

+    

+    switch (swBase)

+    {

+    case ZOSS_VSNFORMAT__DECIMAL:                      /* 10½øÖÆÊä³ö */

+        {

+            while (dwVal >= ZOSS_VSNFORMAT__DECIMAL)

+            {

+                *--pch = (CHAR)ZOSS_VSNFORMAT_TOCHAR(dwVal % ZOSS_VSNFORMAT__DECIMAL);

+                dwVal /= ZOSS_VSNFORMAT__DECIMAL;

+            }

+            *--pch = (CHAR)ZOSS_VSNFORMAT_TOCHAR(dwVal);

+            break;

+        }

+    case ZOSS_VSNFORMAT_HEX:                            /* 16½øÖÆÊä³ö */

+        {

+            do

+            {

+                *--pch = BIG_HEX_DIGIT[dwVal & 15];

+                dwVal >>= 4;

+            }

+            while (dwVal);

+            break;

+        }       

+    default:

+        break;

+    }

+    *sdwSize = pAcBuf + ZOSS_VSNFORMAT_BUFF_SIZE - pch;

+    return pch;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º getStrLen

+ * ¹¦ÄÜÃèÊö£º »ñÈ¡¿É±ä×Ö·û´®µÄ³¤¶È£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              vaList: ¿É±ä²ÎÊý

+ *              pSdwSize: ¿É±ä²ÎÊýµÄ³¤¶È£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º ·µ»Ø%ÔÚ×Ö·û´®µÄλÖã»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+CHAR *getStrLen(va_list *vaList, SINT32 *pSdwSize)

+{

+    CHAR *pch  = (CHAR *)va_arg(*vaList, CHAR *);

+    

+    if (pch == NULL)

+    {

+        pch = NULLSTRING;

+    }

+    *pSdwSize = (SINT32)strlen((char *)pch);

+    return pch;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º getFormatType

+ * ¹¦ÄÜÃèÊö£º ½«Êý×Öת»¯ÎªÊý×Ö×Ö·û´®£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              swCh: ¸ñʽ»¯×Ö·û£»

+ *            (OUT):

+ *              pFormatType: ¸ñʽ»¯ÀàÐÍ£»

+ *              pSwBase: Êý¾ÝµÄÖÆÊ½

+ * ·µ »Ø Öµ£º ¸ñʽ»¯µÄ·µ»ØÖµÀàÐÍ£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+static T_zOss_FormatTypeRet getFormatType(SINT32 swCh, UINT32 *pFormatType, SINT32 *pSwBase)

+{

+    T_zOss_FormatTypeRet retType = FORMAT_TYPE_MAX;

+    

+    switch (swCh)

+    {

+    case '#':

+        {

+            *pFormatType = *pFormatType | (1 << ZOSS_VSNFORMAT_PREFIX);

+            retType = FORMAT_TYPE_CONTINUE;

+            break;

+        }

+    case 'l': 

+        {

+            *pFormatType = *pFormatType | (1 << ZOSS_VSNFORMAT_LONG);

+            retType = FORMAT_TYPE_CONTINUE;

+            break;

+        }

+    case 's':

+        {

+            retType = FORMAT_TYPE_PUTFMTSTR;

+            break;

+        }

+    case 'X':

+    case 'x':

+        {

+            *pSwBase    = ZOSS_VSNFORMAT_HEX;

+            retType     = FORMAT_TYPE_INTVALUE;

+        }

+        break;

+    case 'd':

+    case 'i':

+        {

+            *pSwBase = ZOSS_VSNFORMAT__DECIMAL;

+            retType = FORMAT_TYPE_INTVALUE;

+            break;

+        }

+    default:

+        {

+            break;

+        }

+    }

+    return retType;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º vsnformat

+ * ¹¦ÄÜÃèÊö£º ¸ñʽ»¯×Ö·û´®²¢Êä³öÖÁ»º³åÇø

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                  dwMaxCount£º»º³åÇø´óС£¨°üÀ¨NULL½áÊø·û£©

+ *                  format    £ºÒªÊ¹Óõĸñʽ´®

+ *                  vaList    £º¿É±ä²ÎÊýÁбí

+ *            (OUT):

+ *                   pcBuffer  £ºÊä³ö»º³åÇø

+ * ·µ »Ø Öµ£º -1  £ºÊµ¼ÊÒªÊä³öµÄ×Ö½ÚÊý³¬³ö»º³åÇø´óС,ÆäËü£ºÊµ¼ÊÊä³öµÄ×Ö½ÚÊý¡£

+ * ÆäËü˵Ã÷£º ΪÁËM0°æ±¾Öƶ¨µÄ¹¦ÄÜ£¬²»Ö§³ÖºÜ¶àvsnformat¹¦ÄÜ£»

+ ******************************************************************************/

+static SINT32 vsnformat(CHAR *pcBuffer, UINT32 dwMaxCount, const CHAR *pcParamFormat, va_list vaList)

+{

+    SINT16      swCh;                                           /* È¡×ÔpcParamFormatµÄ×Ö·û */

+    CHAR        *pch;                                           /* ´¦Àí×Ö·ûµÄÖ¸Õë */

+    SINT32      dwVal;                                          /* ÕûÊý²ÎÊý %[diouxX] */

+    SINT32      sdwSize;                                        /* ÒªÊä³ö²ÎÊýµÄ³¤¶È */

+    SINT32      sdwRealSize;                                    /* ²ÎÊýµÄʵ¼ÊÊä³ö³¤¶È */

+    CHAR        acBuf[ZOSS_VSNFORMAT_BUFF_SIZE];                /* ´æ·ÅÕûÊý²ÎÊýµÄ»º´æ */

+    SINT32      sdwRet              = 0;                        /* Êä³ö¼ÆÊý */

+    SINT32      swBase              = ZOSS_VSNFORMAT__DECIMAL;  /* ÕûÐβÎÊýµÄÊä³öµÄ½øÖÆ */

+    SINT32      dwCount             = 0;                        /* ͳ¼ÆÊä³ö»º³åÇøµ±Ç°µÄ×Ö½ÚÊý */

+    CHAR        *pcOut              = pcBuffer;                 /* Êä³ö»º³åÇøÖ¸Õë */

+    UINT32      formatType          = 0;

+    T_zOss_FormatTypeRet retFmtType = FORMAT_TYPE_MAX;

+

+    zOss_ASSERT((NULL != pcBuffer) || (NULL != pcParamFormat));

+    for (;;)                                        /* ɨÃè¸ñʽ´®ÖеÄ%×Ö·û */

+    {

+        for (pch = (CHAR *)pcParamFormat; ((swCh = *pcParamFormat) != '\0') && (swCh != '%');

+                  pcParamFormat++) ;                /* ËÑË÷%×Ö·û */     

+

+        /* Êä³ö%ǰµÄÆäËü×Ö·û */ 

+        dwCount += pcParamFormat - pch;

+        memcpy(pcOut, pch, (UINT32)(pcParamFormat - pch));

+        pcOut +=  pcParamFormat - pch;

+        sdwRet +=  pcParamFormat - pch;

+        if ('\0' == swCh)

+        {

+            *pcOut = '\0';                          /* ²¹ÉÏNULL½áÊø·û */

+            return sdwRet;

+        }

+        pcParamFormat++;                            /* Ìø¹ý '%' */

+        /* Ñ­»·´¦Àíµ±Ç°%µÄÊä³ö¸ñʽ */   

+        for (;;)

+        {

+            swCh = *pcParamFormat++;

+            retFmtType = getFormatType(swCh,&formatType,&swBase);

+            if ((retFmtType == FORMAT_TYPE_INTVALUE) || (retFmtType == FORMAT_TYPE_PUTFMTSTR))

+            {

+                break;

+            }

+        }

+        if ((retFmtType == FORMAT_TYPE_INTVALUE))   /* »ñÈ¡±ä²ÎÖеÄÕûÐͲÎÊý */    

+        {

+            dwVal   = getVareIntValue(&formatType, swBase, &vaList);

+            pch     = translateNumberToStr(acBuf, dwVal, swBase, &sdwSize);

+        }

+        if (retFmtType == FORMAT_TYPE_PUTFMTSTR)

+            pch = getStrLen(&vaList, &sdwSize);

+        sdwRealSize = sdwSize;

+        if ( formatType & (1 << ZOSS_VSNFORMAT_HEXPREFIX))

+        {

+            sdwRealSize += ZOSS_VSNFORMAT_HEXPREFIX_LEN;

+            dwCount     += ZOSS_VSNFORMAT_HEXPREFIX_LEN;

+            *pcOut++    = '0';

+            *pcOut++    = (CHAR)swCh;

+        }

+        /* Êä³öʵ¼ÊµÄ¸ñʽ´®¾»ºÉ */

+        dwCount += (UINT32)sdwSize;

+        zOss_ASSERT(dwCount < dwMaxCount);

+        memcpy(pcOut, pch, (UINT32)sdwSize);

+        pcOut += sdwSize;

+        sdwRet += sdwRealSize;

+    }

+}

+

+/*******************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+*******************************************************************************/

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º sprintf

+ * ¹¦ÄÜÃèÊö£º ʵÏÖc¿âsprintf¹¦ÄÜ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              s:      »º´æÖ¸Õ룻

+ *              format: ¸ñʽ»¯×Ö·û´®£»

+ *              ...   : ´ý¸ñʽ»¯Êý¾Ý£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º Ϊm0°æ±¾¶¨ÖÆ£»

+ ******************************************************************************/

+int sprintf(char *s, const char *format, ...)

+{

+    int rc;      

+    va_list ap;  

+

+    va_start(ap, format); 

+    rc = vsnformat(s, ZOSS_INT_MAX, format, ap);

+    va_end(ap); 

+

+    return rc;

+} 

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º memcpy

+ * ¹¦ÄÜÃèÊö£º ʵÏÖc¿âmemcpy¹¦ÄÜ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pDst: Ä¿±êµØÖ·£»

+ *              pSrc: Ô´µØÖ·£»

+ *              n   : ³¤¶È£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º ·µ»ØÄ¿±êµØÖ·pDst£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+void *memcpy(void *pDst, const void *pSrc, size_t n)

+{

+    char *pTmpDst = (char *)pDst;

+    const char *pTmpSrc = (const char *)pSrc;

+    

+    while (n--)

+    {

+        *pTmpDst++ = *pTmpSrc++;

+    } 

+    return pDst;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º memchr

+ * ¹¦ÄÜÃèÊö£º ʵÏÖc¿âmemcpy¹¦ÄÜ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pStr: Ä¿±ê×Ö·û´®Ö¸Õ룻

+ *              c   : ×Ö·û£»

+ *              n   : ³¤¶È£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º ²éÕÒµÄ×Ö·ûµÄµØÖ·£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+void *memchr(const void *pStr, int c, size_t n)

+{

+    const unsigned char *pTmpStr = (const unsigned char *)pStr;   

+    

+    c &= 0xff;

+    while (n--)

+    {

+        if (*pTmpStr == c)

+        {

+            return (void *)pTmpStr;

+        }

+        pTmpStr++;

+    }

+    return NULL;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º memset

+ * ¹¦ÄÜÃèÊö£º ʵÏÖc¿âmemset¹¦ÄÜ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pStr: bufferµÄÖ¸Õ룻

+ *              c   : ·ûºÅ£»

+ *              n   : ×Ö·û´®µÄ³¤¶È£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º ·µ»ØpStrÖ¸Õ룻

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+void *memset(void *pStr, int c, size_t n)

+{

+    char *pTmpStr = (char *)pStr;

+    

+    while (n-- != 0)

+    {

+        *pTmpStr++ = (char)c;

+    }

+    return pStr;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_comm.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_comm.c
new file mode 100644
index 0000000..9550f46
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_comm.c
@@ -0,0 +1,313 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_comm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ramdumpµÄIO½Ó¿ÚʵÏÖ·â×°£»

+* ×÷    Õß :

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2014/03/25

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifdef _USE_CP_USB

+#include "oss_api.h"

+#include "drvs_usbPoll.h"

+#else

+#include "oss_api.h"

+#include "drvs_icp.h"

+#include "drv_api.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+#ifndef _USE_CP_USB

+extern SINT32 zDrvRpMsg_CreateLockSaveChannel (T_ZDrvRpMsg_MsgActor actorID, T_ZDrvRpMsg_ChID chID, UINT32 size);

+extern SINT32 zDrvRpMsg_ReadLockIrq(const T_ZDrvRpMsg_Msg *pMsg);

+#endif

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_RAMDUMP_USB_POLL_CNT        100

+#define ZOSS_RAMDUMP_ICP_CHANNEL_SIZE   0x2800

+#define ZOSS_RAMDUMP_ICP_DATA_SIZE(len) (min((len),(ZOSS_RAMDUMP_ICP_CHANNEL_SIZE/2)))

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+#ifdef _USE_CP_USB

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpUsbInit

+ * ¹¦ÄÜÃèÊö£ºramdump USB ³õʼ»¯.

+ * ²ÎÊý˵Ã÷£º

+ *           (IN)

+ *              ÎÞ

+ *           (OUT)

+ *              ÎÞ

+ *·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+VOID zOss_RamdumpUsbInit(VOID)

+{

+    zDrvUsbPoll_Init();                 /* ³õʼ»¯USB        */

+    while (!zDrvUsbPoll_isConnect()) ;  /* ²éѯUSBÊÇ·ñÁ¬½Ó  */

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpUsbReadData

+ * ¹¦ÄÜÃèÊö£º¶ÁÖ¸¶¨Í¨µÀµÄÊý¾Ý.

+ * ²ÎÊý˵Ã÷£º

+ *           (IN)

+ *              buffer: ¶ÁÊý¾ÝµÄbufferÖ¸Õ룻

+ *              size  : ¶ÁÊý¾ÝµÄ´óС£»

+ *           (OUT)

+ *              ÎÞ

+ *·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+VOID zOss_RamdumpUsbReadData(UINT8 *buffer, UINT32 size)

+{

+    UINT32 count = 0;

+

+    do

+    {

+        zDrvUsbPoll_Isr();

+        count = (UINT32)zDrvUsbPoll_Read(buffer, size);

+        if( size <= count)

+        {

+            break;

+        }        

+        buffer += count;

+        size -=count;

+    }

+    while (size > 0);

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIoWriteData

+ * ¹¦ÄÜÃèÊö£ºÐ´Êý¾Ýµ½Ö¸¶¨Í¨µÀ.

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              buffer: ¶ÁÊý¾ÝµÄbufferÖ¸Õ룻

+ *              size  : ¶ÁÊý¾ÝµÄ´óС£»

+ *           (OUT):

+ *              ÎÞ£»

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+VOID zOss_RamdumpUsbWriteData(UINT8 *buffer, UINT32 size)

+{

+    UINT32 count = 0;

+

+    while (size > 0)

+    {

+        zDrvUsbPoll_Isr();

+        count = (UINT32)zDrvUsbPoll_Write(buffer, size);

+        if( size <= count)

+        {

+            break;

+        }

+        

+        buffer += count;

+        size -=count;

+    }

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIoFinish

+ * ¹¦ÄÜÃèÊö£ºRamdumpÎļþ´«Êä½áÊø£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+VOID zOss_RamdumpUsbFinish(VOID)

+{

+    UINT32  i;

+    

+    for (i = 0; i < ZOSS_RAMDUMP_USB_POLL_CNT; i++)  /* µÈ´ýÊý¾Ý·¢ËÍÍêºó£¬ÔÙÖØÆô */

+    {

+        zDrvUsbPoll_Isr();

+    }

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpSetUsbOpt

+ * ¹¦ÄÜÃèÊö£ºÉèÖÃUsbͨµÀ;

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+VOID zOss_RamdumpSetUsbOpt(VOID)

+{

+    T_zOss_RamdumpIoOpt hook = {zOss_RamdumpUsbInit, zOss_RamdumpUsbReadData, zOss_RamdumpUsbWriteData, zOss_RamdumpUsbFinish};

+

+    zOss_RamdumpSetIoOpt(hook);

+    return;

+}

+#else

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIcpReadData

+ * ¹¦ÄÜÃèÊö£º¶ÁÖ¸¶¨Í¨µÀµÄÊý¾Ý.

+ * ²ÎÊý˵Ã÷£º

+ *           (IN)

+ *              buffer: ¶ÁÊý¾ÝµÄbufferÖ¸Õ룻

+ *              size  : ¶ÁÊý¾ÝµÄ´óС£»

+ *           (OUT)

+ *              ÎÞ

+ *·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+static VOID zOss_RamdumpIcpReadData(UINT8 *buffer, UINT32 size)

+{

+    T_ZDrvRpMsg_Msg icpMsg = {0};

+    UINT8  *pBuf           = buffer;

+    SINT32 retCode         = RPMSG_CHANNEL_NOMSG;

+    

+    icpMsg.actorID = ICP_MSG_ACTOR_A9;

+    icpMsg.chID    = RAMDUMP;

+    icpMsg.buf     = buffer;

+    icpMsg.len     = size;

+    icpMsg.flag    |= RPMSG_READ_POLL;

+    

+    do

+    {

+        retCode = zDrvRpMsg_ReadLockIrq(&icpMsg);

+        if(retCode != RPMSG_CHANNEL_NOMSG)

+        {

+            if( size <= icpMsg.len)

+            {

+                break;

+            }

+            pBuf       =  icpMsg.buf;

+            pBuf       += icpMsg.len;

+            icpMsg.buf =  pBuf;

+            size       -= icpMsg.len;

+            icpMsg.len =  size;

+        }        

+    }while (size > 0);

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIcpWriteData

+ * ¹¦ÄÜÃèÊö£ºÐ´Êý¾Ýµ½Ö¸¶¨Í¨µÀ.

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              buffer: ¶ÁÊý¾ÝµÄbufferÖ¸Õ룻

+ *              size  : ¶ÁÊý¾ÝµÄ´óС£»

+ *           (OUT):

+ *              ÎÞ£»

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID zOss_RamdumpIcpWriteData(UINT8 *buffer, UINT32 size)

+{

+    T_ZDrvRpMsg_Msg icpMsg = {0};

+    SINT32 retCode         = RPMSG_SPACE_NOT_ENOUGH;

+        

+    icpMsg.actorID  = ICP_MSG_ACTOR_A9;

+    icpMsg.chID     = RAMDUMP;

+    icpMsg.buf      = buffer;

+    icpMsg.len      = ZOSS_RAMDUMP_ICP_DATA_SIZE(size);

+    icpMsg.flag     |= RPMSG_WRITE_INT;

+

+    do

+    {

+        retCode = zDrvRpMsg_WriteLockIrq(&icpMsg);

+        if(retCode>0)

+        {

+            buffer      += retCode;

+            size        -= retCode;

+            icpMsg.buf  = buffer;

+            icpMsg.len  = ZOSS_RAMDUMP_ICP_DATA_SIZE(size);

+        }

+    }while ((retCode == RPMSG_SPACE_NOT_ENOUGH)||(size > 0));

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIcpInit

+ * ¹¦ÄÜÃèÊö£ºramdump Icp ³õʼ»¯.

+ * ²ÎÊý˵Ã÷£º

+ *           (IN)

+ *              ÎÞ

+ *           (OUT)

+ *              ÎÞ

+ *·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+static VOID zOss_RamdumpIcpInit(VOID)

+{

+    SINT32 retCode  = DRV_SUCCESS;

+    UINT8  pBuff[]  = "ramdump";

+    

+    retCode = zDrvRpMsg_CreateLockSaveChannel(ICP_MSG_ACTOR_A9, RAMDUMP, ZOSS_RAMDUMP_ICP_CHANNEL_SIZE);

+    zOss_ASSERT(retCode == DRV_SUCCESS);

+

+    /*ÏòͨµÀÖÐдÈëµÚÒ»°üÊý¾Ý±íʾÇëÇó½¨Á¢Í¨ÐÅ*/

+    zOss_RamdumpIcpWriteData(pBuff, strlen((const char *)pBuff));    

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIcpFinish

+ * ¹¦ÄÜÃèÊö£ºRamdumpÎļþ´«Êä½áÊø£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID zOss_RamdumpIcpFinish(VOID)

+{

+

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpSetIcpOpt

+ * ¹¦ÄÜÃèÊö£ºÉèÖÃICPͨµÀ;

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+VOID zOss_RamdumpSetIcpOpt(VOID)

+{

+    T_zOss_RamdumpIoOpt hook = {zOss_RamdumpIcpInit, zOss_RamdumpIcpReadData, zOss_RamdumpIcpWriteData, zOss_RamdumpIcpFinish};

+	

+    zOss_RamdumpSetIoOpt(hook);

+    return;

+}

+#endif

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_cortexm.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_cortexm.c
new file mode 100644
index 0000000..690bab7
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_cortexm.c
@@ -0,0 +1,100 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_cortextm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Éú³ÉramdumpµÄarmv6-mÌåϵ½á¹¹µÄcmm½Å±¾Îļþ£»

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/07/19

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ¸ß»ª·å

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é              

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_ramdump.h"

+#include "tos_except_cortexm.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_NORMAL_REG_NUM         13

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+struct cpu_core g_zRamdumpRegisters = {0};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpCreateCmmFile

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄT32½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pCmmFileInfo: cmm½Å±¾ÎļþÐÅÏ¢Ö¸Õ룻

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+VOID zOss_RamdumpCreateCmmFile(T_zOss_RamdumpCmmFileInfo  *pCmmFileInfo)

+{

+    CHAR    *cmmAddress = NULL;

+    UINT32  i           = 0;

+    

+    cmmAddress = pCmmFileInfo->cmmFileBuffer;   

+    cmmAddress += sprintf(cmmAddress, "ENTRY &%s\r\n", ZOSS_RAMDUMP_DIR_NAME);

+    cmmAddress += sprintf(cmmAddress, "r.s control %#lx\r\n", g_zRamdumpRegisters.control);	

+    cmmAddress += sprintf(cmmAddress, "r.s pc %#lx\r\n", g_zRamdumpRegisters.lr);

+    cmmAddress += sprintf(cmmAddress, "r.s xpsr %#lx\r\n", g_zRamdumpRegisters.psr);

+    cmmAddress += sprintf(cmmAddress, "r.s primask %#lx\r\n", g_zRamdumpRegisters.primask);

+    cmmAddress += sprintf(cmmAddress, "r.s r13 %#lx\r\n", g_zRamdumpRegisters.sp);

+

+    for(i = 0; i < ZOSS_NORMAL_REG_NUM; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "r.s r%d %#lx\r\n", (int)i, g_zRamdumpRegisters.r[i]);

+    }

+    

+    cmmAddress = zOss_RamdumpCreateRegionsCmmFile(cmmAddress);

+    cmmAddress += sprintf(cmmAddress, "ENDDO\r\n");     /*Êä³ö½áÊø·û*/

+    pCmmFileInfo->cmmFileSize = (UINT32)(cmmAddress - pCmmFileInfo->cmmFileBuffer);

+    zOss_AssertExN(pCmmFileInfo->cmmFileSize <= pCmmFileInfo->cmmFileMaxSize);

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_csky.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_csky.c
new file mode 100644
index 0000000..5a64081
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_csky.c
@@ -0,0 +1,129 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_csky.c

+* Ïà¹ØÎļþ : Éú³Éck610Ìåϵ½á¹¹µÄcmm½Å±¾Îļþ

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/07/19

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ¸ß»ª·å

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é              

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup_ramdump.h"

+#ifdef _OS_TOS

+#include "tos_except_arm.h"

+#elif defined (_OS_LINUX)

+#include "linux_except_arm.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZRAMDUMP_REGS_TOTAL_CNT     80

+#define ZRAMDUMP_NORMAL_REGS_CNT    16

+#define ZRADMUMP_CTRL_REGS_CNT      22   

+           

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+tos_except_register_t  *g_zEceptRegister                            = NULL;

+volatile UINT32         g_zRamdumpAdrress[ZRAMDUMP_REGS_TOTAL_CNT]  = {0};  /* ±£´æ¼Ä´æÆ÷ÐÅÏ¢       */

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpCreateCmmFile

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄcds½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+VOID zOss_RamdumpCreateCmmFile(T_zOss_RamdumpCmmFileInfo  *pCmmFileInfo)

+{

+    UINT32  regIndex    = 0;

+    CHAR    *cmmAddress = pCmmFileInfo->cmmFileBuffer; 

+    UINT32  i           = 0;

+

+    g_zEceptRegister    = tos_dump_except_register();

+    if (g_zEceptRegister != NULL)

+    {

+        zOss_Memcpy((VOID *)g_zRamdumpAdrress,g_zEceptRegister,sizeof(tos_except_register_t));

+    }

+

+    cmmAddress += sprintf(cmmAddress, "ENTRY &%s\r\n", ZOSS_RAMDUMP_DIR_NAME);

+    cmmAddress += sprintf(cmmAddress, "restore  %s binary %#lx\r\n",RAM_NAME, (UINT32)_ram_start);

+

+    /* Êä³ö¿ØÖƼĴæÆ÷, g_zRamdumpAdrress µØÖ·Ç°Ãæ±£´æµÄÊÇr0-r15,ËùÒÔregIndexÊÇ´Ó16¿ªÊ¼µÄ */

+    regIndex = ZRAMDUMP_NORMAL_REGS_CNT;

+    if (g_zEceptRegister != NULL)

+    {

+        cmmAddress += sprintf(cmmAddress,"set $cr0 = %#lx\r\n", (int)g_zEceptRegister->epsr);

+        regIndex++;

+    }

+    else

+    {

+        cmmAddress += sprintf(cmmAddress, "set $cr0 = %#lx\r\n", g_zRamdumpAdrress[regIndex++]);

+    }

+

+    for (i = 1; i < ZRADMUMP_CTRL_REGS_CNT; i++)

+    {

+        if (i == ZRAMDUMP_NORMAL_REGS_CNT)

+        {

+            continue;

+        }

+        cmmAddress += sprintf(cmmAddress,"set $cr%d =  %#lx\r\n", (int)i, g_zRamdumpAdrress[regIndex++]);

+    }

+    /* Êä³ör0-r15 */

+    regIndex = 0;

+    for (i = 0; i < ZRAMDUMP_NORMAL_REGS_CNT; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "set  $r%d =  %#lx\r\n", (int)i, g_zRamdumpAdrress[regIndex++]);

+    }

+    if (g_zEceptRegister != NULL)

+    {

+        cmmAddress += sprintf(cmmAddress, "set  $pc =  %#lx\r\n",(unsigned int)g_zEceptRegister->epc );

+    }

+    else

+    {

+        cmmAddress += sprintf(cmmAddress, "set  $pc =  %#lx\r\n",  g_zRamdumpAdrress[--regIndex]);

+    }

+    pCmmFileInfo->cmmFileSize = (UINT32)(cmmAddress - pCmmFileInfo->cmmFileBuffer);

+    zOss_AssertExN(pCmmFileInfo->cmmFileSize <= pCmmFileInfo->cmmFileMaxSize);

+}

+

+#ifdef __cplusplus

+}

+#endif

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_server.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_server.c
new file mode 100644
index 0000000..6e5ac02
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_server.c
@@ -0,0 +1,1408 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_server.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/07/19

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_ramdump.h"

+#include "sys_func_atcfg.h"

+#include "sys_com.h"

+#include "drvs_usbPoll.h"

+#include "ram_config.h"

+#include "drvs_icp.h"

+

+#if defined (_USE_ARM1_RAMDUMP) || defined (_USE_ZSP_RAMDUMP)

+#include "ps_ephy_interface.h"

+#include "drv_api.h"

+#endif

+

+#ifdef _OS_TOS

+#include <cyg/hal/tos_cache.h>

+#include <cyg/hal/tos_arm_mmu.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+#ifdef __GNUC__

+# ifdef _OS_LINUX

+#define _ramdump_size 0x6000

+char _ramdump_array[_ramdump_size];

+#define _ramdump_start (_ramdump_array)

+# else

+extern char _ramdump_start[];

+extern char _ramdump_size[];

+# endif

+#elif defined (__ARMCC_VERSION)

+extern  char Image$$RAMDUMP$$ZI$$Base[];    

+extern  char Image$$RAMDUMP$$ZI$$Limit[];   

+

+#define _ramdump_start  Image$$RAMDUMP$$ZI$$Base                              

+#define _ramdump_size   (Image$$RAMDUMP$$ZI$$Limit - Image$$RAMDUMP$$ZI$$Base)

+#endif

+

+extern SINT32 zDrvIcp_ClearState(T_HalIcp_MsgActor actor, T_HalIcp_Dword bit_map);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_zOss_RamdumpOpt           g_zRamdump_Optfunc       = {NULL,NULL};

+T_zOss_RamdumpServerInfo    g_zRamdump_ServerInfo    = {0};

+

+#define ZRAMDUMP_SERVER_FILE    "sup_ramdump_server.con"

+#define ZRAMDUMP_CLIENT_ICP_TABLE(srcModId,desModId,low_word,high_word)

+#define ZRAMDUMP_AGENT_ICP_TABLE(srcModId,desModId,low_word,high_word)

+#define ZRAMDUMP_SERVER_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)

+#undef  ZRAMDUMP_CLIENT_ICP_TABLE

+#define ZRAMDUMP_CLIENT_ICP_TABLE(srcModId,desModId,low_word,high_word)                  \

+                      {(srcModId),(desModId),{low_word,high_word}},

+T_zOss_RamdumpIcpInfo g_zRamdump_ClientIcpInfo[] = 

+{

+    #include ZRAMDUMP_SERVER_FILE

+};

+

+#undef  ZRAMDUMP_CLIENT_ICP_TABLE

+#define ZRAMDUMP_CLIENT_ICP_TABLE(srcModId,desModId,low_word,high_word)

+#undef  ZRAMDUMP_AGENT_ICP_TABLE

+#define ZRAMDUMP_AGENT_ICP_TABLE(srcModId,desModId,low_word,high_word)                   \

+                      {(srcModId),(desModId),{low_word,high_word}},

+static T_zOss_RamdumpIcpInfo   s_zRamdump_AgentIcpInfo[] = 

+{

+    #include ZRAMDUMP_SERVER_FILE

+};

+

+#undef  ZRAMDUMP_AGENT_ICP_TABLE

+#define ZRAMDUMP_AGENT_ICP_TABLE(srcModId,desModId,low_word,high_word)

+#undef  ZRAMDUMP_SERVER_MEM_TABLE

+#define ZRAMDUMP_SERVER_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)     \

+                              (UINT32)(identifier), (CHAR*)(pRamdumpStartAddr), \

+                              (UINT32)(ramdumpSize)

+static T_zOss_RamdumpServerConInfo  s_zRamdump_ServerCfgInfo = 

+{

+    #include ZRAMDUMP_SERVER_FILE

+};

+#undef  ZRAMDUMP_SERVER_MEM_TABLE

+#define ZRAMDUMP_SERVER_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)

+static T_zOss_RamdumpClientInfo **s_zRamdump_ClientInfo = NULL;

+static T_zOss_RamdumpExceptInfo s_zRamdump_ExceptCore   = {FALSE, 0};

+static BOOL                     s_zRamdump_InitFlag     = FALSE;

+#ifdef _USE_ARM1_RAMDUMP

+static BOOL                     s_zRamdump_Arm1WaitFlag = FALSE;

+#endif

+

+static T_zOss_RamdumpIoOpt  g_zRamdumpIoOpt;

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* io read/write buffer: [msg][data] */

+#define ZOSS_RAMDUMP_IO_DATA_BASE(addr)         ((UINT32)addr + 4)

+#define ZOSS_RAMDUMP_ICP_CLIENT_SIZE            0X24

+#define ZOSS_RAMDUMP_ICP_AGENT_SIZE             0X24

+#define ZOSS_RAMDUMP_DELAYTIME_CNT              2500   

+

+#ifdef _USE_ARM1_RAMDUMP

+#define ZOSS_RAMDUNP_PHY_INFO_BASE              0x24A60000

+#define ZOSS_RAMDUMP_PHY_COREDID                0XFF

+#define ZOSS_RAMDUMP_FLAG_ARM02ARM1_SIZE        4

+#define ZOSS_RAMDUMP_FLAG_ARM12ARM0_SIZE        4

+#define ZOSS_RAMDUMP_CMM_BUFFER_SIZE            4096

+#define ZOSS_RAMDUMP_CFG_REGIONS_SIZE           4096

+#define ZOSS_RAMDUMP_PARSED_REGIONS_SIZE        4096

+#define ZOSS_RAMDUMP_FILE_SIZE                  2048

+#define ZOSS_RAMDUMP_ERROR_FILE_SIZE            1024

+#define ZOSS_RAMDUMP_ARM1_NAME                  "arm1_memory.bin"

+#define ZOSS_RAMDUMP_ARM1_CMM_INFO_BASE         0x24A60000

+#define ZOSS_RAMDUMP_CFG_REGION_BASE            (ZOSS_RAMDUMP_ARM1_CMM_INFO_BASE + ZOSS_RAMDUMP_CMM_BUFFER_SIZE)

+#define ZOSS_RAMDUMP_ARM1_PARSED_REGION_BASE    (ZOSS_RAMDUMP_CFG_REGION_BASE + ZOSS_RAMDUMP_CFG_REGIONS_SIZE)

+#define ZOSS_RADMUMP_ARM1_ERROR_FILE_BASE       (ZOSS_RAMDUMP_ARM1_PARSED_REGION_BASE + ZOSS_RAMDUMP_PARSED_REGIONS_SIZE)

+#define ZOSS_RAMDUMP_ARM1_FLAG_ARM02ARM1_BASE   (ZOSS_RADMUMP_ARM1_ERROR_FILE_BASE + ZOSS_RAMDUMP_ERROR_FILE_SIZE)

+#define ZOSS_RAMDUMP_ARM1_FLAG_ARM12ARM0_BASE   (ZOSS_RAMDUMP_ARM1_FLAG_ARM02ARM1_BASE + ZOSS_RAMDUMP_FLAG_ARM02ARM1_SIZE)

+#define ZOSS_RAMDUMP_CMM_FILE_BUF_SIZE(addr)    (*(UINT32 *)addr)

+#define ZOSS_RAMDUMP_CMM_FILE_BUF_BASE(addr)    ((UINT32)addr + 4)

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID ramdump_TransferData(VOID);

+static VOID ramdump_GetAvailableRegion(T_zOss_RamdumpRegion *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo);

+static VOID ramdump_ParseRegionInfo(T_zOss_RamdumpRegionInfo *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo);

+static VOID ramdump_SaveFileInfo(const CHAR *name, UINT32 baseServer, UINT32 size);

+static VOID ramdump_SaveRegionFileInfo(T_zOss_RamdumpRegionInfo *pRegionInfo, const CHAR *pFileName);

+static VOID ramdump_SaveAgentFileInfo(const CHAR *name, UINT32 baseServer, UINT32 size );

+static VOID ramdump_SaveAllFilesInfo(VOID);

+static VOID ramdump_Main(VOID);

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+static VOID ramdump_GetConfigRegion(VOID);

+#endif

+static VOID ramdump_SetPartition(VOID);

+static VOID except_RecordExceptInfo(UINT32 exceptCoreID);

+static BOOL ramdump_delay(UINT32 ms, volatile UINT32 *addr, UINT32 flag);

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef _USE_ARM1_RAMDUMP

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_CheckArm1InitFinish

+ * ¹¦ÄÜÃèÊö£ºÅжÏarm1³õʼ»¯ÊÇ·ñ³õʼ»¯Íê³É£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static BOOL ramdump_CheckArm1InitFinish(VOID)

+{

+    return (*(volatile UINT32 *)ZOSS_RAMDUMP_ARM1_FLAG_ARM12ARM0_BASE == 0);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessMsgFromArm1

+ * ¹¦ÄÜÃèÊö£ºserver ´¦Àíarm1µÄICPÏûÏ¢º¯Êý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessMsgFromArm1(const T_HalIcp_Msg *pMsg)

+{

+    T_HalIcp_Dword state = { 0 };

+   

+    zDrvIcp_GetState(ICP_MSG_ACTOR_ARM, &state);

+    zDrvIcp_ClearState(ICP_MSG_ACTOR_ARM, state);

+    except_RecordExceptInfo(ZOSS_RAMDUMP_PHY_COREDID);

+    sprintf((char *)g_zRamdump_ServerInfo.pErrInfo->pBuff, "%d_s_core: force error!\n", (int)s_zRamdump_ServerCfgInfo.serverId);

+#ifdef _OS_LINUX

+    linux_ramdump_entry();

+#else

+    zOss_RamdumpHandle(1, 1, 1);

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_Arm1Init

+ * ¹¦ÄÜÃèÊö£ºarm1³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_Arm1Init(VOID)

+{

+    *(volatile UINT32 *)ZOSS_RAMDUMP_ARM1_FLAG_ARM02ARM1_BASE = 0;

+#ifdef _OS_TOS

+    TOS_CACHE_CLEAN_ALL();

+#endif

+    zDrvIcp_RegCallback(ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_ProcessMsgFromArm1, ICP_ISR_CALLBACK); 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SendMsgToArm1

+ * ¹¦ÄÜÃèÊö£ºÏòarm1·¢ËÍICPÏûÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SendMsgToArm1(UINT32 exceptType)

+{

+    T_HalIcp_Msg icpMsg = { 0 };

+   

+    icpMsg.SrcModId          = ICP_ARM0_MODULE_ID_OS;

+    icpMsg.desModId          = ICP_ARM1_MODULE_ID_OS;

+    icpMsg.len               = exceptType;

+    icpMsg.IntInfo.high_word = ZPLAT_PS2PHY_RAMDUMP_INT_ICP_CF;

+    zDrvIcp_SendMsg( (const T_HalIcp_Msg *)&icpMsg );

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_GetArm1AvailableRegion

+ * ¹¦ÄÜÃèÊö£º¶ÔĬÈÏÅäÖõÄÄÚ´æ¿éÊý¾ÝÓëMMU½âÎöµÄÄÚ´æ¿éÊý¾Ý¶Ô±È£¬

+             ±£´æ¿Éµ¼³öÀ´µÄÄÚ´æ¿é

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              pCfgInfo:    ÅäÖõĵØÖ·ÐÅÏ¢Ö¸Õ룻

+ *              pParsedInfo: ½âÎöºóµÄµØÖ·ÐÅÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_GetArm1AvailableRegion(T_zOss_RamdumpArm1Region *pCfgInfo, T_zOss_RadmumpArm1RegionInfo *pParsedInfo)

+{

+    UINT32                   i             = 0;

+    T_zTos_MmuRamdumpTable   mmuTable      = { 0 };

+    T_zOss_RamdumpArm1Region *pParseRegion = &(pParsedInfo->regions[0]);

+    

+    if (zTos_MmuGetMappingRegion(pCfgInfo->startAddr, (pCfgInfo->endAddr - pCfgInfo->startAddr + 1), &mmuTable))

+    {

+        for (i= 0; i < mmuTable.count; i++, pParsedInfo->regionNum++)

+        {

+            pParseRegion[pParsedInfo->regionNum].startAddr = mmuTable.item[i].virBase;

+            pParseRegion[pParsedInfo->regionNum].mapAddr   = pCfgInfo->startAddr != pCfgInfo->mapAddr ?

+                                                             (pCfgInfo->mapAddr + mmuTable.item[i].phyBase - pCfgInfo->startAddr) : mmuTable.item[i].virBase;

+            pParseRegion[pParsedInfo->regionNum].copyAddr  = pCfgInfo->copyAddr != 0 ? (pCfgInfo->copyAddr + mmuTable.item[i].phyBase - pCfgInfo->startAddr) : 0;

+            pParseRegion[pParsedInfo->regionNum].endAddr   = mmuTable.item[i].virBase + mmuTable.item[i].size - 1;  

+        }

+    } 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ParseArm1RegionInfo

+ * ¹¦ÄÜÃèÊö£º½âÎöÄÚ´æ¿éÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              pCfgInfo:    ÅäÖÃÇøÓòÊý¾ÝÐÅÏ¢Ö¸Õ룻

+ *              pParsedInfo: ½âÎöÇøÓòÊý¾ÝÐÅÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ParseArm1RegionInfo(T_zOss_RadmumpArm1RegionInfo *pCfgInfo, T_zOss_RadmumpArm1RegionInfo *pParsedInfo)

+{   

+    UINT32  i = 0;

+

+    for (i = 0; i < pCfgInfo->regionNum; i++)

+    {

+        ramdump_GetArm1AvailableRegion(&(pCfgInfo->regions[i]), pParsedInfo);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveArm1RegionFileInfo

+ * ¹¦ÄÜÃèÊö£º±£´æarm1 RegionÎļþÐÅÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pRegionInfo: ½âÎöºóµÄÊý¾Ý¶ÎµÄÖ¸Õ룻

+ *              pFileName  : ÎļþÃû×Ö£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveArm1RegionFileInfo(T_zOss_RadmumpArm1RegionInfo *pRegionInfo, const CHAR *pFileName)

+{

+    UINT32               i                               = 0;

+    CHAR                 name[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    T_zOss_RamdumpRegion serverRegion                    = { 0 };

+   

+    for (i = 0; i < pRegionInfo->regionNum; i++)

+    {

+        serverRegion.baseForServer = pRegionInfo->regions[i].startAddr;

+        serverRegion.baseForSelf   = pRegionInfo->regions[i].mapAddr;

+        serverRegion.baseForCopy   = pRegionInfo->regions[i].copyAddr;

+        serverRegion.size          = pRegionInfo->regions[i].endAddr - pRegionInfo->regions[i].startAddr + 1;

+        sprintf(name, "%s_%d", pFileName, (int)i);

+        ramdump_SaveFileInfo(name, serverRegion.baseForServer, serverRegion.size);

+        ramdump_SaveAgentFileInfo(name, serverRegion.baseForServer, serverRegion.size);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveArm1FilesInfo

+ * ¹¦ÄÜÃèÊö£º±£´æarm1 ÎļþÐÅÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveArm1FilesInfo(VOID)

+{

+    if (s_zRamdump_Arm1WaitFlag)

+    {

+        ramdump_SaveArm1RegionFileInfo((T_zOss_RadmumpArm1RegionInfo *)ZOSS_RAMDUMP_ARM1_PARSED_REGION_BASE, ZOSS_RAMDUMP_ARM1_NAME);

+        ramdump_SaveFileInfo("arm1_targetstate.cmm", ZOSS_RAMDUMP_CMM_FILE_BUF_BASE(ZOSS_RAMDUMP_ARM1_CMM_INFO_BASE), 

+                             ZOSS_RAMDUMP_CMM_FILE_BUF_SIZE(ZOSS_RAMDUMP_ARM1_CMM_INFO_BASE));

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessArm1Exception

+ * ¹¦ÄÜÃèÊö£º´¦ÀíArm1Òì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessArm1Exception(VOID)

+{

+    if (ramdump_CheckArm1InitFinish())

+    {

+        UINT32 delayTimeLen = 1000;      /* ʱ¼ä´óÔ¼ÔÚ1s×óÓÒ*/

+        ramdump_ParseArm1RegionInfo((T_zOss_RadmumpArm1RegionInfo *)ZOSS_RAMDUMP_CFG_REGION_BASE, (T_zOss_RadmumpArm1RegionInfo *)ZOSS_RAMDUMP_ARM1_PARSED_REGION_BASE);

+        *(volatile UINT32 *)ZOSS_RAMDUMP_ARM1_FLAG_ARM02ARM1_BASE = ZOSS_RAMDUMP_FLAG_SECOND_VALUE;    

+#ifdef _OS_TOS

+        TOS_CACHE_CLEAN_ALL();

+#endif

+        s_zRamdump_Arm1WaitFlag = ramdump_delay(delayTimeLen, (UINT32 *)ZOSS_RAMDUMP_ARM1_FLAG_ARM12ARM0_BASE, ZOSS_RAMDUMP_FLAG_SECOND_VALUE);

+    }

+}

+

+#endif

+

+#ifdef _USE_ZSP_RAMDUMP

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ZspRegionCfg

+ * ¹¦ÄÜÃèÊö£ºzsp µ¼³öÇøÓòÅäÖã»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ZspRegionCfg(VOID)

+{

+    T_ZDrvSys_PowerOn_Type powOnType;

+

+    powOnType = zDrvComm_GetPowerOnState();

+    if(POWER_ON_FOTA == powOnType || POWER_ON_CHARGING == powOnType)

+        return;   

+

+    ramdump_SaveFileInfo("DTCM.bin", RAMDUMP_ZSP_DTCM_BASE, RAMDUMP_ZSP_DTCM_SIZE);

+    ramdump_SaveFileInfo("DDDR.bin", RAMDUMP_ZSP_DDDR_BASE, RAMDUMP_ZSP_DDDR_SIZE);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SendMsgToZsp

+ * ¹¦ÄÜÃèÊö£ºÏòzsp·¢ËÍICPÏûÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º ·¢ËÍicpÏûÏ¢£¬Í¨Öªzsp²»ÒªÐÝÃߣ¬ÒÔ·À˯ÃßzspʱµÄÄÚ´æ²»ÄÜ·ÃÎÊ£»

+**************************************************************************/

+static VOID ramdump_SendMsgToZsp(VOID)

+{

+    T_HalIcp_Msg icpMsg = { 0 };

+   

+    icpMsg.SrcModId          = ICP_ARM0_MODULE_ID_OS;

+    icpMsg.desModId          = ICP_ARM1_MODULE_ID_OS;

+ //   icpMsg.len               = exceptType;

+    icpMsg.IntInfo.high_word = ZPLAT_PS2PHY_RAMDUMP_INT_ICP_CF;

+    zDrvIcp_SendMsg((const T_HalIcp_Msg *)&icpMsg);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessMsgFromZsp

+ * ¹¦ÄÜÃèÊö£ºserver ´¦ÀízspµÄICPÏûÏ¢º¯Êý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessMsgFromZsp(const T_HalIcp_Msg *pMsg)

+{

+    T_HalIcp_Dword  state   = { 0 };

+

+    zDrvIcp_GetState(ICP_MSG_ACTOR_ARM, &state);

+    zDrvIcp_ClearState(ICP_MSG_ACTOR_ARM, state);

+    sprintf((char *)g_zRamdump_ServerInfo.pErrInfo->pBuff, "zsp: exact error!\n");

+#ifdef _OS_LINUX

+    linux_ramdump_entry();

+#else

+    zOss_RamdumpHandle(1, 1, 1);

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ZspInit

+ * ¹¦ÄÜÃèÊö£ºzsp³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ZspInit(VOID)

+{

+    zDrvIcp_RegCallback(ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_ProcessMsgFromZsp, ICP_ISR_CALLBACK); 

+}

+

+#endif

+

+/******************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_TransferData

+ * ¹¦ÄÜÃèÊö£ºÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ *******************************************************************************/

+static VOID ramdump_TransferData(VOID)

+{

+    UINT32             rspDataLen = 0;            

+    CHAR               *reqBuffer = (CHAR *)g_zRamdump_ServerInfo.pIoReadbuf->pBuff;

+    CHAR               *rspBuffer = (CHAR *)g_zRamdump_ServerInfo.pIoWritebuf->pBuff;

+    UINT32             *reqCmd    = (UINT32 *)reqBuffer;

+    UINT32             *rspCmd    = (UINT32 *)rspBuffer;

+    T_zOss_RamdumpFile *fileInfo  = g_zRamdump_ServerInfo.pFileInfo->fileInfo;

+    

+    g_zRamdumpIoOpt.init();

+

+    for(;;)

+    {

+        g_zRamdumpIoOpt.read((UINT8 *)reqBuffer, ZOSS_RAMDUMP_CMD_BUFFER_LEN);      

+        switch (*reqCmd)

+        {

+        case ZOSS_RAMDUMP_FILE_LINK_REQ:            /* ͬ²½ÇëÇó */

+            {

+                T_zOss_RamumpFileLinkRsp *rspMsg = (T_zOss_RamumpFileLinkRsp *)ZOSS_RAMDUMP_IO_DATA_BASE(rspBuffer);

+                *rspCmd = ZOSS_RAMDUMP_FILE_LINK_RSP;

+                

+                rspMsg->fileNum = g_zRamdump_ServerInfo.pFileInfo->fileNum;

+                rspDataLen = sizeof(*rspCmd) + sizeof(T_zOss_RamumpFileLinkRsp);

+                break;

+            }

+        case ZOSS_RAMDUMP_FILE_FILE_REQ:            /* ¶ÁÈ¡ÎļþÐÅÏ¢£¬¿ªÊ¼´«ÊäÎļþÇëÇó */

+            {

+                T_zOss_RamdumpFileFileReq *reqMsg = (T_zOss_RamdumpFileFileReq *)ZOSS_RAMDUMP_IO_DATA_BASE(reqBuffer);

+                T_zOss_RamdumpFileFileRsp *rspMsg = (T_zOss_RamdumpFileFileRsp *)ZOSS_RAMDUMP_IO_DATA_BASE(rspBuffer);

+

+                zOss_AssertExN(reqMsg->fileNo < g_zRamdump_ServerInfo.pFileInfo->fileNum);

+                *rspCmd = ZOSS_RAMDUMP_FILE_FILE_RSP;

+                strcpy((char *)rspMsg->fileName, (char *)fileInfo[reqMsg->fileNo].fileName);

+                rspMsg->size = fileInfo[reqMsg->fileNo].size;

+                rspDataLen = sizeof(*rspCmd) + sizeof(T_zOss_RamdumpFileFileRsp);            

+                break;

+            }

+        case ZOSS_RAMDUMP_FILE_READ_REQ:            /* ¶ÁÈ¡ÎļþÄÚÈÝ */

+            {

+                T_zOss_RamdumpFileReadReq *reqMsg = (T_zOss_RamdumpFileReadReq *)ZOSS_RAMDUMP_IO_DATA_BASE(reqBuffer);

+                *rspCmd = ZOSS_RAMDUMP_FILE_READ_RSP;

+                

+                zOss_AssertExN(reqMsg->fileNo <= g_zRamdump_ServerInfo.pFileInfo->fileNum);  

+                zOss_AssertExN(reqMsg->offset + reqMsg->length <= fileInfo[reqMsg->fileNo].size);                

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, sizeof(*rspCmd));

+                g_zRamdumpIoOpt.write((UINT8 *)(fileInfo[reqMsg->fileNo].baseforServer + reqMsg->offset), reqMsg->length);

+                continue;                           /* ¼ÌÐøÖ´ÐÐÏÂÒ»´Î¶Á */

+            }

+        case ZOSS_RAMDUMP_FILE_END_REQ:             /* ´«Êä½áÊø */

+            {

+                *rspCmd = ZOSS_RAMDUMP_FILE_END_RSP;

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, sizeof(*rspCmd));

+                g_zRamdumpIoOpt.finish();

+                return;

+            }

+        default:                /* ´íÎóÖ¸Áî */

+            {

+                *rspCmd = ZOSS_RAMDUMP_FILE_CMD_FAIL;

+                rspDataLen = sizeof(*rspCmd);

+                break;

+            }

+        } 

+        zOss_AssertExN(rspDataLen < g_zRamdump_ServerInfo.pIoWritebuf->buffLen);

+        g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_get_available_region

+ * ¹¦ÄÜÃèÊö£º¶ÔĬÈÏÅäÖõÄÄÚ´æ¿éÊý¾ÝÓëMMU½âÎöµÄÄÚ´æ¿éÊý¾Ý¶Ô±È£¬

+             ±£´æ¿Éµ¼³öÀ´µÄÄÚ´æ¿é

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              pCfgInfo:     ÅäÖõĵØÖ·ÐÅÏ¢Ö¸Õ룻

+ *              pParsedInfo:  ½âÎöºóµÄµØÖ·ÐÅÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+static VOID ramdump_GetAvailableRegion(T_zOss_RamdumpRegion *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo)

+{

+    UINT32                 i             = 0;

+    T_zTos_MmuRamdumpTable mmuTable      = { 0 };

+    T_zOss_RamdumpRegion   *pParseRegion = &(pParsedInfo->regions[0]);

+    

+    if (zTos_MmuGetMappingRegion(pCfgInfo->baseForServer, pCfgInfo->size, &mmuTable))

+    {

+        zOss_AssertExN((pParsedInfo->regionMaxNum - pParsedInfo->regionNum) >= mmuTable.count);

+        for (i= 0; i < mmuTable.count; i++, pParsedInfo->regionNum++)

+        {

+            pParseRegion[pParsedInfo->regionNum].baseForServer = mmuTable.item[i].virBase;

+            pParseRegion[pParsedInfo->regionNum].baseForSelf   = pCfgInfo->baseForServer != pCfgInfo->baseForSelf ?

+                                                                  (pCfgInfo->baseForSelf + mmuTable.item[i].phyBase - pCfgInfo->baseForServer) : mmuTable.item[i].virBase;

+            pParseRegion[pParsedInfo->regionNum].baseForCopy   = pCfgInfo->baseForCopy != 0 ? (pCfgInfo->baseForCopy + mmuTable.item[i].phyBase - pCfgInfo->baseForServer) : 0;

+            pParseRegion[pParsedInfo->regionNum].size          = mmuTable.item[i].size;  

+        }

+    } 

+}

+#else

+static VOID ramdump_GetAvailableRegion(T_zOss_RamdumpRegion *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo)

+{

+    T_zOss_RamdumpRegion *pParseRegion = &(pParsedInfo->regions[0]);

+

+    pParseRegion[pParsedInfo->regionNum].baseForServer = pCfgInfo->baseForServer;

+    pParseRegion[pParsedInfo->regionNum].baseForSelf   = pCfgInfo->baseForSelf;

+    pParseRegion[pParsedInfo->regionNum].baseForCopy   = pCfgInfo->baseForCopy;

+    pParseRegion[pParsedInfo->regionNum].size          = pCfgInfo->size;

+    pParsedInfo->regionNum++;

+}

+#endif

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ParseRegioInfo

+ * ¹¦ÄÜÃèÊö£º½âÎöÄÚ´æ¿éÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              pCfgInfo:    ÅäÖÃÇøÓòÊý¾ÝÐÅÏ¢Ö¸Õ룻

+ *              pParsedInfo: ½âÎöÇøÓòÊý¾ÝÐÅÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ParseRegionInfo(T_zOss_RamdumpRegionInfo *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo)

+{   

+    UINT32  i = 0;

+

+    for (i = 0; i < pCfgInfo->regionNum; i++)

+    {

+        ramdump_GetAvailableRegion(&(pCfgInfo->regions[i]), pParsedInfo);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveAgentFileInfo

+ * ¹¦ÄÜÃèÊö£º½«ÎļþÐÅÏ¢±£´æÖÁ¸ß¶ÎÄÚ´æ,ÓÃÓÚºÍAGENT½øÐÐͨÐÅ£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              name: ÎļþÃû×Ö£»

+ *              baseServer:µØÖ·£»

+ *              size: Êý¾Ý´óС£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveAgentFileInfo(const CHAR *name, UINT32 baseServer, UINT32 size )

+{

+    T_zOss_RamdumpFile *pFileInfo = g_zRamdump_ServerInfo.pAgentFileInfo->fileInfo + g_zRamdump_ServerInfo.pAgentFileInfo->fileNum;

+

+    strcpy((char *)pFileInfo->fileName, name);

+#ifdef _OS_TOS

+# ifdef CYGOPT_HAL_ARM_MMU

+    zTos_MmuGetPaddrByVaddr(baseServer,(cyg_uint32 *)&(pFileInfo->baseforServer));

+# elif defined (CYGOPT_HAL_ARM_MPU)

+    pFileInfo->baseforServer = baseServer;

+# endif

+#elif defined (_OS_LINUX)

+# ifdef CONFIG_MMU

+    /* FIXME */

+# else

+    pFileInfo->baseforServer = baseServer;

+# endif

+#endif

+    pFileInfo->size = size;

+    g_zRamdump_ServerInfo.pAgentFileInfo->fileNum++;

+    zOss_AssertExN(g_zRamdump_ServerInfo.pAgentFileInfo->fileNum < g_zRamdump_ServerInfo.pAgentFileInfo->fileMaxNum); 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveFileInfo

+ * ¹¦ÄÜÃèÊö£º½«ÎļþÐÅÏ¢±£´æÖÁ¸ß¶ÎÄÚ´æ

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              name: Ãû×Ö£»

+ *              baseServer: µØÖ·£»

+ *              size: Êý¾Ý´óС£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveFileInfo(const CHAR *name, UINT32 baseServer, UINT32 size )

+{

+    T_zOss_RamdumpFile *pFileInfo = g_zRamdump_ServerInfo.pFileInfo->fileInfo + g_zRamdump_ServerInfo.pFileInfo->fileNum;

+

+    strcpy((char *)pFileInfo->fileName, name);

+    pFileInfo->baseforServer = baseServer;

+    pFileInfo->size          = size;

+    g_zRamdump_ServerInfo.pFileInfo->fileNum++;

+    zOss_AssertExN(g_zRamdump_ServerInfo.pFileInfo->fileNum < g_zRamdump_ServerInfo.pFileInfo->fileMaxNum); 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveRegionFileInfo

+ * ¹¦ÄÜÃèÊö£ºÕûÀíÄÚ´æ¿éµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              p_region_info: ½âÎöºóµÄÊý¾Ý¶ÎµÄÖ¸Õ룻

+ *              file_name    : ÎļþÃû×Ö£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveRegionFileInfo(T_zOss_RamdumpRegionInfo *pRegionInfo, const CHAR *pFileName)

+{

+    UINT32  i                               = 0;

+    CHAR    name[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    

+    for (i = 0; i < pRegionInfo->regionNum; i++)

+    {

+        sprintf(name, "%d_%s", (int)i, pFileName);

+        ramdump_SaveFileInfo(name, pRegionInfo->regions[i].baseForServer, pRegionInfo->regions[i].size);

+        ramdump_SaveAgentFileInfo(name, pRegionInfo->regions[i].baseForServer, pRegionInfo->regions[i].size);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveServerFilesInfo

+ * ¹¦ÄÜÃèÊö£º±£´æserverµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveServerFilesInfo(VOID)

+{

+    CHAR                      binName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    CHAR                      cmmName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    T_zOss_RamdumpCmmFileInfo *pCmmInfo   = g_zRamdump_ServerInfo.pCmmInfo;

+    

+    sprintf(binName, "%d_s_mem.bin", (int)s_zRamdump_ServerCfgInfo.serverId);

+    ramdump_SaveRegionFileInfo(g_zRamdump_ServerInfo.pParsedInfo, binName);

+    sprintf(cmmName, "%d_s_targetstate.cmm", (int)s_zRamdump_ServerCfgInfo.serverId);

+    ramdump_SaveFileInfo(cmmName, (UINT32)pCmmInfo->cmmFileBuffer, pCmmInfo->cmmFileSize);

+    ramdump_SaveAgentFileInfo(cmmName, (UINT32)pCmmInfo->cmmFileBuffer, pCmmInfo->cmmFileSize);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveClientFilesInfo

+ * ¹¦ÄÜÃèÊö£º±£´æclientµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveClientFilesInfo(VOID)

+{

+    CHAR    binName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    CHAR    cmmName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    UINT32  cnt                                = 0;

+    

+    for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {    

+        if ((s_zRamdump_ClientInfo[cnt] != NULL) && g_zRamdump_ServerInfo.pWaitMsgFlag[cnt])

+        {

+            T_zOss_RamdumpCmmFileInfo *pCmmInfo = s_zRamdump_ClientInfo[cnt]->pCmmInfo;

+            

+            sprintf(binName, "%d_c_mem.bin", (int)s_zRamdump_ClientInfo[cnt]->clientId);

+            ramdump_SaveRegionFileInfo(s_zRamdump_ClientInfo[cnt]->pParsedInfo, binName);

+            sprintf(cmmName, "%d_c_targetstate.cmm",(int)s_zRamdump_ClientInfo[cnt]->clientId);

+            ramdump_SaveFileInfo(cmmName, (UINT32)pCmmInfo->cmmFileBuffer, pCmmInfo->cmmFileSize);

+            ramdump_SaveAgentFileInfo(cmmName, (UINT32)pCmmInfo->cmmFileBuffer, pCmmInfo->cmmFileSize);

+        }

+    }

+    

+#ifdef _USE_ARM1_RAMDUMP

+    ramdump_SaveArm1FilesInfo();

+#endif

+

+#ifdef _USE_ZSP_RAMDUMP

+    ramdump_ZspRegionCfg();

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveErrorFileInfo

+ * ¹¦ÄÜÃèÊö£º±£´æ´íÎóÐÅÏ¢ÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveErrorFileInfo(VOID)

+{

+    T_zOss_RamdumpBuffInfo *pErrInfo  = g_zRamdump_ServerInfo.pErrInfo;

+    UINT32                  cnt       = 0;

+    UINT32                  len       = 0;

+    UINT32                  errLogLen = strlen((const char *)pErrInfo->pBuff);

+

+    for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {    

+        if ((s_zRamdump_ClientInfo[cnt] != NULL) && g_zRamdump_ServerInfo.pWaitMsgFlag[cnt])

+        {

+            len       =  errLogLen;

+            errLogLen += strlen(s_zRamdump_ClientInfo[cnt]->pErrInfo->pBuff);

+            zOss_AssertExN(errLogLen < pErrInfo->buffLen);

+            strcpy((char *)(pErrInfo->pBuff+ len), (char *)s_zRamdump_ClientInfo[cnt]->pErrInfo->pBuff);

+        }

+    }

+    

+#ifdef _USE_ARM1_RAMDUMP    

+    if (s_zRamdump_Arm1WaitFlag)

+    {

+        len       =  errLogLen;

+        errLogLen += strlen((char *)ZOSS_RADMUMP_ARM1_ERROR_FILE_BASE);

+        zOss_AssertExN(errLogLen < pErrInfo->buffLen);

+        strcpy((char *)(pErrInfo->pBuff+ len), (char *)ZOSS_RADMUMP_ARM1_ERROR_FILE_BASE);

+    }

+#endif 

+

+    ramdump_SaveFileInfo("err_log.txt", (UINT32)pErrInfo->pBuff, errLogLen); 

+    ramdump_SaveAgentFileInfo("err_log.txt", (UINT32)pErrInfo->pBuff, errLogLen);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveAllFilesInfo

+ * ¹¦ÄÜÃèÊö£ºÕûÀíµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveAllFilesInfo(VOID)

+{

+    ramdump_SaveServerFilesInfo();

+    ramdump_SaveClientFilesInfo();

+    ramdump_SaveErrorFileInfo();

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ServerSendMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶÏûÏ¢·¢ËͽӿÚ

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pIcpInfo: ICPÐÅÏ¢Ö¸Õ룻

+ *              pMsgInfo: ÏûÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ServerSendMsg(T_zOss_RamdumpIcpInfo *pIcpInfo ,T_zOss_RamdumpServerMsgInfo *pMsgInfo)

+{

+    T_HalIcp_Msg icpMsg;  

+    icpMsg.SrcModId            = pIcpInfo->srcModId;

+    icpMsg.desModId            = pIcpInfo->desModId;

+    icpMsg.IntInfo.high_word   = pIcpInfo->intInfo.high_word;

+    icpMsg.pBuf                = pMsgInfo;

+    icpMsg.len                 = sizeof(T_zOss_RamdumpServerMsgInfo);

+    zDrvIcp_SendMsg((const T_HalIcp_Msg *)&icpMsg);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºexcept_RecordExceptInfo

+ * ¹¦ÄÜÃèÊö£º¼Ç¼Òì³£ÐÅÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              exceptCore: Òì³£ºËID

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID except_RecordExceptInfo(UINT32 exceptCoreID)

+{

+    if(!s_zRamdump_ExceptCore.exceptFlag)

+    {

+        s_zRamdump_ExceptCore.exceptFlag = TRUE;

+        s_zRamdump_ExceptCore.exceptCore = exceptCoreID;

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ServerProcessClientMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶclientÏûÏ¢´¦Àí½Ó¿Ú

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pBuff: ÏûÏ¢buffÖ¸Õ룻

+ *              len  : ÏûÏ¢´óС£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ServerProcessClientMsg(const T_HalIcp_Msg *pMsg)

+{

+    UINT32                      cnt         = 0;

+    T_zOss_RamdumpClientMsgInfo *ramdumpMsg = (T_zOss_RamdumpClientMsgInfo *)pMsg->pBuf;

+

+    switch(ramdumpMsg->msgType)

+    {    

+    case ZOSS_RAMDUMP_INIT_TYPE:

+        {

+            for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+            {

+                if (ramdumpMsg->srcModId == g_zRamdump_ClientIcpInfo[cnt].srcModId)

+                    s_zRamdump_ClientInfo[cnt] = (T_zOss_RamdumpClientInfo *)ramdumpMsg->pRamdumpStartAddr;

+            }   

+            break;

+        }  

+    case ZOSS_RAMDUMP_EXCPT_TYPE:

+        {

+            except_RecordExceptInfo(ramdumpMsg->srcModId);

+            sprintf((char *)g_zRamdump_ServerInfo.pErrInfo->pBuff, "%d_s_core: force error!\n", (int)s_zRamdump_ServerCfgInfo.serverId); 

+            zOss_RamdumpHandle(1, 1, 1);

+            break;

+        }

+    default:

+        {

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ServerProcessAgentMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶagentÏûÏ¢´¦Àí½Ó¿Ú

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pBuff: ÏûÏ¢bufferÖ¸Õ룻

+ *              len  : ÏûÏ¢´óС£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ServerProcessAgentMsg(const T_HalIcp_Msg *pMsg)

+{

+    T_zOss_RamdumpAgentMsgInfo *ramdumpMsg = (T_zOss_RamdumpAgentMsgInfo *)pMsg->pBuf;

+

+    switch(ramdumpMsg->msgType)

+    {

+    

+    default:

+        {

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_delay

+ * ¹¦ÄÜÃèÊö£º³¬Ê±µÈ´ýÅж϶àºËramdumpµÄͬ²½±êÖ¾£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *                ms  : 550MhzÖ÷Ƶϵ¥Î»ÊÇ1ms

+ *                addr: µØÖ·

+ *                falg: µÈ´ý±êÖ¾

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static BOOL ramdump_delay(UINT32 ms, volatile UINT32 *addr, UINT32 flag)

+{

+    UINT32 i, j;

+    

+    for (j = 0; j < ZOSS_RAMDUMP_DELAYTIME_CNT; j++)

+    {

+        for (i = 0; i < ms; i++)

+        {

+            if (*addr == flag)

+                return TRUE;

+        } 

+    }

+    return FALSE;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_GetConfigRegion

+ * ¹¦ÄÜÃèÊö£º»ñÈ¡radmumpÒªµ¼³öµÄÇøÓò£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+static VOID ramdump_GetConfigRegion(VOID)

+{

+    T_zOss_RamdumpRegion regionInfo = {0};

+    UINT32 cnt                      = 0;

+    T_zTos_MmuConfigItem *pItem     = NULL;

+    

+    for (cnt = 0; cnt < g_zTos_MmuConfigTable.count; cnt++)

+    {   

+        pItem = &g_zTos_MmuConfigTable.item[cnt];

+        if (pItem->attr & ZTOS_MMU_REGION_DUMP)

+        {

+            regionInfo.baseForServer = pItem->server_base;

+            regionInfo.baseForSelf   = pItem->physical_base;

+            regionInfo.size          = pItem->size;

+            regionInfo.baseForCopy   = (pItem->attr & ZTOS_MMU_REGION_COPY) ? pItem->server_base : 0;

+            zOss_RamdumpConfigureMem(&regionInfo);

+        }

+    }

+}

+#endif

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SetPartition

+ * ¹¦ÄÜÃèÊö£ºramdump¿Õ¼ä»®·Ö£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SetPartition(VOID)

+{

+    UINT32 size     = 0;

+    UINT32 sizeUnit = s_zRamdump_ServerCfgInfo.ramdumpSize/ZOSS_RAMDUMP_SERVER_TOTAL_RATE;

+    

+    g_zRamdump_ServerInfo.pCmmInfo = (T_zOss_RamdumpCmmFileInfo *)(((UINT32)s_zRamdump_ServerCfgInfo.pRamdumpStartAddr + sizeof(UINT32) - 1) & ~(sizeof(UINT32) - 1));

+    g_zRamdump_ServerInfo.pCmmInfo->cmmFileSize = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_CMM_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pCmmInfo->cmmFileMaxSize = size - sizeof(T_zOss_RamdumpCmmFileInfo);

+  

+    g_zRamdump_ServerInfo.pConfigureInfo = (T_zOss_RamdumpRegionInfo *)((CHAR*)g_zRamdump_ServerInfo.pCmmInfo + size);

+    g_zRamdump_ServerInfo.pConfigureInfo->regionNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_CONFIGURED_REGION_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pConfigureInfo->regionMaxNum = (size - sizeof(T_zOss_RamdumpRegionInfo)) / sizeof(T_zOss_RamdumpRegion);

+

+    g_zRamdump_ServerInfo.pParsedInfo = (T_zOss_RamdumpRegionInfo *)((CHAR*)g_zRamdump_ServerInfo.pConfigureInfo+size);

+    g_zRamdump_ServerInfo.pParsedInfo->regionNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_PARSED_REGION_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pParsedInfo->regionMaxNum = (size - sizeof(T_zOss_RamdumpRegionInfo)) / sizeof(T_zOss_RamdumpRegion);

+

+    g_zRamdump_ServerInfo.pFileInfo  = (T_zOss_RamdumpFileInfo*)((CHAR*)g_zRamdump_ServerInfo.pParsedInfo + size);

+    g_zRamdump_ServerInfo.pFileInfo->fileNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_FILE_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pFileInfo->fileMaxNum = (size - sizeof(T_zOss_RamdumpFileInfo)) / sizeof(T_zOss_RamdumpFile);

+

+    g_zRamdump_ServerInfo.pAgentFileInfo = (T_zOss_RamdumpFileInfo*)((CHAR*)g_zRamdump_ServerInfo.pFileInfo + size);

+    g_zRamdump_ServerInfo.pAgentFileInfo->fileNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_FILE_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pAgentFileInfo->fileMaxNum = (size - sizeof(T_zOss_RamdumpFileInfo)) / sizeof(T_zOss_RamdumpFile);

+

+    g_zRamdump_ServerInfo.pErrInfo = (T_zOss_RamdumpBuffInfo *)((CHAR*)g_zRamdump_ServerInfo.pAgentFileInfo + size);

+    size = (sizeUnit * ZOSS_RAMDUMP_ERR_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pErrInfo->pBuff = (CHAR*)g_zRamdump_ServerInfo.pErrInfo + sizeof(T_zOss_RamdumpBuffInfo); 

+    g_zRamdump_ServerInfo.pErrInfo->buffLen = size - sizeof(T_zOss_RamdumpBuffInfo);  

+    sprintf( (char *)g_zRamdump_ServerInfo.pErrInfo->pBuff, "%d_s_core: exact error!\n", (int)s_zRamdump_ServerCfgInfo.serverId); 

+

+    g_zRamdump_ServerInfo.pIoReadbuf = (T_zOss_RamdumpBuffInfo *)((CHAR *)g_zRamdump_ServerInfo.pErrInfo + size);

+    size = (sizeUnit * ZOSS_RAMDUMP_IO_READBUF_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pIoReadbuf->pBuff = (CHAR*)g_zRamdump_ServerInfo.pIoReadbuf + sizeof(T_zOss_RamdumpBuffInfo);

+    g_zRamdump_ServerInfo.pIoReadbuf->buffLen = size - sizeof(T_zOss_RamdumpBuffInfo);  

+    

+    g_zRamdump_ServerInfo.pIoWritebuf = (T_zOss_RamdumpBuffInfo *)((CHAR *)g_zRamdump_ServerInfo.pIoReadbuf + size);

+    size = (sizeUnit * ZOSS_RAMDUMP_IO_WRITEBUF_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pIoWritebuf->pBuff = (CHAR*)g_zRamdump_ServerInfo.pIoWritebuf + sizeof(T_zOss_RamdumpBuffInfo);

+    g_zRamdump_ServerInfo.pIoWritebuf->buffLen = size - sizeof(T_zOss_RamdumpBuffInfo); 

+    

+    zOss_AssertExN(((CHAR *)g_zRamdump_ServerInfo.pIoWritebuf + size) <= 

+                    (s_zRamdump_ServerCfgInfo.pRamdumpStartAddr + s_zRamdump_ServerCfgInfo.ramdumpSize));

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ClientIcpInit

+ * ¹¦ÄÜÃèÊö£ºclient ICP ³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ClientIcpInit(VOID)

+{

+    UINT32 cnt       = 0;

+    UINT32 clientNum = sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo);

+

+    if(clientNum != 0)

+    {

+        s_zRamdump_ClientInfo  = (T_zOss_RamdumpClientInfo **)zOss_Malloc(sizeof(VOID *) * clientNum);

+        zOss_Memset(s_zRamdump_ClientInfo, 0, sizeof(VOID *) * clientNum);

+        g_zRamdump_ServerInfo.pWaitMsgFlag= (BOOL *)zOss_Malloc(sizeof(BOOL) * clientNum);

+        zOss_Memset(g_zRamdump_ServerInfo.pWaitMsgFlag, 0, sizeof(BOOL) * clientNum);

+    }

+    

+    for (cnt = 0; cnt < clientNum; cnt++)

+    {         

+        zDrvIcp_RegCallback(g_zRamdump_ClientIcpInfo[cnt].srcModId, g_zRamdump_ClientIcpInfo[cnt].desModId, ramdump_ServerProcessClientMsg, ICP_ISR_CALLBACK); 

+    } 

+    

+#ifdef _USE_ARM1_RAMDUMP

+    ramdump_Arm1Init(); 

+#endif

+

+#ifdef _USE_ZSP_RAMDUMP

+    ramdump_ZspInit();

+#endif

+

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_NotifyClientExceptionOccur

+ * ¹¦ÄÜÃèÊö£ºÍ¨Öªclient·¢ÉúÁËÒì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_NotifyClientExceptionOccur(VOID)

+{

+    UINT32                      cnt     = 0;

+    T_zOss_RamdumpServerMsgInfo msgInfo = {0};

+    

+    for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {        

+        msgInfo.msgType         = ZOSS_RAMDUMP_EXCPT_TYPE;

+        msgInfo.pServerConInfo  = NULL;

+        ramdump_ServerSendMsg(g_zRamdump_ClientIcpInfo, &msgInfo);

+    }

+    

+#ifdef _USE_ARM1_RAMDUMP

+    if (ramdump_CheckArm1InitFinish())

+        ramdump_SendMsgToArm1(ZOSS_RAMDUMP_EXCPT_TYPE);

+#endif

+

+#ifdef _USE_ZSP_RAMDUMP

+    ramdump_SendMsgToZsp();

+#endif

+

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessClientException

+ * ¹¦ÄÜÃèÊö£º´¦ÀíclientÒì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessClientException(VOID)

+{

+    UINT32 cnt          = 0;

+    UINT32 delayTimeLen = 1000;     /* ʱ¼ä´óÔ¼ÔÚ1s×óÓÒ*/

+    

+    for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {

+        if (s_zRamdump_ClientInfo[cnt] != NULL)

+        {

+            g_zRamdump_ServerInfo.pWaitMsgFlag[cnt] = ramdump_delay(delayTimeLen, (volatile UINT32 *)(s_zRamdump_ClientInfo[cnt]->clientFlagBase), ZOSS_RAMDUMP_FLAG_SECOND_VALUE);

+            if (g_zRamdump_ServerInfo.pWaitMsgFlag[cnt])

+            {

+                ramdump_ParseRegionInfo(s_zRamdump_ClientInfo[cnt]->pConfigureInfo, s_zRamdump_ClientInfo[cnt]->pParsedInfo);

+                *(UINT32 *)s_zRamdump_ClientInfo[cnt]->clientFlagBase = ZOSS_RAMDUMP_FLAG_THIRD_VALUE;

+#ifdef _OS_TOS

+                TOS_CACHE_CLEAN_ALL();

+#endif

+                g_zRamdump_ServerInfo.pWaitMsgFlag[cnt] = ramdump_delay(delayTimeLen, (volatile UINT32 *)(s_zRamdump_ClientInfo[cnt]->clientFlagBase), ZOSS_RAMDUMP_FLAG_FOUR_VALUE);            

+            }

+        }

+    }

+

+#ifdef _USE_ARM1_RAMDUMP

+    ramdump_ProcessArm1Exception();

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_AgentIcpInit

+ * ¹¦ÄÜÃèÊö£ºAGENT ICP ×ÊÔ´³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_AgentIcpInit(VOID)

+{

+    UINT32 cnt = 0;

+    

+    for (cnt = 0; cnt < sizeof(s_zRamdump_AgentIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {

+        zDrvIcp_RegCallback(s_zRamdump_AgentIcpInfo[cnt].srcModId, s_zRamdump_AgentIcpInfo[cnt].desModId, ramdump_ServerProcessAgentMsg, ICP_ISR_CALLBACK);     

+    } 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_NotifyAgentExceptionOccur

+ * ¹¦ÄÜÃèÊö£ºÍ¨Öªagent·¢ÉúÁËÒì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_NotifyAgentExceptionOccur(VOID)

+{

+    UINT32                      cnt     = 0;

+    T_zOss_RamdumpServerMsgInfo msgInfo = {0};

+    

+    for (cnt = 0; cnt < sizeof(s_zRamdump_AgentIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {       

+        msgInfo.msgType         = ZOSS_RAMDUMP_EXCPT_TYPE;

+        msgInfo.pServerConInfo  = NULL;

+        ramdump_ServerSendMsg(&s_zRamdump_AgentIcpInfo[cnt], &msgInfo);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_NotifyAgentSaveData

+ * ¹¦ÄÜÃèÊö£ºÍ¨ÖªAGENT¿ÉÒÔ±£´æÊý¾Ý£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_NotifyAgentSaveData(VOID)

+{

+    UINT32                      cnt     = 0;

+    T_zOss_RamdumpServerMsgInfo msgInfo = {0};

+

+    for (cnt = 0; cnt < sizeof(s_zRamdump_AgentIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {        

+        msgInfo.msgType         = ZOSS_RAMDUMP_DATA_READY_TYPE;

+#ifdef _OS_TOS

+        zTos_MmuGetPaddrByVaddr((cyg_uint32)g_zRamdump_ServerInfo.pAgentFileInfo,(cyg_uint32 *)&(msgInfo.pServerConInfo));

+#endif

+        ramdump_ServerSendMsg(&s_zRamdump_AgentIcpInfo[cnt], &msgInfo);

+    }

+}

+

+/*****************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_Main

+ * ¹¦ÄÜÃèÊö£º Ö´ÐÐramdump£¬ÓëPC²à¹¤¾ßÒÔ¼°´úÀí²à½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID ramdump_Main(VOID)

+{

+    ramdump_ParseRegionInfo(g_zRamdump_ServerInfo.pConfigureInfo, g_zRamdump_ServerInfo.pParsedInfo);

+    zOss_RamdumpCreateCmmFile(g_zRamdump_ServerInfo.pCmmInfo);

+    ramdump_NotifyAgentExceptionOccur();

+    ramdump_NotifyClientExceptionOccur();

+    ramdump_ProcessClientException();

+    ramdump_SaveAllFilesInfo();

+    ramdump_NotifyAgentSaveData();

+

+    if (g_zRamdump_Optfunc.ramdump_Process_AftHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_AftHook();

+    }

+    ramdump_TransferData();

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpHandle

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º (IN)

+ *               ser_called:ÎªÕæÊ±,±íʾ´íÎóÀ´×ÔÓû§µ÷ÓÃ,Ϊ¼Ùʱ,±íʾ´íÎóÀ´×ÔÄÚºË

+ *               ecode:´íÎóÂë

+ *               extra:´íÎ󸽼ÓÂë

+ *            (OUT)

+ *               ÎÞ£»

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º ²ÎÊýÔÚTOS²Ù×÷ϵͳÉÏûÓÐʵ¼ÊÒâÒå;

+ **************************************************************************/

+VOID zOss_RamdumpHandle(UINT16 user_called, UINT16 ecode, UINT16 extra)

+{

+    static UINT32  excepNum = 0;

+    ZOSS_INTR      old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr); 

+    if(++excepNum > 1 || !s_zRamdump_InitFlag)          /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */

+    {

+        for ( ; ; ) ;

+    }

+

+    if (zOss_GetExceptResetFlag() != EXCEPT_RESET_ENABLE)

+    {

+        zOss_RamdumpEncodeError(g_zRamdump_ServerInfo.pErrInfo->pBuff, user_called, ecode, extra);

+        /* Ö´ÐÐramdumpÒì³£´¦Àíº¯Êý */

+        ramdump_Main();

+        if(zOss_GetRamdumpResetFlag() == 0)

+        {

+            for ( ; ; ) ;

+        }

+        else

+        {

+            zSys_ExceptReboot(s_zRamdump_ExceptCore.exceptCore);

+        }

+    }

+    else

+    {

+        except_RecordExceptInfo(s_zRamdump_ServerCfgInfo.serverId);

+        zSys_ExceptReboot(s_zRamdump_ExceptCore.exceptCore);

+    }

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_RegionsCmmFile

+ * ¹¦ÄÜÃèÊö£ºT32cmm½Å±¾ÄÚ´æ¶ÎдÈë

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              address: cmm½Å±¾Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º·µ»Ø½Å±¾Ö¸Õ룻

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+CHAR *zOss_RamdumpCreateRegionsCmmFile(CHAR *address)

+{

+    CHAR    fileName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    UINT32  i                                   = 0;  

+   

+    sprintf(fileName, "%d_s_mem.bin", (int)s_zRamdump_ServerCfgInfo.serverId);

+    /* Êä³öramdump ÄÚ´æ¶ÎÎļþ */

+    for (i = 0; i < g_zRamdump_ServerInfo.pParsedInfo->regionNum; i++)

+    {

+        T_zOss_RamdumpRegion *pRegion =  &g_zRamdump_ServerInfo.pParsedInfo->regions[i];   

+        address += sprintf(address, "data.load.binary &%s\\%d_%s %#lx--%#lx /noclear\r\n", ZOSS_RAMDUMP_DIR_NAME, 

+                           (int)i, fileName, pRegion->baseForSelf, pRegion->baseForSelf + pRegion->size - 1);

+    }

+    return address;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpConfigureMem

+ * ¹¦ÄÜÃèÊö£º±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢

+ * ²ÎÊý˵Ã÷£º(IN):

+ *             regionInfo: Êý¾ÝÅäÖÃÇøÓò£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpConfigureMem(T_zOss_RamdumpRegion *regionInfo)

+{

+    T_zOss_RamdumpRegionInfo *pCfgInfo = g_zRamdump_ServerInfo.pConfigureInfo;

+

+    if (regionInfo->size == 0)

+        return;

+    zOss_AssertExN(pCfgInfo->regionNum < pCfgInfo->regionMaxNum);

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForServer =  regionInfo->baseForServer;

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForSelf   =  regionInfo->baseForSelf;

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForCopy   =  regionInfo->baseForCopy;

+    pCfgInfo->regions[pCfgInfo->regionNum].size          =  regionInfo->size;

+    (pCfgInfo->regionNum)++;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpSetOperation

+ * ¹¦ÄÜÃèÊö£ºramdumpÓû§×¢²á½Ó¿Ú£»

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              funcObjPtr: »Øµ÷º¯ÊýµÄÖ¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpSetOperation(T_zOss_RamdumpOpt *funcObjPtr)

+{

+    zOss_AssertExN(funcObjPtr != NULL);

+    

+    if (funcObjPtr->ramdump_Process_PreHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_PreHook = funcObjPtr->ramdump_Process_PreHook;

+    }

+    if (funcObjPtr->ramdump_Process_AftHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_AftHook = funcObjPtr->ramdump_Process_AftHook;

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpInit

+ * ¹¦ÄÜÃèÊö£ºramdump³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ***************************************************************************/

+VOID zOss_RamdumpInit(VOID)

+{

+    ramdump_SetPartition();

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+    ramdump_GetConfigRegion();

+#endif

+    ramdump_ClientIcpInit();

+    ramdump_AgentIcpInit();

+

+#ifdef _USE_CP_USB

+    zOss_RamdumpSetUsbOpt();

+#else

+    zOss_RamdumpSetIcpOpt();

+#endif

+    

+    s_zRamdump_InitFlag = TRUE;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpForceClientException

+ * ¹¦ÄÜÃèÊö£ºÖÆÔìclientËÀ»ú£»

+ * ²ÎÊý˵Ã÷£º(IN)

+ *              coreId: client ID

+ *           (OUT)

+ *              ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º²»ÒªÒªÇóÈ·¶¨ÄǸöclientºËËÀ»úµ«ÊÇÒªÇóÿ¸öclientºË¿ÉÒÔËÀ»ú£»

+ ***************************************************************************/

+UINT32 zOss_RamdumpForceClientException(UINT32 coreId)

+{ 

+#ifdef _USE_ARM1_RAMDUMP

+    if (coreId == ZOSS_RAMDUMP_PHY_COREDID)

+    {

+       ramdump_SendMsgToArm1(ZOSS_RAMDUMP_TEST_EXCPT_TYPE);     

+    }

+    else

+#endif

+    {

+        T_zOss_RamdumpServerMsgInfo msgInfo = {0};

+        

+        zOss_AssertEx(coreId <= sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo), ZOSS_ERROR);

+        msgInfo.msgType         = ZOSS_RAMDUMP_TEST_EXCPT_TYPE;

+        msgInfo.pServerConInfo  = NULL;

+        ramdump_ServerSendMsg(&g_zRamdump_ClientIcpInfo[coreId-1], &msgInfo);

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºOsa_SysErrHndInit

+ * ¹¦ÄÜÃèÊö£ºµØÖ·È«¾Ö±äÁ¿³õʼ»¯,»ñÈ¡ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ

+ *           arm0ºÍarm1ͬ²½»úÖÆ

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º´ò×®£¬ÎªÁ˼æÈÝose¡¢cskyµÈramdump¹¦ÄÜ£»

+ ***************************************************************************/

+VOID Osa_SysErrHndInit(VOID)

+{

+

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpSetIoOpt

+ * ¹¦ÄÜÃèÊö£º ÉèÖÃramdump Io ͨµÀ£»

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpSetIoOpt(T_zOss_RamdumpIoOpt hook)

+{

+    g_zRamdumpIoOpt.init    = hook.init;

+    g_zRamdumpIoOpt.read    = hook.read;

+    g_zRamdumpIoOpt.write   = hook.write;

+    g_zRamdumpIoOpt.finish  = hook.finish;    

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpGetParsedRegions

+ * ¹¦ÄÜÃèÊö£º»ñÈ¡MMU½âÎöÇøÓò

+ * 

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º½öΪT32 CMM½Å±¾Ê¹Óã»

+ ***************************************************************************/

+VOID zOss_RamdumpGetParsedRegions(VOID)

+{

+    if(s_zRamdump_InitFlag)

+    {

+        g_zRamdump_ServerInfo.pParsedInfo->regionNum = 0;

+        ramdump_ParseRegionInfo(g_zRamdump_ServerInfo.pConfigureInfo, g_zRamdump_ServerInfo.pParsedInfo);

+        for ( ; ; ) ;

+    }

+    else

+    {

+        for ( ; ; ) ;    

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramlog.c b/cp/ps/plat/src/oss/sup/src/sup_ramlog.c
new file mode 100644
index 0000000..84e74f2
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramlog.c
@@ -0,0 +1,135 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : Ramlog.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ³õʼ»¯´òÓ¡Îļþ

+* ×÷    Õß : gongyi

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2008-04-30

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_RAMLOG_MAX_LEN         59

+#define ZOSS_RAMLOG_MAX_ENTRIES     30

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT8 is_use;

+    CHAR Ram[ZOSS_RAMLOG_MAX_LEN+1];

+}T_Comm_Ram;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static T_Comm_Ram gCommRam[ZOSS_RAMLOG_MAX_ENTRIES] = {0};

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RamLog

+* ¹¦ÄÜÃèÊö£º¼Ç¼³õʼ»¯ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) 

+            rambuf:   ´òÓ¡µ½RAMLOGµÄÊý¾Ý

+            restrict: Êý¾Ý¸ñʽ»¯ÀàÐÍ

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºrambuf»º³åÇøµÄ×Ö·û³¤¶È²»ÄÜ´óÓÚZOSS_RAMLOG_MAX_LEN¸ö×Ö½Ú£¬·ñÔòÖ±½Ó·µ»Ø

+**************************************************************************/

+VOID zOss_RamLog( CHAR * rambuf, UINT32 restric ) 

+{

+    UINT32  i    = 0;

+    

+    if (strlen((char *)rambuf) > ZOSS_RAMLOG_MAX_LEN)

+    {

+        return;

+    }

+    

+    for (i = 0; i < ZOSS_RAMLOG_MAX_ENTRIES; i++)

+    {

+        if (gCommRam[i].is_use == 0)

+        {

+            SINT32 ret = sprintf((char *)gCommRam[i].Ram, (char *)rambuf, restric);

+            if (ret <= 0)

+            {

+                break;

+            }

+            

+            gCommRam[i].is_use = 1;

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RamPrintf

+* ¹¦ÄÜÃèÊö£º´òÓ¡³õʼ»¯ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) 

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚϵͳ³õʼ»¯Íê³Éºóµ÷ÓÃ

+**************************************************************************/

+VOID zOss_RamPrintf(VOID)

+{

+    UINT32   i = 0;

+    

+    for( ; i < ZOSS_RAMLOG_MAX_ENTRIES; i++)

+    {

+        if(gCommRam[i].is_use == 0)

+        {

+            return;

+        }

+        

+        zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "%s", gCommRam[i].Ram);

+    }

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell.c b/cp/ps/plat/src/oss/sup/src/sup_shell.c
new file mode 100755
index 0000000..53f9127
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell.c
@@ -0,0 +1,790 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : shell·½°¸ÊµÏÖÎļþ

+* ×÷    Õß : ÖܹúÆÂ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2008-04-21

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell_cmd.h"

+#include "drv_api.h"

+#include "commgt_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifndef _OS_WIN

+#ifndef stricmp

+#define stricmp strcasecmp

+#endif

+

+#ifndef strnicmp

+#define strnicmp strncasecmp

+#endif

+#endif

+

+#define EV_ZOSS_SHELL_COMM_CMD  1000

+#define SHELL_MAX_DYNAMIC_CMD   100

+

+#define SHELL_ISNUMBER(x)       ((x) >= '0' && (x) <= '9')

+#define SHELL_ISHEXNUMBER(x)    (SHELL_ISNUMBER((x)) || ((x) >= 'a' && (x) <= 'f') || ((x) >= 'A' && (x) <= 'F'))

+#define SHELL_ISIDENTIFIER(x)   (SHELL_ISNUMBER((x)) || ((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z') || (x) == '_')

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+VOID Shell_TaskEntry(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data);

+

+static SINT32 Shell_findCmd(CHAR *cmd);

+static VOID ShellHelpProcess(T_Shell_CommandMessage *CmdMsg);

+static UINT32 Shell_FindDynamicCmd(const CHAR *cmd);

+static VOID Shell_help(T_Shell_CommandMessage *pCmdMsg);

+static VOID Shell_MessageDivide(T_Shell_CommandMessage *msg);

+static UINT32 Shell_Process(T_Shell_CommandMessage *CmdMsg);

+static VOID Shell_CommCallBack(UINT32 msgID, const UINT8 *msg, UINT16 msgLen);

+static UINT32 Shell_ParseMessageFromCommData(T_Shell_CommandMessage *CmdMsg, const UINT8 *buf, UINT32 bufLen);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/ 

+ZOSS_THREAD_ID  gShellTaskID                = NULL;     /* È«¾ÖµÄshell ÈÎÎñID   */

+static UINT32   gShell_WintracePrintFlag    = 1;

+

+/* ÃüÁî±í */

+static T_Shell_Cmd gShell_Cmds[] =

+{

+    /*ÃüÁîÃû³Æ                      Èë¿Úº¯Êý                                      ˵Ã÷                                    */

+    

+    {(CHAR *)"help",                (Shell_Func)Shell_help,                       (CHAR *)"ÌṩSHELLÃüÁîµÄ°ïÖúÐÅÏ¢"       },

+#ifdef _USE_OSS_SHELL_MISC

+    /* »ù±¾ÃüÁî */

+    {(CHAR *)"bootInfo",            (Shell_Func)OSS_DbgShowBootInfo,              (CHAR *)"ÏÔʾÆô¶¯ÐÅÏ¢"                  },

+    {(CHAR *)"threadSuspend",       (Shell_Func)OSS_DbgSuspendThread,             (CHAR *)"¹ÒÆðÏß³Ì"                      },

+    {(CHAR *)"threadResume",        (Shell_Func)OSS_DbgResumeThread,              (CHAR *)"»Ö¸´Ïß³Ì"                      },

+    {(CHAR *)"setThreadPrior",      (Shell_Func)OSS_DbgSetThreadPri,              (CHAR *)"¸Ä±äÏß³ÌÓÅÏȼ¶"                },

+    {(CHAR *)"showMsg",             (Shell_Func)OSS_DbgShowMsg,                   (CHAR *)"ÏÔʾ/¹Ø±ÕÏûÏ¢¸ú×Ù"             },

+    {(CHAR *)"showReg",             (Shell_Func)OSS_DbgShowRegInfo,               (CHAR *)"»ñÈ¡¼Ä´æÆ÷ÐÅÏ¢"                },

+    {(CHAR *)"ramdumpConfigRegion", (Shell_Func)OSS_DbgRamdumpConfigRegionInfo,   (CHAR *)"ÉèÖÃÐèÒªµ¼³öµÄÄÚ´æÇøÓò"        },

+    {(CHAR *)"showProcSig",         (Shell_Func)Shell_ShowProcSig,                (CHAR *)"ÏÔʾÏß³ÌsignalʹÓÃÇé¿ö"        },

+    {(CHAR *)"forceRamdump",        (Shell_Func)OSA_ForceRamdump,                 (CHAR *)"ÖÆÔìÒì³£Ç¿ÖÆramdump"           },

+    {(CHAR *)"reboot",              (Shell_Func)OSS_DbgReboot,                    (CHAR *)"ÖØÆô"                          },

+    {(CHAR *)"setWintracePrint",    (Shell_Func)OSS_DbgSetWintracePrintFlag,      (CHAR *)"´ò¿ª¹Ø±Õwintrace´òÓ¡"          },

+    {(CHAR *)"trace",               (Shell_Func)OSA_DbgTrace,                     (CHAR *)"²é¿´¸ú×ÙÄ£¿éÐÅÏ¢"              },

+    {(CHAR *)"profile",             (Shell_Func)OSS_DbgProfile,                   (CHAR *)"½«gmon.outдÈëÎļþϵͳ"        },

+    {(CHAR *)"openTraceSwitch",     (Shell_Func)OSS_OpenTraceSwitch,              (CHAR *)"´ò¿ªÖжϺÍÏ̵߳ĸú×ÙÐÅÏ¢¿ª¹Ø"  },

+    {(CHAR *)"setAssertLevel",      (Shell_Func)OSS_SetAssertLevel,               (CHAR *)"ÉèÖÃÄں˶ÏÑÔµ÷ÊÔ¼¶±ð"          },

+#endif

+#ifdef _USE_OSS_SHELL_MEM

+    /* ÄÚ´æ¹Û²ì */

+    {(CHAR *)"mem",                 (Shell_Func)OSS_DbgShowMemInfo,               (CHAR *)"´òӡϵͳÄÚ´æÐÅÏ¢"              }, 

+    {(CHAR *)"ub",                  (Shell_Func)OSS_DbgShowUbInfo,                (CHAR *)"´òӡϵͳÄÚ´æ´æ³ØÐÅÏ¢"          },

+    {(CHAR *)"threadUB",            (Shell_Func)OSS_DbgShowThreadUbInfo,          (CHAR *)"´òÓ¡Ö¸¶¨Ï̵߳ÄUBÐÅÏ¢"          },

+    {(CHAR *)"taskUB",              (Shell_Func)OSS_DbgShowTaskUbInfo,            (CHAR *)"´òÓ¡Ö¸¶¨ÈÎÎñµÄUBÐÅÏ¢"          },

+    {(CHAR *)"showPoolInfo",        (Shell_Func)Shell_ShowPoolInfo,               (CHAR *)"ÏÔʾpoolÐÅÏ¢"                  },

+    {(CHAR *)"opendbgub",           (Shell_Func)OSA_SetUBDbgSwitch,               (CHAR *)"´ò¿ªubµ÷ÊÔ¿ª¹Ø"                },

+    {(CHAR *)"checkUb",             (Shell_Func)OSA_DbgUbInfo,                    (CHAR *)"¼ì²éubÐÅÏ¢"                    },

+    {(CHAR *)"showMem",             (Shell_Func)OSS_DbgGetMem,                    (CHAR *)"²é¿´ÄÚ´æÐÅÏ¢"                  },

+    {(CHAR *)"setMem",              (Shell_Func)OSS_DbgSetMem,                    (CHAR *)"ÐÞ¸ÄÄÚ´æÐÅÏ¢"                  },

+    {(CHAR *)"checkMem",            (Shell_Func)OSA_DbgMemInfo,                   (CHAR *)"¼ì²émemµÄʹÓÃÐÅÏ¢(й¶ºÍÔ½½ç)" },

+    {(CHAR *)"checkLeakMem",        (Shell_Func)OSA_DbgMemTimeLeakInfo,           (CHAR *)"¼ì²éµÄij¸öʱ¼ä¶ÎMemµÄй¶ÐÅÏ¢" },

+#endif

+#ifdef _USE_OSS_SHELL_THREAD

+    /* µ÷¶ÈͨѶ */

+    {(CHAR *)"threadInfo",          (Shell_Func)OSS_DbgShowThreadInfo,            (CHAR *)"²é¿´Ïß³ÌÐÅÏ¢"                  },

+    {(CHAR *)"taskInfo",            (Shell_Func)OSS_DbgShowTaskInfo,              (CHAR *)"´òӡϵͳËùÓÐÈÎÎñÐÅÏ¢"          },

+    {(CHAR *)"threadCpu",           (Shell_Func)OSS_DbgDisplayThreadExecInfo,     (CHAR *)"ÏÔʾij¸öÏ̵߳ÄÖ´ÐÐʱ¼ä"        },

+    {(CHAR *)"threadsCpu",          (Shell_Func)OSS_DbgDisplayThreadsExecInfo,    (CHAR *)"ÏÔʾËùÓÐÏ̵߳ÄÖ´ÐÐʱ¼ä"        },

+    {(CHAR *)"threadSwapflag",      (Shell_Func)OSS_DbgThreadSetFlag,             (CHAR *)"¹Ø±Õ/´ò¿ª¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹Ø"  },

+    {(CHAR *)"syscpu",              (Shell_Func)OSS_DbgGetSysCPU,                 (CHAR *)"»ñµÃϵͳCPUÕ¼ÓÃÂÊ"             },

+    {(CHAR *)"setUpdateCpuTime",    (Shell_Func)OSS_DbgSetUpdateCPUTime,          (CHAR *)"ÉèÖÃCPUʹÓÃÂÊË¢ÐÂʱ¼ä"         },

+    {(CHAR *)"startDaemonTask",     (Shell_Func)OSS_StartDaemonTask,              (CHAR *)"Æô¶¯ÈÎÎñËÀÑ­»·¼à²â"            },    

+#endif

+

+#ifdef _USE_OSS_SHELL_PSM

+#ifdef _USE_PSM

+    {(CHAR *)"psminfo",             (Shell_Func)OSS_PsmTraceInfo,                 (CHAR *)"Êä³öpsmµ÷ÊÔÐÅÏ¢"               },

+#ifdef _USE_CPU_DFM

+    {(CHAR *)"dfmifno",             (Shell_Func)OSS_DfmTraceInfo,                 (CHAR *)"Êä³ödfmµ÷ÊÔÐÅÏ¢"               },

+#endif

+#endif

+#endif

+};

+

+static T_Shell_Cmd gShell_DynamicCmds[SHELL_MAX_DYNAMIC_CMD] = { 0 };

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_TaskEntry

+* ¹¦ÄÜÃèÊö£ºSHELLÈÎÎñÈë¿Úº¯Êý

+* ²ÎÊý˵Ã÷£º

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Shell_TaskEntry(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data)

+{

+    UINT32 status = ZOSS_ERROR;

+    

+    switch (state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch (msg_id)

+            {

+            case EV_INIT:

+                {

+                    break;

+                }

+            case EV_POWERON:

+                {

+                    gShellTaskID = zOss_GetSelfTaskID();

+                    /* ÏòͨѶģ¿é×¢²áµ±Ç°×ÓÄ£¿é */

+                    #ifdef _USE_WINCOMM_SERVER

+                    status = zTools_CommReg(SUBMDL_SHELL, ZDRV_DEV_USBSIO_2, (ModuleFunc)Shell_CommCallBack);

+                    #else

+                    status = zOss_CommReg(SUBMDL_SHELL, ZDRV_DEV_USBSIO_2, Shell_CommCallBack);

+                    #endif

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_ASSERT(0);

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SHELL_POWERON:Fail to register submodule!");

+                        break;

+                    }

+                    status = zOss_SetState(ZOSS_STATUS_WORK);

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_ASSERT(0);

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SHELL_POWERON:Fail to set state!");

+                        break;

+                    }

+                    

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SHELL:Receive a invalid message");

+                    break;

+                }

+            }

+            break;

+        }

+    case ZOSS_STATUS_WORK:

+        {

+            switch (msg_id)

+            {

+            case EV_ZOSS_SHELL_COMM_CMD:

+                {

+                    T_Shell_CommandMessage cmdMsg = {0};

+                    

+                    /* ´Ó½ÓÊÕµ½µÄÊý¾Ý·ÖÀë³öÃüÁî */

+                    if (ZOSS_SUCCESS == Shell_ParseMessageFromCommData(&cmdMsg, (UINT8 *)buf, msg_len))

+                    {

+                        /* ¸ù¾ÝÃüÁîÖ´ÐвÙ×÷ */

+                        Shell_MessageDivide(&cmdMsg);

+                    }

+                    

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SHELL:Receive a invalid message");

+                    break;

+                }

+            }    

+            break;

+        }

+    default:

+        break;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_AddShellCmd

+* ¹¦ÄÜÃèÊö£ºÌí¼Ó¶¯Ì¬ÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:ÃüÁî×Ö·û´®,²»ÄÜΪ¿Õ

+            func:ÃüÁîÖ´Ðк¯Êý,²»ÄÜΪNULL

+            description:ÃüÁîÃèÊö,¿ÉÒÔΪNULL

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¶à´Îµ÷Óú¯Êý,ÏàͬµÄcmd_name,ºóÃæµ÷ÓõĻḲ¸ÇÇ°Ãæµ÷ÓõÄ

+**************************************************************************/

+UINT32 zOss_AddShellCmd(const CHAR *cmd_name, const Shell_Func func, const CHAR *description)

+{

+    UINT32 i            = 0;

+    UINT32 name_size    = 0;

+    UINT32 desc_size    = 0;

+    

+    zOss_AssertEx((NULL != cmd_name) && (func != NULL), ZOSS_ERROR);

+    

+    i = Shell_FindDynamicCmd(cmd_name);

+    zOss_AssertEx(i < SHELL_MAX_DYNAMIC_CMD, ZOSS_ERROR);

+    

+    name_size = strlen((char *)cmd_name);

+    if (NULL != description)

+    {

+        desc_size = strlen((char *)description);

+    }

+    

+    if (NULL != gShell_DynamicCmds[i].cmd)

+    {

+        zOss_Free(gShell_DynamicCmds[i].cmd);

+        zOss_Free(gShell_DynamicCmds[i].desc);

+        gShell_DynamicCmds[i].cmd = NULL;

+        gShell_DynamicCmds[i].func = NULL;

+        gShell_DynamicCmds[i].desc = NULL;

+    }

+    

+    gShell_DynamicCmds[i].cmd = (CHAR *)zOss_Malloc(name_size + 1);

+    if (NULL == gShell_DynamicCmds[i].cmd)

+    {

+        return ZOSS_ERROR;

+    }

+    zOss_Memset(gShell_DynamicCmds[i].cmd, 0, name_size + 1);

+    zOss_Memcpy(gShell_DynamicCmds[i].cmd, cmd_name, name_size);

+    

+    gShell_DynamicCmds[i].desc = (CHAR *)zOss_Malloc(desc_size + 1);    /* Èç¹ûdescΪNULL,ÉêÇë1¸ö×Ö·û¿Õ¼ä */

+    if (NULL == gShell_DynamicCmds[i].desc)

+    {

+        zOss_Free(gShell_DynamicCmds[i].cmd);

+        gShell_DynamicCmds[i].cmd = NULL;

+        return ZOSS_ERROR;

+    }

+    zOss_Memset(gShell_DynamicCmds[i].desc, 0, desc_size + 1);

+    if (0 != desc_size)

+    {

+        zOss_Memcpy(gShell_DynamicCmds[i].desc, description, desc_size);

+    }

+    

+    gShell_DynamicCmds[i].func = func;

+    

+    return ZOSS_SUCCESS;

+}

+

+UINT32 Shell_GetWintracePrintFlag(VOID)

+{

+    return gShell_WintracePrintFlag;

+}

+

+UINT32 Shell_SetPrintFlag(UINT32 WintraceFlag)

+{

+    zOss_AssertEx(WintraceFlag < 2 , ZOSS_ERROR);

+

+    gShell_WintracePrintFlag = WintraceFlag;     

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_StrisNumber

+* ¹¦ÄÜÃèÊö£º×Ö·û´®ÊÇ·ñÈ«²¿ÊÇÊý×Ö

+* ²ÎÊý˵Ã÷£º(IN)

+            pStr:×Ö·û´®Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º0±íʾȫ²¿ÊÇÊý×Ö£¬-1±íʾ°üº¬·ÇÊý×Ö

+* ÆäËü˵Ã÷£ºÖ§³Ö10½øÖƺÍ16½øÖÆ£¬16½øÖÆÒªÇó0x»ò0XµÄǰ׺

+**************************************************************************/

+SINT32 Shell_StrisNumber(const CHAR *pStr)

+{

+    const CHAR *tmp = NULL;

+    

+    zOss_AssertEx(pStr != NULL, (SINT32)ZOSS_ERROR);

+    tmp = pStr;

+    if (0 == strnicmp((char *)tmp, "0x", 2))

+    {

+        tmp = pStr + 2;

+        while ('\0' != *tmp)

+        {

+            if (!SHELL_ISHEXNUMBER(*tmp))

+            {

+                return -1;

+            }

+            tmp++;

+        }

+    }

+    else

+    {

+        while ('\0' != *tmp)

+        {

+            if (!SHELL_ISNUMBER(*tmp))

+            {

+                return -1;

+            }

+            tmp++;

+        }

+    }

+    return 0;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_isIdentifier

+* ¹¦ÄÜÃèÊö£º×Ö·û´®ÊÇ·ñÈ«²¿ÊÇÊý×Ö,×Öĸ»òÏ»®ÏßµÄ×éºÏ

+* ²ÎÊý˵Ã÷£º(IN)

+            Str:×Ö·û´®Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º0±íʾȫ²¿ÊÇÊý×Ö,×Öĸ»òÏ»®Ïß×éºÏ£¬-1±íʾ°üº¬·Ç·¨×Ö·û

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+SINT32 Shell_isIdentifier(const CHAR *pStr)

+{

+    const CHAR *tmp = NULL;

+        

+    zOss_AssertEx(pStr != NULL, (SINT32)ZOSS_ERROR);

+    tmp = pStr;

+

+    while ('\0' != *tmp)

+    {

+        if (!SHELL_ISIDENTIFIER(*tmp))

+        {

+            return -1;

+        }

+        tmp++;

+    }

+    return 0;

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_CommCallBack

+* ¹¦ÄÜÃèÊö£ºShell´úÀí»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            msgID:  ÏûÏ¢ID

+            msg:    ÊÕµ½µÄÏûÏ¢

+            msgLen: ÊÕµ½µÄÏûÏ¢³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÎÞ

+**************************************************************************/

+static VOID Shell_CommCallBack(UINT32 msgID, const UINT8 *msg, UINT16 msgLen)

+{

+    UINT32  RetCode         = 0;

+    UINT8   *pCmdMsgBuff    = NULL;

+    

+    if (msgLen == 0 || msg == NULL)

+    {

+        return;

+    }

+    

+    pCmdMsgBuff = (UINT8 *)zOss_GetUB(msgLen);           /* È¥µôÏûϢͷ */

+    if (NULL == pCmdMsgBuff)

+    {

+        return;

+    }

+    zOss_Memcpy((VOID *)pCmdMsgBuff, msg, msgLen);

+    RetCode = zOss_TaskSend(EV_ZOSS_SHELL_COMM_CMD, pCmdMsgBuff, msgLen, gShellTaskID);   

+    zOss_ASSERT(RetCode == ZOSS_SUCCESS);

+    

+    RetCode = zOss_RetUB(pCmdMsgBuff);

+    zOss_ASSERT(RetCode == ZOSS_SUCCESS);

+}

+

+/***************************************************************************

+* º¯ÊýÃû³Æ£ºShell_ParseMessageFromCommData

+* ¹¦ÄÜÃèÊö£º´ÓÊÕµ½µÄÊý¾ÝBUFFERÖнâÎö³öÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            uf:Êý¾Ý»º³åÇø

+            ufLen:Êý¾Ý»º³åÇøµÄ³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£ºÃüÁîµÄ½á¹¹

+* ÆäËü˵Ã÷£ºÄÚ²¿½Ó¿Ú

+*****************************************************************************/

+static UINT32 Shell_ParseMessageFromCommData(T_Shell_CommandMessage *CmdMsg, const UINT8 *buf, UINT32 bufLen)

+{

+    UINT32      i           = 0;

+    UINT16      offset      = 0;

+    UINT32      strLen      = 0;

+    const CHAR  *pStr       = NULL;

+    

+    zOss_AssertEx(NULL != CmdMsg && NULL != buf, ZOSS_ERROR);

+    

+    /* ÃüÁî³õʼ»¯ */

+    zOss_Memset(CmdMsg, 0, sizeof(T_Shell_CommandMessage));

+    CmdMsg->paraCount = (UINT32)buf[0];

+    offset = 1;

+    pStr = (CHAR *)&buf[offset];

+    strLen = strlen((char *)pStr);

+    strncpy((char *)CmdMsg->cmd, (char *)pStr, strLen > SHELL_CMD_LENGTH ? SHELL_CMD_LENGTH : strLen);  /* »ñÈ¡ÃüÁî */

+    

+    /* ·ÖÎö²ÎÊý */

+    offset += (UINT16)strLen + 1;      /* Ìø¹ýÃüÁ¶È£¬+1ÊÇÔÙÌø¹ý'\0' */

+    while ((offset < bufLen) && (i < SHELL_CMD_PARAM_NUM))

+    {

+        pStr = (CHAR *)&buf[offset];

+        strLen = strlen((char *)pStr);

+        strncpy((char *)CmdMsg->para[i], (char *)pStr, strLen > SHELL_CMD_PARAM_LENGTH ? SHELL_CMD_PARAM_LENGTH : strLen); /* »ñÈ¡²ÎÊý */

+        offset += (UINT16)strLen + 1;    /* +1ÊÇÔÙÌø¹ý'\0' */

+        i++;

+    }

+    return ZOSS_SUCCESS;

+}

+

+/***************************************************************************

+* º¯ÊýÃû³Æ£ºShell_MessageDivide

+* ¹¦ÄÜÃèÊö£ºÃüÁî·Ö·¢µ½:TESTÄ£¿é»òSHELLÄ£¿é

+* ²ÎÊý˵Ã÷£º(IN)

+            msg£º½âÎö³öµÄÏûÏ¢½á¹¹Ìå

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÄÚ²¿½Ó¿Ú

+*****************************************************************************/

+static VOID Shell_MessageDivide(T_Shell_CommandMessage *msg)

+{

+    zOss_AssertExN(NULL != msg);

+    

+    if (ZOSS_ERROR == Shell_Process(msg))       

+    {

+        ShellHelpProcess(msg);

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_Process

+* ¹¦ÄÜÃèÊö£ºShellÃüÁî´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+            CmdMsg:ÃüÁî½á¹¹Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£ºÕÒµ½ÃüÁî²¢Ö´Ðзµ»ØZOSS_SUCCESS£¬ÕÒ²»µ½ÃüÁî·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Shell_Process(T_Shell_CommandMessage *CmdMsg)

+{

+    SINT32  cmd_count   = 0;

+    SINT32  i           = 0;

+    

+    zOss_AssertEx(CmdMsg != NULL, ZOSS_ERROR);

+    

+    cmd_count = sizeof(gShell_Cmds) / sizeof(gShell_Cmds[0]);

+    i = Shell_findCmd(CmdMsg->cmd);     /* ²éÕÒÆ¥ÅäÃüÁî */

+    

+    if (i >= 0 && i < cmd_count)

+    {

+        gShell_Cmds[i].func(CmdMsg);    /* Ö´ÐÐÃüÁî     */

+        return ZOSS_SUCCESS;

+    }

+    

+    i = (SINT32)Shell_FindDynamicCmd(CmdMsg->cmd);        

+    if (i < SHELL_MAX_DYNAMIC_CMD)

+    {

+        if (NULL != gShell_DynamicCmds[i].cmd)

+        {

+            gShell_DynamicCmds[i].func(CmdMsg);

+            return ZOSS_SUCCESS;

+        }

+    }

+    

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_findCmd

+* ¹¦ÄÜÃèÊö£º²éÕÒÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:ÃüÁî×Ö·û´®

+            (OUT)

+* ·µ »Ø Öµ£ºÕÒµ½ÁË·µ»ØÔÚÃüÁî±íµÄλÖã¬ÕÒ²»µ½·µ»Ø-1

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static SINT32 Shell_findCmd(CHAR *cmd)

+{

+    SINT32 cmd_count    = 0;

+    SINT32 i            = 0;

+    

+    zOss_AssertEx(cmd != NULL, -1);

+    cmd_count = sizeof(gShell_Cmds) / sizeof(gShell_Cmds[0]);

+    for (i = 0; i < cmd_count; i++)

+    {

+        if (0 == stricmp((char *)cmd, (char *)gShell_Cmds[i].cmd))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-60s ", "***********************************************************************");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s %s", "* ÃüÁÄÜ:", gShell_Cmds[i].desc);

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s ", "*ƽ̨֧³ÅÌṩ¸Ã¹¦ÄÜ");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-60s ", "***********************************************************************");

+            return i;

+        }

+    }

+    return -1;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_FindDynamicCmd

+* ¹¦ÄÜÃèÊö£º²éÕÒ¶¯Ì¬ÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:ÃüÁî×Ö·û´®

+            (OUT)

+* ·µ »Ø Öµ£ºÕÒµ½ÁË·µ»ØÔÚÃüÁî±íµÄλÖã¬ÕÒ²»µ½·µ»ØÒ»¸ö¿ÕµÄλÖÃ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Shell_FindDynamicCmd(const CHAR *cmd)

+{

+    UINT32 i = 0;

+    

+    zOss_AssertEx(NULL != cmd, 0);

+    for (i = 0; i < SHELL_MAX_DYNAMIC_CMD; i++)

+    {

+        if (NULL != gShell_DynamicCmds[i].cmd)

+        {

+            if (0 == stricmp((char *)cmd, (char *)gShell_DynamicCmds[i].cmd))

+            {

+                return i;

+            }

+        }

+        else

+        {

+            return i;

+        }

+    }

+    return i;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShellFindStaticCmd

+* ¹¦ÄÜÃèÊö£º²éÕÒ¾²Ì¬µÄshellÃüÁî²¢Ìṩ°ïÖúÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:shellÃüÁî

+            cmdLen:shellÃüÁîµÄ³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 ShellHelpFindStaticCmd(CHAR *cmd, UINT32 cmdLen)

+{

+    UINT32  cmd_count       = sizeof(gShell_Cmds) / sizeof(gShell_Cmds[0]);

+    UINT32  i               = 0;

+    BOOL    cmdIsDisplay    = TRUE;

+

+    zOss_AssertEx(cmd != NULL && cmdLen != 0, ZOSS_ERROR);

+    for (i = 0; i < cmd_count; i++)

+    {

+        if (0 == strnicmp((char *)cmd, (char *)gShell_Cmds[i].cmd, (unsigned int)cmdLen))

+        {

+            if (cmdIsDisplay)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÃüÁî: %s ûÓÐÕÒµ½!", cmd);

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s¿ªÍ·µÄÃüÁîÈçÏÂ:", cmd);

+                cmdIsDisplay = FALSE;

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_Cmds[i].cmd, gShell_Cmds[i].desc);

+        }

+    }

+    if (cmdIsDisplay)

+    {

+        return ZOSS_ERROR;

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShellHelpFindDynamicCmd

+* ¹¦ÄÜÃèÊö£º²éÕÒ¶¯Ì¬shellÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:shellÃüÁî

+            cmdLen:shellÃüÁîµÄ³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 ShellHelpFindDynamicCmd(CHAR *cmd, UINT32 cmdLen)

+{

+    UINT32  i               = 0;

+    BOOL    cmdIsDisplay    = TRUE;

+   

+    zOss_AssertEx(cmd != NULL && cmdLen != 0, ZOSS_ERROR);

+    for (i = 0; i < SHELL_MAX_DYNAMIC_CMD && NULL != gShell_DynamicCmds[i].cmd; i++)

+    {

+        if (0 == strnicmp((char *)cmd, (char *)gShell_DynamicCmds[i].cmd, (unsigned int)cmdLen))

+        {

+            if (cmdIsDisplay)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÃüÁî: %s ûÓÐÕÒµ½!", cmd);

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s¿ªÍ·µÄÃüÁîÈçÏÂ:", cmd);

+                cmdIsDisplay = FALSE;

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_DynamicCmds[i].cmd, gShell_DynamicCmds[i].desc);

+        }

+    }

+    if (cmdIsDisplay)

+    {

+        return ZOSS_ERROR;

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShellHelpProcess

+* ¹¦ÄÜÃèÊö£ºµ±Ã»ÓÐÕÒµ½ÏàÓ¦µÄshellÃüÁîÌṩһЩ°ïÖúÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:ÃüÁî½á¹¹Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID ShellHelpProcess(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32  ret1    = ZOSS_ERROR;

+    UINT32  ret2    = ZOSS_ERROR;

+    CHAR    *cmd    = NULL;

+    UINT32  cmp_len = 0; 

+

+    zOss_AssertExN(CmdMsg != NULL);

+    cmd = CmdMsg->cmd;

+    cmp_len = strlen((char *)cmd);

+    ret1 = ShellHelpFindStaticCmd(cmd, cmp_len);

+    ret2 = ShellHelpFindDynamicCmd(cmd, cmp_len);

+    if ((ZOSS_ERROR == ret1) && (ZOSS_ERROR == ret2))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t%sÃüÁî²»ÊÇshellÃüÁî!", cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÊäÈëhelpÁгöËùÓÐÃüÁî");

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºshell_help

+* ¹¦ÄÜÃèÊö£ºShell helpÃüÁî´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+            pCmdMsg:ÃüÁî½á¹¹Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_help(T_Shell_CommandMessage *pCmdMsg)

+{

+    SINT32  cmdCount    = sizeof(gShell_Cmds) / sizeof(gShell_Cmds[0]);

+    SINT32  i           = 0;

+    CHAR    *cmd        = NULL;

+    SINT32  cmpLen      = 0;

+    UINT32  ret         = 0;

+    

+    zOss_AssertExN(pCmdMsg != NULL);

+    if (1 != pCmdMsg->paraCount)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓйØÃüÁîµÄÏêϸÐÅÏ¢£¬Çë¼üÈëhelp º¯ÊýÃû");

+        

+        for (i = 0; i < cmdCount; i++)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_Cmds[i].cmd, gShell_Cmds[i].desc);

+        }

+        for (i = 0; i < SHELL_MAX_DYNAMIC_CMD; i++)

+        {

+            if (NULL != gShell_DynamicCmds[i].cmd)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_DynamicCmds[i].cmd, gShell_DynamicCmds[i].desc);

+            }

+            else

+            {

+                break;

+            }

+        }

+    }

+    else

+    {

+        cmd = pCmdMsg->para[0];

+        if (0 == strcmp((char *)cmd, "help"))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\thelp:°ïÖú\n\t help [command]\n\t hÓëhelpͬÒå");

+            return;

+        }

+        

+        i = Shell_findCmd(cmd);

+        if (i >= 0 && i < cmdCount)

+        {

+            cmpLen = strlen(pCmdMsg->para[0]);

+            zOss_Memcpy((char *)pCmdMsg->cmd, pCmdMsg->para[0],cmpLen);

+            pCmdMsg->cmd[cmpLen] = '\0';

+            strncpy((char *)pCmdMsg->para[0], "help", SHELL_CMD_PARAM_LENGTH);

+            pCmdMsg->para[0][SHELL_CMD_PARAM_LENGTH] = '\0';            

+            gShell_Cmds[i].func(pCmdMsg);

+            return;

+        }

+        i = (long)Shell_FindDynamicCmd(cmd);

+        if (i >= SHELL_MAX_DYNAMIC_CMD)

+            return;

+

+        if (NULL != gShell_DynamicCmds[i].cmd)

+        {

+            cmpLen =  strlen(pCmdMsg->para[0]);

+            zOss_Memcpy((char *)pCmdMsg->cmd, pCmdMsg->para[0],cmpLen);

+            pCmdMsg->cmd[cmpLen] = '\0';

+            strncpy((char *)pCmdMsg->para[0], "help", SHELL_CMD_PARAM_LENGTH);

+            pCmdMsg->para[0][SHELL_CMD_PARAM_LENGTH] = '\0';

+            gShell_DynamicCmds[i].func(pCmdMsg);

+            return;

+        }

+        

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÃüÁî: %s ûÓÐÕÒµ½!", cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s¿ªÍ·µÄÃüÁîÈçÏÂ:", cmd);

+        cmpLen = (long)strlen((char *)cmd);

+        ret = ZOSS_ERROR;

+        for (i = 0; i < cmdCount; i++)

+        {

+            if (0 == strnicmp((char *)cmd, (char *)gShell_Cmds[i].cmd, ( unsigned int )cmpLen))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_Cmds[i].cmd, gShell_Cmds[i].desc);

+                ret = ZOSS_SUCCESS;

+            }

+        }

+        for (i = 0; i < SHELL_MAX_DYNAMIC_CMD; i++)

+        {

+            if (NULL != gShell_DynamicCmds[i].cmd)

+            {

+                if (0 == strnicmp((char *)cmd, (char *)gShell_DynamicCmds[i].cmd, ( unsigned int )cmpLen))

+                {

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_DynamicCmds[i].cmd, gShell_DynamicCmds[i].desc);

+                    ret = ZOSS_SUCCESS;

+                }

+            }

+            else

+            {

+                break;      /* ÃüÁîΪNULL,½áÊø²éÕÒ */

+            }

+        }

+        if (ZOSS_ERROR == ret)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tûÓÐ%s¿ªÍ·µÄÃüÁî!", cmd);

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÊäÈëhelpÁгöËùÓÐÃüÁî");

+        }

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell_mem.c b/cp/ps/plat/src/oss/sup/src/sup_shell_mem.c
new file mode 100755
index 0000000..57e448a
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell_mem.c
@@ -0,0 +1,885 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_mem.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÄÚ´æÏà¹ØµÄshellÃüÁî

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2019-01-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#include "sup_shell_cmd.h"

+#include "sup_except.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _DEBUG

+#define UBLEAKNUM   10000

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct 

+{

+	BOOL			isUsed; 							/* ʹÓñê¼Ç 		*/

+	UINT32			usingSize;							/* ʵ¼ÊÕ¼ÓôóС 	*/

+	CHAR			name[ZOSS_UBHEAD_FILENAME_LEN + 1]; /* ÉêÇëλÖÃÎļþÃû	*/

+	UINT32			line;								/* ÉêÇëλÖÃÐкŠ	*/

+	ZOSS_THREAD_ID	threadId;							/* ÉêÇëÏß³ÌID		*/

+	ZOSS_TASK_ID	taskId; 							/* ÉêÇëÈÎÎñºÅ		*/

+	UINT32			applyTimeTick;						/* ÉêÇëʱ¼ä(TICK)	*/

+	UINT32			use_num;							/* ʹÓôÎÊý 		*/

+	UINT32			block_size; 						/* ub¿éµÄ´óС		*/

+}T_DbgMem_UBHead;										/* ÄÚ´æÍ·			*/

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#ifdef _DEBUG

+extern UINT32           gMem_UBStart;

+extern T_ZOss_UBPOOL    *gMem_UBPoolCfg;

+extern UINT32           gMem_UBPoolNum;

+extern UINT32           gUBSuperviseSitch;

+#endif

+

+#ifdef _OS_TOS

+extern cyg_bool zTos_MmuGetReadableRegion(cyg_uint32 start, cyg_uint32 end, cyg_uint32 *p_start, cyg_uint32 *p_end);

+extern cyg_bool zTos_MmuIsPageCanWrite(cyg_uint32 addr);

+#endif

+#ifdef _OS_OSE

+extern void list_pools(void);

+extern void list_all_sig_info(void);

+extern void list_proc_sig_info(PROCESS pid, OSBOOLEAN listDetail);

+extern BOOL mmu_get_readable_region( UINT32 begin, UINT32 end , UINT32 *p_begin, UINT32 *p_end );

+extern BOOL mmu_is_writeable(UINT32 v_addr);

+extern VOID mmu_generate_info(VOID);

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+#ifdef _USE_HEAP_DEBUG

+static VOID shellSetMemTimeLeak(CHAR *cmd);

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: shellSetUBDebugFlag

+* ¹¦ÄÜÃèÊö: Êä³ö°ïÖúÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN) 

+			cmd:shellÃüÁî

+			(OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+#ifndef _OS_TOS

+static VOID shellSetUBDebugFlag(CHAR *cmd)

+{

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s   n", cmd);

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t nȡֵÕûÐÍ");

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t0±íʾ¹Ø±ÕUB µ÷ÊÔ¿ª¹Ø");

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t·ÇÁãÖµ±íʾ´ò¿ªUB µ÷ÊÔ¿ª¹Ø");

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: shellSetMemTimeLeak

+* ¹¦ÄÜÃèÊö: Êä³ö°ïÖúÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+			cmd:shellÃüÁî

+			(OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+#ifdef _USE_HEAP_DEBUG

+static VOID shellSetMemTimeLeak(CHAR *cmd)

+{	 

+	zOss_AssertExN(cmd != NULL);

+

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s  \n", cmd);

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¿ªÊ¼Ê±ÊäÈë %s	 leakstart	  й¶µÄ·§Öµ", cmd);

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t½áÊøÊ±ÊäÈë %s	 leakend  ", cmd);

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tй¶µÄ·§ÖµÖ¸¾­¹ý¶à³¤Ê±¼ämemÈç¹ûûÓÐÊͷž͵±×öй¶");

+}

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/* ÄÚ´æ¹Û²ì */

+VOID OSS_DbgShowMemInfo(T_Shell_CommandMessage *CmdMsg)

+{

+	T_Mem_MemInfo	meminfo = {0};

+	UINT32			status	= ZOSS_ERROR;

+	

+	zOss_AssertExN(CmdMsg != NULL);

+

+	if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾÄÚ´æ»ù±¾ÐÅÏ¢", CmdMsg->cmd);

+		return;

+	}

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t=====================================");

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%10s %10s\t %10s","TotalMem","UsedMem","MaxFreeMem");

+	

+	zOss_Memset(&meminfo, 0, sizeof(meminfo));

+	status = zOss_GetSysMemInfo(&meminfo);

+	if (ZOSS_SUCCESS == status)

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%10d %10d\t %10d", meminfo.nMemTotal, meminfo.nMemUsed, meminfo.nMemMaxFree);

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tGet mem info error!");

+	}

+	

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t=====================================");

+	return;

+}

+

+VOID OSS_DbgShowUbInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _DEBUG

+	

+	zOss_AssertExN(CmdMsg != NULL);

+	

+	if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾÄÚ´æ³Ø»ù±¾ÐÅÏ¢,¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s leak:ÏÔʾÄÚ´æ³ØÐ¹Â¶ÐÅÏ¢,¸ÃÃüÁîÔÚoseƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s stat:ÏÔʾÄÚ´æ³ØÍ³¼ÆÐÅÏ¢,¸ÃÃüÁîÔÚoseƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+		return;

+	}

+# if defined (_OS_TOS) || defined (_OS_LINUX)

+	if (0 == CmdMsg->paraCount)

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+	}

+	else if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "leak"))

+	{

+#ifdef _UB_USE_POOL

+		pool_print_leak(0);

+#endif

+	}

+	else if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "stat"))

+	{

+#ifdef _UB_USE_POOL

+		pool_print_alloc_fail();

+		pool_print_free();

+		pool_print_alloc_statistic();

+#endif

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈë%s help²éѯÓ÷¨", CmdMsg->cmd);

+	}

+	

+	return;

+# else

+

+	if(0 == gUBSuperviseSitch)

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tubµ÷ÊÔ¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+		return;

+	}

+

+	if(0 == CmdMsg->paraCount)

+	{

+		T_Mem_UBPoolGrpInfo ub_pool_grp_info	= {0};

+		UINT32				i					= 0;

+		

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t	´óС		×ÜÊý		ʹÓÃÊýÄ¿	ʹÓ÷åÖµ");

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================");

+		if (ZOSS_SUCCESS == Mem_GetUBUseInfo(&ub_pool_grp_info, 1))

+		{

+			for (i = 0; i < ub_pool_grp_info.pool_num; i++)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%10d %10d %10d %10d", 

+							ub_pool_grp_info.pool_info[i].pool_size, ub_pool_grp_info.pool_info[i].total_block_num,

+							ub_pool_grp_info.pool_info[i].total_block_num - ub_pool_grp_info.pool_info[i].free_block_num,

+							ub_pool_grp_info.pool_info[i].peak_value);

+			}

+		}

+		else

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_SEVERE,"\tGet UB info error!");

+		}

+		

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================");

+	}

+	else if (1 == CmdMsg->paraCount && (0 == strcmp((char *)CmdMsg->para[0], "leak") || 0 == strcmp((char *)CmdMsg->para[0], "stat")))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚoseƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈë%s help²éѯÓ÷¨", CmdMsg->cmd);

+	}

+# endif    

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµ±Ç°Îªrelease°æ±¾£¬´Ë¹¦ÄܽûÓÃ");

+	return;

+#endif

+}

+

+VOID OSS_DbgShowThreadUbInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _DEBUG

+	zOss_AssertExN(CmdMsg != NULL);

+

+# if defined (_OS_TOS) || defined (_OS_LINUX)

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+	return;

+# else

+

+	if (0 != gUBSuperviseSitch)

+	{

+		if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾָ¶¨Ïß³ÌÉêÇëµÄUB¿éÇé¿ö", CmdMsg->cmd);

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s	[thread_id][ubNum][poolNum]", CmdMsg->cmd);

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýthread_idΪָ¶¨Ïß³Ìid£¬²»ÄÜΪ¿Õ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýubNum²éѯ¸ÃÏß³Ìub¿éµÄ×î´óÊýÄ¿");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýpoolNumΪҪ²éѯµÄÄÚ´æ³ØºÅ£¬ÔÝÎÞЧ¹û£¬Æ½Ì¨Ä¬ÈÏΪ1");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t½á¹ûÏÔʾÁÐ˵Ã÷:");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tNum:UB¿éÐòºÅ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUbSize:Õ¼ÓÃUB¿éµÄ´óС");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUbUsingSize:ʵ¼ÊÕ¼ÓôóС");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tName:UB¿éÉêÇëÎļþ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tLine:UB¿éÉêÇëÐкÅ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUbBlockAdd:UB¿éµØÖ·");

+			return;

+		}

+		else if (3 == CmdMsg->paraCount)

+		{

+			T_Mem_UBBlockInfo	*threadUbInfo	= NULL;

+			T_Mem_UBBlockInfo	*pUbInfoStart	= NULL;

+			ZOSS_THREAD_ID		threadId		= NULL;

+			UINT32				threadUbRealNum = 0;

+			UINT32				i				= 0;

+			UINT32				maxNum			= 0;

+			UINT8				poolNum 		= 1;

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===========================================================================");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-10s%-10s%10s%10s%10s%20s","Num","UbSize", "UbUsingSize","Name","Line","UbBlockAdd");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===========================================================================");

+			

+			if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}									  

+			threadId = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+			if (NULL == threadId)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}

+			

+			maxNum = (UINT32)atoi((const char *)CmdMsg->para[1]);

+			if(0 == maxNum)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tmaxNum²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}

+			

+			threadUbInfo = (T_Mem_UBBlockInfo *)zOss_Malloc(maxNum * sizeof(T_Mem_UBBlockInfo));

+			zOss_AssertExN(threadUbInfo != NULL);

+			pUbInfoStart = threadUbInfo;

+			

+			threadUbRealNum = Mem_ThreadUBInfo(threadId, threadUbInfo, maxNum, poolNum);

+			if (0 == threadUbRealNum)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¸ÃÏß³Ì0x%XÔÚ%dºÅÄÚ´æ³ØµÄUBÊýÁ¿Îª0", threadId, poolNum);

+			}

+			else

+			{

+				for (i = 0; i < threadUbRealNum; i++)

+				{

+					zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-10d%-10d%10d%10s%10d%10X", i + 1, 

+								threadUbInfo->ubBlockSize, threadUbInfo->usingSize,

+								threadUbInfo->name, threadUbInfo->line, threadUbInfo->ubBlock);

+					threadUbInfo++;

+				}

+			}

+			zOss_Free(pUbInfoStart);

+			pUbInfoStart = NULL;

+		}

+		else

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+		}

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tubµ÷ÊÔ¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+		return;

+	}

+# endif    

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµ±Ç°Îªrelease°æ±¾£¬´Ë¹¦ÄܽûÓÃ");

+	return;

+#endif

+}

+

+VOID OSS_DbgShowTaskUbInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _DEBUG

+

+	zOss_AssertExN(CmdMsg != NULL);

+

+# if defined (_OS_TOS) || defined (_OS_LINUX)

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+	return;

+# else

+

+	if (0 != gUBSuperviseSitch)

+	{

+		if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾָ¶¨ÈÎÎñÉêÇëµÄUB¿éÇé¿ö", CmdMsg->cmd);

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s	[task_id][ubNum][poolNum]", CmdMsg->cmd);

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýtask_idΪָ¶¨ÈÎÎñid£¬²»ÄÜΪ¿Õ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýubNum²éѯ¸ÃÈÎÎñub¿éµÄ×î´óÊýÄ¿");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýpoolNumΪҪ²éѯµÄÄÚ´æ³ØºÅ£¬ÔÝÎÞЧ¹û£¬Æ½Ì¨Ä¬ÈÏΪ1");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t½á¹ûÏÔʾÁÐ˵Ã÷:");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBNumber:UB¿éÐòºÅ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:Õ¼ÓÃUB¿éµÄ´óС");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:ʵ¼ÊÕ¼ÓôóС");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:UB¿éÉêÇëÎļþ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:UB¿éÉêÇëÐкÅ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:UB¿éµØÖ·");

+			return;

+		}

+		else if (3 == CmdMsg->paraCount)

+		{

+			T_Mem_UBBlockInfo	*taskUbInfo 		= NULL;

+			T_Mem_UBBlockInfo	*pTaskUbInfoStart	= NULL;

+			ZOSS_TASK_ID		taskId				= NULL;

+			UINT32				taskUbRealNum		= 0;

+			UINT32				i					= 0;

+			UINT32				maxNum				= 0;

+			UINT8				poolNum 			= 1;

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===========================================================================");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-10s%-10s%10s%10s%10s%20s", "Num", "UbSize", "UbUsingSize", "Name", "Line", "UbBlockAdd");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===========================================================================");

+			

+			if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttaskId²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}									  

+			taskId = (ZOSS_TASK_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+			if (NULL == taskId)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttaskId²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}

+			

+			maxNum = (UINT32)atoi((const char *)CmdMsg->para[1]);

+			if(0 == maxNum)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tmaxNum²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}

+

+			taskUbInfo = (T_Mem_UBBlockInfo *)zOss_Malloc(maxNum * sizeof(T_Mem_UBBlockInfo));

+			zOss_AssertExN(taskUbInfo != NULL);

+			pTaskUbInfoStart = taskUbInfo;

+			

+			taskUbRealNum = Mem_TaskUBInfo(taskId, taskUbInfo ,maxNum, poolNum);

+			if (taskUbRealNum == 0)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¸ÃÈÎÎñ0x%XÔÚ%dºÅÄÚ´æ³ØµÄUBÊýÁ¿Îª0", taskId, poolNum);

+			}

+			else

+			{

+				for (i = 0; i < taskUbRealNum; i++)

+				{

+					zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-10d%-10d%10d%10s%10d%10X", i + 1, taskUbInfo->ubBlockSize, taskUbInfo->usingSize,

+								taskUbInfo->name, taskUbInfo->line, taskUbInfo->ubBlock);

+					

+					taskUbInfo++;

+				}

+			}

+			zOss_Free(pTaskUbInfoStart);

+			pTaskUbInfoStart = NULL;

+		}

+		else

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+		}

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tubµ÷ÊÔ¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ\n");

+		return;

+	}

+# endif    

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµ±Ç°Îªrelease°æ±¾£¬´Ë¹¦ÄܽûÓÃ\n");

+	return;

+#endif

+}

+

+/* µ×²ãµ÷ÊÔÖ¸Áî */

+VOID OSS_DbgGetMem(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT8   *pData      = NULL;

+    UINT32  len         = 0;

+    UINT32  i           = 0;

+    CHAR    *pbuf       = NULL;

+#if (defined _OS_TOS && defined CYGOPT_HAL_ARM_MMU) || defined _OS_OSE

+    UINT32  end         = 0;

+    UINT32  regionStart = 0;

+    UINT32  regionEnd   = 0;

+#endif    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tshowMem  µØÖ·(Äܹ»±»4Õû³ý)  ³¤¶È[1-256], ·ÃÎÊÎ´ÖªÇøÓò¿ÉÄܵ¼ÖÂÒì³£, ½÷É÷ʹÓÃ!");

+        return;

+    }

+    else

+    {

+        if (2 == CmdMsg->paraCount)

+        {

+            if (0 != Shell_StrisNumber(CmdMsg->para[0]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý%sȡֵֻÄÜÊÇÊý×Ö(10½øÖÆ»ò16½øÖÆ)", CmdMsg->para[0]);

+                return;

+            }

+            pData = (UINT8 *)(strtoul((char *)CmdMsg->para[0], (char **)NULL, 0));

+            if (0 != ((UINT32)pData) % 4)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)²»Äܱ»4Õû³ý!", pData, pData);

+                return;

+            }

+            if (0 != Shell_StrisNumber(CmdMsg->para[1]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý%sȡֵֻÄÜÊÇÊý×Ö(10½øÖÆ»ò16½øÖÆ)", CmdMsg->para[1]);

+                return;

+            }

+            

+            len = strtoul((char *)CmdMsg->para[1], (char **)NULL, 0);

+            if (!(len > 0 && len <= 256))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÊý¾Ý0x%x(%u)·¶Î§²»¶Ô[1-256]!", len, len);

+                return;

+            }

+#if defined _OS_TOS && defined CYGOPT_HAL_ARM_MMU

+            end = (UINT32)pData + ((len - 1) / 16 + 1) * 16 - 1;

+            zTos_MmuGetReadableRegion((UINT32)pData, end, (cyg_uint32 *)&regionStart, (cyg_uint32 *)&regionEnd);

+            if((UINT32)pData != regionStart || end > regionEnd)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)~0x%x(%u)´íÎó!", pData, pData, end, end);

+                return;                   

+            }

+#endif

+#ifdef _OS_OSE

+            end = (UINT32)pData + ((len - 1) / 16 + 1) * 16 - 1;

+            mmu_generate_info();

+            mmu_get_readable_region((UINT32)pData, end, &regionStart, &regionEnd);

+            if((UINT32)pData != regionStart || end != regionEnd)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)~0x%x(%u)´íÎó!", pData, pData, end, end);

+                return;                   

+            }

+#endif

+            pbuf = (CHAR *)zOss_Malloc(256);

+            if (NULL == pbuf)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tzOss_Mallocʧ°Ü");

+                return;

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t==============================");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tµØÖ·                     Êý¾Ý");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t               0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t==============================");

+            for (i = 0; i < len; i += 16)

+            {

+                sprintf((char *)pbuf, "\t0x%08x     %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x  :  %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", 

+                        (int)pData, pData[0], pData[1], pData[2], pData[3], pData[4], pData[5], pData[6], pData[7], pData[8], pData[9], pData[10], pData[11], pData[12], pData[13], pData[14], pData[15],

+                        CHAR_PRT(pData[0]), CHAR_PRT(pData[1]), CHAR_PRT(pData[2]), CHAR_PRT(pData[3]), CHAR_PRT(pData[4]), CHAR_PRT(pData[5]), CHAR_PRT(pData[6]), CHAR_PRT(pData[7]), 

+                        CHAR_PRT(pData[8]), CHAR_PRT(pData[9]), CHAR_PRT(pData[10]), CHAR_PRT(pData[11]), CHAR_PRT(pData[12]), CHAR_PRT(pData[13]), CHAR_PRT(pData[14]), CHAR_PRT(pData[15]));

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "%s", pbuf);

+                pData += 16;

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t==============================");

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý²»¶Ô!ÊäÈëshowMem help²é¿´°ïÖú");

+        }

+    }

+    

+    if (NULL != pbuf)

+    {

+        zOss_Free(pbuf);

+    }

+}

+

+VOID OSS_DbgSetMem(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 *pData   = NULL;

+    UINT32 data     = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tsetMem  µØÖ·(Äܹ»±»4Õû³ý)  ÊýÖµ(ÎÞ·ûºÅÕûÐÍ·¶Î§ÄÚ), ·ÃÎÊÎ´ÖªÇøÓò¿ÉÄܵ¼ÖÂÒì³£, ½÷É÷ʹÓÃ!");

+        return;

+    }

+    else

+    {

+        if (2 == CmdMsg->paraCount)

+        {

+            if (0 != Shell_StrisNumber(CmdMsg->para[0]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý%sȡֵֻÄÜÊÇÊý×Ö(10½øÖÆ»ò16½øÖÆ)", CmdMsg->para[0]);

+                return;

+            }

+            pData = (UINT32 *)(strtoul((char *)CmdMsg->para[0], (char **)NULL, 0));

+            if (0 != ((UINT32)pData) % 4)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)²»Äܱ»4Õû³ý!", pData, pData);

+                return;

+            }

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+            if(!zTos_MmuIsPageCanWrite((UINT32)pData))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)²»ÔÊÐíд!", pData, pData);

+                return;

+            }

+#endif

+#ifdef _OS_OSE

+            if(!mmu_is_writeable((UINT32)pData))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)²»ÔÊÐíд!", pData, pData);

+                return;

+            }

+#endif

+            if (0 != Shell_StrisNumber(CmdMsg->para[1]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý%sȡֵֻÄÜÊÇÊý×Ö(10½øÖÆ»ò16½øÖÆ)", CmdMsg->para[1]);

+                return;

+            }

+            data = strtoul((char *)CmdMsg->para[1], (char **)NULL, 0);

+            *pData = data;

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÐ޸ĵØÖ·0x%x(%u)µÄÊý¾ÝΪ0x%x(%u)³É¹¦", pData, pData, data, data);

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý²»¶Ô!ÊäÈësetMem help²é¿´°ïÖú");

+        }

+    }

+}

+

+VOID Shell_ShowPoolInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    zOss_AssertExN(CmdMsg != NULL);

+

+#ifdef _OS_TOS

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+#endif

+

+#ifdef _OS_OSE    

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST,PRINT_LEVEL_NORMAL, "\t===============================================================================");

+            list_pools();

+            zOss_Printf(SUBMDL_TEST,PRINT_LEVEL_NORMAL, "===============================================================================");

+            break;

+        }

+    default:

+        {

+            if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+            { 

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s", CmdMsg->cmd);

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó£¬Çë¼üÈë%s help²é¿´ÃüÁî˵Ã÷", CmdMsg->cmd);

+            }

+            break;

+        }

+    }

+#endif

+

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_SetMenDbgFlag

+* ¹¦ÄÜÃèÊö: ´ò¿ªubµ÷ÊÔ¿ª¹Ø

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shell ÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_SetUBDbgSwitch(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _OS_TOS

+    zOss_AssertExN(CmdMsg != NULL);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+    return;

+#elif defined (_OS_LINUX)

+

+#else

+    UINT32 tmp = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 != CmdMsg->paraCount)

+    {

+        shellSetUBDebugFlag(CmdMsg->cmd);

+        return;

+    }

+    if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+    {

+        shellSetUBDebugFlag(CmdMsg->cmd);

+        return;

+    }

+    

+    tmp = strtoul((char*)CmdMsg->para[0], NULL, 0);

+    zOss_SetUbDbgSwitch(tmp);

+    if (tmp)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³É¹¦´ò¿ªubµÄµ÷ÊÔ¿ª¹Ø");

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³É¹¦¹Ø±ÕubµÄµ÷ÊÔ¿ª¹Ø");

+    }

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_DbgMemInfo

+* ¹¦ÄÜÃèÊö: ¼ì²émemµÄʹÓÃÐÅÏ¢(й¶ºÍÔ½½ç)

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_DbgMemInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _USE_HEAP_DEBUG

+    zOss_AssertExN(CmdMsg != NULL);

+      

+    if(CmdMsg->paraCount == 0)

+    {

+        zOss_CheckMem();

+    }

+    else if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s", CmdMsg->cmd);

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÊäÈë%s help ²é¿´ÃüÁîÓ÷¨", CmdMsg->cmd);

+    }

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t_USE_HEAP_DEBUGδ´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+    return;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_DbgMemTimeLeakInfo

+* ¹¦ÄÜÃèÊö: ¼ì²éµÄij¸öʱ¼ä¶ÎMemµÄй¶ÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_DbgMemTimeLeakInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _USE_HEAP_DEBUG

+    UINT32 tmp = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if ((CmdMsg->paraCount == 2) && (0 == strcmp((const char *)CmdMsg->para[0], "leakstart")))

+    {

+        if (-1 == Shell_StrisNumber(CmdMsg->para[1]))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }

+        tmp = strtoul((char*)CmdMsg->para[1], NULL, 0);

+        zOss_MemLeakStart(tmp);

+    }

+    else if ((CmdMsg->paraCount == 1) && (0 == strcmp((const char *)CmdMsg->para[0], "leakend")))

+    {

+        zOss_MemLeakEnd();

+    }

+    else

+    {

+        shellSetMemTimeLeak(CmdMsg->cmd);

+    }

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t_USE_HEAP_DEBUGδ´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+    return;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_UBLeakInfo

+* ¹¦ÄÜÃèÊö: ¸ù¾ÝÄÚ´æºÅͳ¼ÆÄÚ´æ³ØµÄʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷: (IN)

+            poolNum:ÄÚ´æ³ØºÅ

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_UBLeakInfo(UINT32 poolNum)

+{

+#if defined (_OS_OSE) || defined (_OS_WIN)

+#if defined (_DEBUG)

+    T_Mem_UBPoolCtl     *pUbControlStart    = NULL;

+    T_Mem_UBListNode    *pUbListNodeStart   = NULL;

+    UINT32              i                   = 0;

+    UINT32              j                   = 0;

+    UINT32              k                   = 0;

+    UINT32              tmpPoolNum          = 0;

+    T_Mem_UBListNode    *pUbListNodeTemp    = NULL;

+    T_DbgMem_UBHead     *pUBDbgLeakInfo     = NULL;

+    T_DbgMem_UBHead     *pTmpUBDbgLeakInfo  = NULL;

+    UINT32              UBLeakNum           = 0;

+    UINT32              tmpSize             = 0;

+    

+    tmpPoolNum = poolNum;

+    pUbControlStart = (T_Mem_UBPoolCtl *)gMem_UBStart;

+    pUbListNodeStart = (T_Mem_UBListNode *)(pUbControlStart + gMem_UBPoolNum); 

+    pUbListNodeTemp = pUbListNodeStart;

+    tmpSize = sizeof(T_DbgMem_UBHead) * gMem_UBPoolCfg[tmpPoolNum].total_block_num;

+    

+    pUBDbgLeakInfo = (T_DbgMem_UBHead *)zOss_Malloc(tmpSize);

+    

+    zOss_AssertExN(NULL != pUBDbgLeakInfo);

+    

+    zOss_Memset(pUBDbgLeakInfo, 0, tmpSize);

+    pTmpUBDbgLeakInfo = pUBDbgLeakInfo;

+    for (i = 0; i < tmpPoolNum; i++)

+    {

+        pUbListNodeTemp = pUbListNodeTemp + gMem_UBPoolCfg[i].total_block_num;

+    }

+    

+    for (j = 0; j < gMem_UBPoolCfg[tmpPoolNum].total_block_num; j++)

+    {

+        if (pUbListNodeTemp->ubBlockHeader.isUsed == TRUE)

+        {

+            for (k = 0; k < UBLeakNum; k++)

+            {

+                pTmpUBDbgLeakInfo = pUBDbgLeakInfo + k;

+                if ((0 == strcmp((char *)pTmpUBDbgLeakInfo->name, (char *)pUbListNodeTemp->ubBlockHeader.name)) && 

+                                (pTmpUBDbgLeakInfo->line == pUbListNodeTemp->ubBlockHeader.line) &&

+                                (pTmpUBDbgLeakInfo->usingSize == pUbListNodeTemp->ubBlockHeader.usingSize) && 

+                                (pTmpUBDbgLeakInfo->taskId == pUbListNodeTemp->ubBlockHeader.taskId) && 

+                                (pTmpUBDbgLeakInfo->threadId == pUbListNodeTemp->ubBlockHeader.threadId))

+                {

+                    ++pTmpUBDbgLeakInfo->use_num;

+                    break;

+                }

+                

+            }

+            if (k >= UBLeakNum)

+            {

+                pTmpUBDbgLeakInfo = pUBDbgLeakInfo + UBLeakNum;

+                zOss_Memcpy(pTmpUBDbgLeakInfo, (char *)pUbListNodeTemp, sizeof(T_Mem_UBListNode) - 4);  /* ¿½±´ÄÚ´æÍ· */

+                pTmpUBDbgLeakInfo->use_num = 1;

+                ++UBLeakNum;

+            }

+        }

+        pUbListNodeTemp++;

+    }

+    

+    for (i = 0; i < UBLeakNum; i++)

+    {

+        pTmpUBDbgLeakInfo = pUBDbgLeakInfo + i;

+        zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_SEVERE, "\tÄÚ´æ¿éÒÑʹÓôóС:%-8d й©ÎļþÃû×Ö:%-30s ÐкÅ:%-8d  Ïß³ÌID :0x%08x      ÈÎÎñID :0x%08x      ʹÓôÎÊý:%-8d", 

+                    pTmpUBDbgLeakInfo->usingSize, pTmpUBDbgLeakInfo->name, pTmpUBDbgLeakInfo->line, pTmpUBDbgLeakInfo->threadId, 

+                    pTmpUBDbgLeakInfo->taskId, pTmpUBDbgLeakInfo->use_num);

+    }

+    

+    zOss_Sleep(1000);

+    zOss_Free(pUBDbgLeakInfo);

+#endif  // #if defined (_DEBUG)

+#endif  // #if defined (_OS_OSE) || defined (_OS_WIN)

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_DbgUbInfo

+* ¹¦ÄÜÃèÊö: ubµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_DbgUbInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _DEBUG

+    zOss_AssertExN(CmdMsg != NULL);    

+# if defined (_OS_TOS) || defined (_OS_LINUX)

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+    return;

+# else

+

+    if(0 == gUBSuperviseSitch)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tubµ÷ÊÔ¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+

+    if(CmdMsg->paraCount == 0)

+    {

+        UINT32 pool_num = 0;  

+        for (pool_num = 0; pool_num < gMem_UBPoolNum; pool_num++)

+        {

+            OSA_UBLeakInfo(pool_num);

+        }

+    }

+    else if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s", CmdMsg->cmd);

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÊäÈë%s help ²é¿´ÃüÁîÓ÷¨", CmdMsg->cmd);

+    }

+# endif

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell_misc.c b/cp/ps/plat/src/oss/sup/src/sup_shell_misc.c
new file mode 100755
index 0000000..139f7a8
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell_misc.c
@@ -0,0 +1,943 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_misc.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : misc shellÃüÁî

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2019-01-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#include "sup_shell_cmd.h"

+#include "sup_except.h"

+#include "osa.h"

+

+#ifdef _USE_MULTI_CORE_RAMDUMP

+#include "sup_ramdump.h"

+#else

+#include "osa_ramdump.h"

+#endif

+

+#ifdef _OS_LINUX

+#include <linux/kernel.h>

+#else

+#include <stdio.h>

+#include <stdlib.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_LINUX

+extern UINT32 zOss_SetProcessPri(VOID *thread_id, UINT32 priority);

+extern UINT32 zOss_GetProcessPri(VOID *thread_id, UINT32 priority);

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _OS_TOS

+# define GMON_OUT_FILE  "/c/gmon.out"

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_SetIrqLogFlag

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖжϵ÷ÊÔÐÅÏ¢µÄflag

+* ²ÎÊý˵Ã÷£º(IN)

+				flag:´ò¿ª»ò¹Ø±ÕµÄ±êÖ¾;

+			(OUT)

+				ÎÞ;

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_SetIrqLogFlag(UINT32 flag)

+{

+#ifdef TOS_STATISTIC_IRQ

+	if (flag == 0)

+	{

+		tos_statistic_irq_close();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦¹Ø±ÕÖжÏͳ¼Æ¹¦ÄÜ;");

+	}

+	else

+	{

+		tos_statistic_irq_open();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦´ò¿ªÖжÏͳ¼Æ¹¦ÄÜ;");

+	}		 

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ºêTOS_STATISTIC_IRQûÓдò¿ª;");

+#endif

+

+#ifdef TOS_TRACE_IRQ

+	if (flag == 0)

+	{

+		tos_trace_irq_close();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦¹Ø±ÕÖжϸú×Ù¹¦ÄÜ;");

+	}

+	else

+	{

+		tos_trace_irq_open();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦´ò¿ªÖжϸú×Ù¹¦ÄÜ;");

+	}

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ºêTOS_TRACE_IRQûÓдò¿ª;");

+#endif       

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_SetThreadLogFlag

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÏ̵߳÷ÊÔÐÅÏ¢µÄflag

+* ²ÎÊý˵Ã÷£º(IN)

+				flag:´ò¿ª»ò¹Ø±ÕµÄ±êÖ¾;

+			(OUT)

+				ÎÞ;

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_SetThreadLogFlag(UINT32 flag)

+{

+#ifdef OSS_TRACE_THREAD

+	if (flag == 0)

+	{

+		oss_trace_thread_close();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦¹Ø±ÕÏ̸߳ú×Ù¹¦ÄÜ;");

+	}

+	else

+	{

+		oss_trace_thread_open();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦´ò¿ªÏ̸߳ú×Ù¹¦ÄÜ;");

+	}

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ºêOSS_TRACE_THREADûÓдò¿ª;");

+#endif   

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/* »ù±¾ÃüÁî */

+VOID OSS_DbgShowBootInfo(T_Shell_CommandMessage *CmdMsg)

+{ 

+	zOss_AssertExN(CmdMsg != NULL);

+

+	if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:´òÓ¡Æô¶¯ÐÅÏ¢", CmdMsg->cmd);

+		return;

+	}

+

+	zOss_RamPrintf();

+}

+

+VOID OSS_DbgSetWintracePrintFlag(T_Shell_CommandMessage *CmdMsg)

+{

+	UINT32 type = 0;

+	

+	zOss_AssertExN(CmdMsg != NULL);

+	if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s	type", CmdMsg->cmd);

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttype:ȡֵ0»ò1¡£1±íʾ´ò¿ª£¬0±íʾ¹Ø±Õ");

+		return;

+	}

+	else

+	{

+		if (1 == CmdMsg->paraCount)

+		{

+			if (0 != Shell_StrisNumber(CmdMsg->para[0]))

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\ttypeÖ»ÄÜȡֵÊÇÊý×Ö");

+				return;

+			}

+			type = strtoul((char *)CmdMsg->para[0], (char **)NULL, 0);

+			if (type < 2)

+			{

+				Shell_SetPrintFlag(type);

+			}

+			else

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\ttype:ȡֵ0»ò1¡£1±íʾ´ò¿ª£¬0±íʾ¹Ø±Õ");

+			}

+		}

+		else

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó£¬ÊäÈë%s help»ñµÃ°ïÖú", CmdMsg->cmd);

+		}

+	}

+}

+

+VOID OSS_DbgRamdumpConfigRegionInfo (T_Shell_CommandMessage *CmdMsg)

+{    

+#ifdef _USE_MULTI_CORE_RAMDUMP

+    T_zOss_RamdumpRegion regionInfo = {0};

+#else

+    UINT32  base        = 0;

+    UINT32  size        = 0;

+    UINT32  map_base    = 0;

+    UINT32  copy_base   = 0;

+#endif

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    switch (CmdMsg->paraCount)

+    {

+    case 1:

+        {

+            if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, 

+                            "\tÅäÖõ¼³öÄÚ´æÇøÓò£¬ÒÔ16½øÖÆÐÎʽÊäÈëÄÚ´æÆðʼµØÖ·ºÍÄÚ´æ¶Î´óС£¬ÖмäÓÿոñ¸ô¿ª");

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëramdumpConfigRegion help²éѯÓ÷¨");

+            }           

+            break;

+        }

+    case 2:

+        {

+            if (-1 == Shell_StrisNumber(CmdMsg->para[0]) || -1 == Shell_StrisNumber(CmdMsg->para[1]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëramdumpConfigRegion help²éѯÓ÷¨");

+                break;

+            }            

+#ifdef _USE_MULTI_CORE_RAMDUMP

+            regionInfo.baseForServer = strtoul((char *)CmdMsg->para[0], NULL, 16);

+            regionInfo.size          = strtoul((char *)CmdMsg->para[1], NULL, 16);

+            regionInfo.baseForSelf   = regionInfo.baseForServer;

+            regionInfo.baseForCopy   = 0;

+            

+            zOss_RamdumpConfigureMem(&regionInfo);

+#else

+            base = strtoul((char *)CmdMsg->para[0], NULL, 16);

+            size = strtoul((char *)CmdMsg->para[1], NULL, 16);

+            map_base    = base;

+            copy_base   = 0;

+            

+            zOss_RamdumpConfigureMem(base, size, map_base, copy_base);

+#endif

+            break;

+        }

+    default:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëramdumpConfigRegion help²éѯÓ÷¨");

+            break;

+        }

+    }

+}

+

+VOID OSS_DbgShowMsg(T_Shell_CommandMessage *CmdMsg)

+{

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¸ÃÃüÁîδʵÏÖ");

+}

+

+#if defined(__ARMCC_VERSION) && __ARMCC_VERSION > 220000

+__asm shell_GetR11(VOID)

+{

+    mov r0, r11

+    bx lr

+}

+#endif

+

+VOID OSS_DbgShowRegInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#if defined(__ARMCC_VERSION) && __ARMCC_VERSION > 220000

+    UINT32 Reg11    = 0;

+    UINT32 spReg    = 0;

+    UINT32 pcReg    = 0;

+    UINT32 lrReg    = 0;

+    UINT32 cReg     = 0;

+    UINT32 sReg     = 0;

+#endif

+

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s", CmdMsg->cmd);

+        return;

+    }

+

+#if defined(__ARMCC_VERSION) && __ARMCC_VERSION > 220000

+    Reg11 = shell_GetR11();

+    __asm

+    {

+        MOV spReg, __current_sp()

+        MOV pcReg, __current_pc()

+        MOV lrReg, __return_address()

+        MRS cReg, CPSR

+        MRS sReg, SPSR

+    }

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tfp:0x%08x", Reg11);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tsp:0x%08x", spReg);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tpc:0x%08x", pcReg);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tlr:0x%08x", lrReg);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tcpsr:0x%08x", cReg);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tspsr:0x%08x", sReg);

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¸Ã¹¦ÄÜδʵÏÖ");

+#endif

+}

+

+VOID OSS_DbgReboot(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 type = 0;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\treboot  type");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttype:ȡֵ1»ò2¡£1±íʾÈí¼þÖØÆô£¬2±íʾӲ¼þÖØÆô");

+        return;

+    }

+    else

+    {

+        if (1 == CmdMsg->paraCount)

+        {

+            if (0 != Shell_StrisNumber(CmdMsg->para[0]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\ttypeÖ»ÄÜȡֵÊÇÊý×Ö");

+                return;

+            }

+            type = strtoul((char *)CmdMsg->para[0], (char **)NULL, 0);

+            switch (type)

+            {

+            case 1:

+                {

+                    zOss_SysSoftReset(SYS_RESET_TO_NORMAL);

+                    break;

+                }

+            case 2:

+                {

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tº¯Êý½Ó¿Ú»¹Î´ÊµÏÖ");

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\ttype:0x%x(%u)ȡֵ´íÎó£¬ÊäÈëreboot help»ñµÃ°ïÖú", type, type);

+                    break;

+                }

+            }

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó£¬ÊäÈëreboot help»ñµÃ°ïÖú");

+        }

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÌáÈ¡³öprofileÊý¾Ý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+*				void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID Shell_ProfileRecords(VOID)

+{

+#if defined (_OS_TOS) && defined (CYGPKG_PROFILE_GPROF) 

+	FILE *file                              = NULL;

+	UINT32 bucket                           = 0;

+	UINT32 size                             = 0;

+	CHAR* buf                               = NULL;

+	CHAR* hist_data_start                   = NULL;

+    profile_records_t *profile_records_ptr  = NULL;

+

+	profile_records_ptr = cyg_profile_get_records();

+    size =  sizeof(struct gmon_hdr)+

+            sizeof(profile_records_ptr->profile_tags[0])+

+            sizeof(struct gmon_hist_hdr)+

+            profile_records_ptr->profile_hist_hdr.hist_size*sizeof(profile_time_t);

+

+    buf = (CHAR *)zOss_Malloc(size);

+    if (!buf)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t·ÖÅä¿Õ¼äʧ°Ü!");

+        return;

+    }

+

+    hist_data_start = buf + sizeof(struct gmon_hdr)

+                          + sizeof(profile_records_ptr->profile_tags[0])

+                          + sizeof(struct gmon_hist_hdr);

+

+    zOss_Memset(buf, 0, size);

+    zOss_Memcpy(buf, &profile_records_ptr->profile_gmon_hdr, sizeof(struct gmon_hdr));

+    zOss_Memcpy(buf+sizeof(struct gmon_hdr), 

+                &profile_records_ptr->profile_tags[0], 

+                sizeof(profile_records_ptr->profile_tags[0]));

+    zOss_Memcpy(buf+sizeof(struct gmon_hdr) + sizeof(profile_records_ptr->profile_tags[0]),

+                &profile_records_ptr->profile_hist_hdr,

+                sizeof(struct gmon_hist_hdr));

+#ifdef CYGPKG_PROFILE_HIST_HOOK

+    for (bucket = 0; bucket < profile_records_ptr->profile_hist_hdr.hist_size; bucket++)

+    {

+        if (profile_records_ptr->profile_hist_data_ptr[bucket].sum_time)

+            zOss_Memcpy((hist_data_start + sizeof(profile_time_t)*bucket),

+                        &(profile_records_ptr->profile_hist_data_ptr[bucket].sum_time),

+                        sizeof(profile_time_t));

+    }

+#else

+    zOss_Memcpy(hist_data_start, profile_records_ptr->profile_hist_data_ptr,

+                profile_records_ptr->profile_hist_hdr.hist_size*sizeof(profile_time_t));

+#endif

+

+	if ((file = zOss_FOpen(GMON_OUT_FILE, "wb")) == NULL)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t´ò¿ªgmon.outÎļþʧ°Ü!");

+        zOss_Free((VOID *)buf);

+        return;

+    }

+

+	size = zOss_FWrite(buf, size, 1, file);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, size ? "\t\t ³É¹¦Íê³Éдgmon.outÎļþ!" : "\t\tдgmon.outÎļþʧ°Ü!");

+    zOss_FClose(file);

+    zOss_Free((VOID *)buf);

+#endif	// #if defined (_OS_TOS) && defined (CYGPKG_PROFILE_GPROF)

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ½«ÏµÍ³ÔËÐÐʱµÄprofileÐÅÏ¢µ¼³ö

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID OSS_DbgProfile(T_Shell_CommandMessage *CmdMsg)

+{

+#if defined (_OS_TOS) && defined (CYGPKG_PROFILE_GPROF)

+    zOss_AssertExN(CmdMsg != NULL);

+

+    Shell_ProfileRecords();

+#endif  // #if defined (_OS_TOS) && defined (CYGPKG_PROFILE_GPROF)

+}

+

+VOID Shell_ShowProcSig(T_Shell_CommandMessage *CmdMsg)

+{

+    zOss_AssertExN(CmdMsg != NULL);

+

+#ifdef _OS_TOS

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+#endif

+

+#ifdef _OS_OSE

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "===============================================================================");

+            list_all_sig_info();

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "===============================================================================");

+            break;

+        }

+    default:

+        {

+            if (CmdMsg->paraCount == 1)

+            {

+                if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+                {

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s : ÏÔʾÏß³ÌsignalÐÅÏ¢", CmdMsg->cmd);

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t %s  [thread_id]", CmdMsg->cmd);

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t ²ÎÊýthread_idΪָ¶¨Ïß³Ìid,Èç¹û²»Ö¸¶¨,ÏÔʾËùÓÐÏß³ÌsignalÐÅÏ¢");

+                }

+                else

+                {

+                    ZOSS_THREAD_ID pid = NULL;

+                    if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+                        return;

+                    }                         

+                    pid = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+                    if (NULL == pid)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+                        return;

+                    }

+

+                    if (OSA_IdentifyThread(pid) != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó:Ïß³Ì%#lx²»´æÔÚ", pid);

+                    }

+                    else

+                    {

+                        list_proc_sig_info((PROCESS)pid, 1);

+                    }

+                }

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó£¬Çë¼üÈë%s help²é¿´ÃüÁî˵Ã÷", CmdMsg->cmd);

+            }

+            break;

+        }

+    }

+#endif

+

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_OpenTraceSwitch

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_OpenTraceSwitch(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _OS_TOS

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if(0 == strcmp(CmdMsg->para[0], "help") && CmdMsg->paraCount == 1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t irq:´ò¿ª»òÕ߹رÕÖжÏͳ¼ÆºÍ¸ú×Ù¹¦ÄÜ; thread: ´ò¿ª»ò¹Ø±ÕÏ̸߳ú×Ù¹¦ÄÜ;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±ÕÏàÓ¦µÄ¹¦ÄÜ, 1:´ò¿ªÏàÓ¦µÄ¹¦ÄÜ;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÀýÈç:openTraceSwitch irq 1»òÕßopenTraceSwitch irq 0£¬´ò¿ª»òÕ߹رÕÖжÏͳ¼ÆºÍ¸ú×Ù¹¦ÄÜ;");

+        return;

+    }

+

+    if(CmdMsg->paraCount == 2 && -1 != Shell_StrisNumber(CmdMsg->para[1]))

+    {

+        UINT32 type = strtoul((char *)CmdMsg->para[1], NULL, 0);

+        if(type == 0 || type == 1)

+        {

+            if(0 == strcmp(CmdMsg->para[0], "irq"))

+            {

+                Shell_SetIrqLogFlag(type);

+                return;

+            }            

+            if(0 == strcmp(CmdMsg->para[0], "thread"))

+            {

+                Shell_SetThreadLogFlag(type);

+                return;

+            }

+        }

+    }

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîÊäÈë´íÎó;");

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÇëÊäÈë%s help²é¿´¸ÃÃüÁîµÄ¹¦ÄÜ;", CmdMsg->cmd);

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÖ»ÔÚTOSƽ̨ÓÐʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_SetAssertLevel

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_SetAssertLevel(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _OS_TOS

+    UINT32 level = 0;

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    if(0 == strcmp(CmdMsg->para[0], "help") && CmdMsg->paraCount == 1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÉèÖÃÄں˶ÏÑԵȼ¶1:ÑÏÖØ 2: Ò»°ã 3: Çá;");

+        return;

+    }

+    if ((CmdMsg->paraCount != 1) || (-1 == Shell_StrisNumber(CmdMsg->para[0])))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîÊäÈë´íÎó;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÇëÊäÈë%s help²é¿´¸ÃÃüÁîµÄ¹¦ÄÜ;", CmdMsg->cmd);

+        return;

+    }

+    level = strtoul((char *)CmdMsg->para[0], NULL, 0);

+    if(level >= 1 && level <= 3)

+    {

+        cyg_set_dbg_level(level);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÉèÖóɹ¦", CmdMsg->cmd);

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîÊäÈë´íÎó;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÇëÊäÈë%s help²é¿´¸ÃÃüÁîµÄ¹¦ÄÜ;", CmdMsg->cmd);

+    }

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÖ»ÔÚTOSƽ̨ÓÐʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_DbgSuspendThread

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSS_DbgSuspendThread(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_THREAD_ID  thread_id   = NULL;

+    UINT32          result      = 0;

+    UINT8           i           = 0;

+   

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tsuspend_thread:no followed by thread_id!");

+            break;

+        }

+    default:

+        {

+            if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tsuspend_thread:followed by the specified thread ID to suspend the thread!");

+            }

+            else

+            {

+                for (i = 0; i < CmdMsg->paraCount; i++)

+                {

+                    thread_id = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[i], NULL, 0);

+                    

+                    if (thread_id == NULL)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                        break;

+                    }

+                    if (OSA_IdentifyThread(thread_id) == ZOSS_ERROR)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                        break;

+                    }

+

+                    result = zOss_SuspendThread(thread_id);

+                    

+                    if (result != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tSuspend Thread Fail!");

+                    }

+                    else

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tSuspend Thread OK!");

+                    }

+                }

+            }

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_DbgResumeThread

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSS_DbgResumeThread(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_THREAD_ID  thread_id   = NULL;

+    UINT32          result      = 0;

+    UINT8           i           = 0;

+   

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tresum_thread:no followed by thread_id!");

+            break;

+        }

+    default:

+        {

+            if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tresum_thread:followed by the specified thread ID to resume the thread!");

+            }

+            else

+            {

+                for (i = 0; i < CmdMsg->paraCount; i++)

+                {

+                    thread_id = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[i], NULL, 0);

+                    

+                    if (thread_id == NULL)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                        break;

+                    }

+                    if (OSA_IdentifyThread(thread_id) == ZOSS_ERROR)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                        break;

+                    }

+

+                    result = zOss_ResumeThread(thread_id);

+                    

+                    if (result != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tResume Thread Fail!");

+                    }

+                    else

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tResume Thread OK!");

+                    }

+                }

+            }

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_DbgSetThreadPri

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSS_DbgSetThreadPri(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_THREAD_ID  thread_id   = NULL;

+    UINT32          result      = 0;

+    UINT32          pre_prio    = 0;

+    UINT32          priority    = 0;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tset_thread_pri:no followed by thread_id and priority!");

+        }

+        break;

+    case 1:

+        {

+            if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tset_thread_pri:followed by the specified thread ID and priority to set priority of the thread!");

+            }

+        }

+        break;

+    default:

+        {

+            thread_id = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+            

+            if (thread_id == NULL)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                break;

+            }

+#ifdef _OS_LINUX

+            priority = strtoul((char *)CmdMsg->para[1], NULL, 0);

+            if (priority > 99 || priority <= 0)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong priority! now can only set RT prio 1~99");

+                break;

+            }

+            result = zOss_GetProcessPri((VOID *)thread_id, &pre_prio);

+            if (result != ZOSS_SUCCESS)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+            }

+            result = zOss_SetProcessPri(thread_id, priority);

+#else

+            if (OSA_IdentifyThread(thread_id) != ZOSS_SUCCESS)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, " The thread 0x%08x is not exist!",thread_id);

+                break;

+            }

+

+            priority = strtoul((char *)CmdMsg->para[1], NULL, 0);

+            if (priority > 31)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong priority!");

+                break;

+            }

+            

+            result = zOss_GetThreadPri(thread_id, &pre_prio);

+            if (result != ZOSS_SUCCESS)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+            }

+            result = zOss_SetThreadPri(thread_id, priority);

+#endif

+            

+            if (result == ZOSS_SUCCESS)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tPrior Set From %u to %u OK!",  pre_prio, priority);

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tPrior Set  From %u to %u Fail!", pre_prio, priority);

+            }

+        }

+        break;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_ForceRamdump

+* ¹¦ÄÜÃèÊö: Ç¿ÖÆ²úÉúÒì³£,ÒÔ±ãramdump

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_ForceRamdump(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 ret = 0;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount)

+    {

+        if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+        {

+#ifdef _USE_MULTI_CORE_RAMDUMP

+#ifdef _USE_ARM1_RAMDUMP

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t0:serverÇ¿ÖÆËÀ»ú, ·ÇÁãÖµ:clientÇ¿ÖÆËÀ»ú(N¸öclient¶ÔÓ¦Êý×Ö1:N),Arm1¶ÔÓ¦255");

+#else

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t0:serverÇ¿ÖÆËÀ»ú, ·ÇÁãÖµ:clientÇ¿ÖÆËÀ»ú(N¸öclient¶ÔÓ¦Êý×Ö1:N)");

+#endif

+#else

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t0:ARMÒì³£ 1: ¶ÏÑÔÒì³£ 2: ²Ù×÷ϵͳ¶ÏÑÔÒì³£");

+#endif

+            return;

+        }

+        

+        if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+            return;

+        }

+            

+        ret = strtoul((char *)CmdMsg->para[0], NULL, 0);

+#ifdef _USE_MULTI_CORE_RAMDUMP

+        if(ret == 0)

+        {

+            zOss_AssertExN(FALSE);

+        }

+        else

+        {            

+            ret = zOss_RamdumpForceClientException(ret);

+            if(ret != ZOSS_SUCCESS)

+               zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+        }

+#else

+        if(ret <= 2)

+        {

+            zOss_RamdumpForceException(ret);

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+        }

+#endif

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_DbgTrace

+* ¹¦ÄÜÃèÊö: ²é¿´¸ú×ÙÄ£¿éÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî²ÎÊý

+            (OUT)

+* ·µ »Ø Öµ: VOID

+* ÆäËü˵Ã÷: VOID

+**************************************************************************/

+VOID OSA_DbgTrace(T_Shell_CommandMessage *CmdMsg)

+{

+    zOss_AssertExN(CmdMsg != NULL);

+

+    switch (CmdMsg->paraCount)

+    {

+    case 1:

+        {

+            if (strcmp((const char *)CmdMsg->para[0], "init") == 0)

+            {

+                zOss_TraceFuncInit();

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttrace¸ú×Ù¹¦Äܳõʼ»¯³É¹¦");                

+            }

+            else if (strcmp((const char *)CmdMsg->para[0], "info") == 0)

+            {

+                zOss_TraceFuncInfo(NULL);

+            }

+            else if (strcmp((const char *)CmdMsg->para[0], "help") == 0)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttrace¹¦ÄÜ:²é¿´¸ú×ÙÄ£¿éÐÅÏ¢");

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³õʼ»¯¸ú×Ù±ê־λ trace init");

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²é¿´¸ú×Ùº¯ÊýÐÅÏ¢ trace info [funcname]");

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tfuncnameΪº¯ÊýÃû");

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+            }

+            break;

+        }

+    case 2:

+        {

+            if (strcmp((const char *)CmdMsg->para[0], "info") == 0)

+            {

+                zOss_TraceFuncInfo(CmdMsg->para[1]);

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+            }

+            break;

+        }

+    default:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+            break;

+        }

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell_psm.c b/cp/ps/plat/src/oss/sup/src/sup_shell_psm.c
new file mode 100755
index 0000000..fb51e7d
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell_psm.c
@@ -0,0 +1,222 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_psm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ê¡µçÏà¹ØµÄshellÃüÁî

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2019-01-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#include "sup_shell_cmd.h"

+#include "sup_except.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#ifdef _USE_PSM

+ZOSS_SEMAPHORE_ID g_zTos_PsmInfoSema   = NULL;

+ZOSS_TIMER_ID	  g_zTos_PsmInfoTimer  = NULL;

+ZOSS_THREAD_ID	  g_zTos_PsmInfoThread = NULL;

+#ifdef _USE_CPU_DFM

+ZOSS_SEMAPHORE_ID g_zTos_DfmInfoSema   = NULL;

+ZOSS_TIMER_ID	  g_zTos_DfmInfoTimer  = NULL;

+ZOSS_THREAD_ID	  g_zTos_DfmInfoThread = NULL;

+#endif

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef _USE_PSM

+#ifdef _USE_CPU_DFM

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_DfmInfoTimerFunc

+* ²ÎÊý˵Ã÷:     

+*           (IN)  args: ²ÎÊý

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_DfmInfoTimerFunc(SINT32 args)

+{

+    UINT32 status = zOss_PutSemaphore(g_zTos_DfmInfoSema);

+    zOss_AssertExN(status == ZOSS_SUCCESS);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_DfmInfoThreadEntry

+* ²ÎÊý˵Ã÷:     

+*           (IN)  args:²ÎÊý

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_DfmInfoThreadEntry(SINT32 args)

+{

+    while(1)

+    {

+        zOss_GetSemaphore(g_zTos_DfmInfoSema, ZOSS_WAIT_FOREVER);

+        zOss_DfmTraceInfo();

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_DfmTraceInfo

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_DfmTraceInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 tmp = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+    if ((1 != CmdMsg->paraCount) || (-1 == Shell_StrisNumber(CmdMsg->para[0])))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîµÄ¸ñʽ: dfminfo 0»ò1 \n");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±Õ, 1:´ò¿ª\n");

+        return;

+    }

+

+    tmp = strtoul((char*)CmdMsg->para[0], NULL, 0);

+    if (tmp >1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîµÄ¸ñʽ: dfminfo 0»ò1 \n");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±Õ, 1:´ò¿ª\n");

+        return;

+    }

+    

+    if (tmp)

+    {

+        g_zTos_DfmInfoSema   = zOss_CreateSemaphore("dfminfosema", 0);

+        g_zTos_DfmInfoTimer  = zOss_CreateTimer("dfminfotimer", OSS_DfmInfoTimerFunc, 10, TRUE);

+        g_zTos_DfmInfoThread = zOss_CreateThread("dfminfothread", OSS_DfmInfoThreadEntry, 0, 4096, 25, 1, 1);

+        zOss_StartTimer(g_zTos_DfmInfoTimer, 10, OSS_DfmInfoTimerFunc, 0);

+    }

+    else

+    {

+        zOss_DeleteThread(g_zTos_DfmInfoThread);

+        zOss_KillTimer(g_zTos_DfmInfoTimer);

+        zOss_DeleteSemaphore(g_zTos_DfmInfoSema);

+    }

+

+    return;

+}

+#endif  //_USE_CPU_DFM

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_PsmInfoTimerFunc

+* ²ÎÊý˵Ã÷:     

+*           (IN)  args: ²ÎÊý

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_PsmInfoTimerFunc(SINT32 args)

+{

+    UINT32 status = zOss_PutSemaphore(g_zTos_PsmInfoSema);

+    zOss_AssertExN(status == ZOSS_SUCCESS);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_PsmInfoThreadEntry

+* ²ÎÊý˵Ã÷:     

+*           (IN)  args: ²ÎÊý

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_PsmInfoThreadEntry(SINT32 args)

+{

+    while(1)

+    {

+        zOss_GetSemaphore(g_zTos_PsmInfoSema, ZOSS_WAIT_FOREVER);

+        zOss_PsmTraceInfo();

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_PsmTraceInfo

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_PsmTraceInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 tmp = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+    if ((1 != CmdMsg->paraCount)||(-1 == Shell_StrisNumber(CmdMsg->para[0])))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîµÄ¸ñʽ: psminfo 0»ò1 \n");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±Õ, 1:´ò¿ª\n");

+        return;

+    }

+

+    tmp = strtoul((char*)CmdMsg->para[0], NULL, 0);

+    if (tmp > 1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîµÄ¸ñʽ: psminfo 0»ò1 \n");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±Õ, 1:´ò¿ª\n");

+        return;

+    }

+    

+    if (tmp)

+    {

+        g_zTos_PsmInfoSema   = zOss_CreateSemaphore("psminfosema", 0);

+        g_zTos_PsmInfoTimer  = zOss_CreateTimer("psminfotimer", OSS_PsmInfoTimerFunc, 10, TRUE);

+        g_zTos_PsmInfoThread = zOss_CreateThread("psminfothread", OSS_PsmInfoThreadEntry, 0, 4096, 25, 1, 1);

+        zOss_StartTimer(g_zTos_PsmInfoTimer, 30, OSS_PsmInfoTimerFunc, 0);

+    }

+    else

+    {

+        zOss_DeleteThread(g_zTos_PsmInfoThread);

+        zOss_KillTimer(g_zTos_PsmInfoTimer);

+        zOss_DeleteSemaphore(g_zTos_PsmInfoSema);

+    }

+

+    return;

+}

+#endif // _USE_PSM

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell_thread.c b/cp/ps/plat/src/oss/sup/src/sup_shell_thread.c
new file mode 100755
index 0000000..de1ef8b
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell_thread.c
@@ -0,0 +1,883 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_thread.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ï̡߳¢ÈÎÎñ¡¢CPUÕ¼ÓÃÂÊͳ¼ÆÏà¹ØµÄshellÃüÁî

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2019-01-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#include "sup_shell_cmd.h"

+#include "sup_except.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _OS_WIN

+#ifndef PROCESS

+#define PROCESS ZOSS_THREAD_ID

+#endif

+#endif

+

+#define SHELL_SIGN  "\t================================================================================================================="

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID Shell_ShowThread(T_ZOsa_ThreadUserArea *pThreadInfo);

+static VOID Shell_ShowThreadTitle(VOID);

+

+#ifdef _OS_LINUX

+void linux_thread_sched_stat(int type);

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ZOSS_TIMER_ID   gShell_UpdataCpuTimerId = NULL; /* ¼ÆËãcpuÕ¼ÓÃÂʶ¨Ê±Æ÷ */

+ZOSS_TIMER_ID   gShell_FreshCpuTimerId  = NULL; /* ÏÔʾcpuÕ¼ÓÃÂʶ¨Ê±Æ÷ */

+

+#ifdef _OS_LINUX

+extern void *linux_get_threadID_by_name(const char *name);

+extern void linux_reset_cpupinfo(void);

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+static VOID Shell_ThreadCPU(SINT32 para)

+{

+    if(OSA_IdentifyThread((ZOSS_THREAD_ID)para) == ZOSS_SUCCESS)

+    {        

+        Osa_DisplayThreadExecInfo((PROCESS)para);

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¸ÃÏ̲߳»´æÔÚ");

+    }

+}

+

+static VOID Shell_ThreadsCPU(SINT32 para)

+{

+    Osa_DisplayThreadsExecInfo((UINT32)para);

+}

+

+static VOID Shell_ThreadSetFlagUse(const CHAR *cmd)

+{    

+    zOss_AssertExN(cmd != NULL);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s   m", cmd);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tmȡֵ[0-1]");

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t m = 0±íʾ¹Ø±Õ¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹Ø");

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t m = 1±íʾ´ò¿ª¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹Ø");

+}

+

+static VOID Shell_PrintSysCPU(VOID)

+{

+#ifdef _OS_LINUX

+    UINT32 rate = 0;

+    rate = 100 - Osa_GetProcessCPU(linux_get_threadID_by_name(EXCEP_IDLETHREADNAME));

+    zOss_AssertExN(rate <= 100);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tϵͳCPUÕ¼ÓÃÂÊΪ[%u%%]", rate);

+    rate = 100 - rate;

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tϵͳCPU¿ÕÏÐÂÊΪ[%u%%]", rate);    

+#else

+    FLOAT rate = 0;

+    rate = 100 - Osa_GetProcessCPU(zOss_GetThreadIDByName(EXCEP_IDLETHREADNAME));

+    zOss_AssertExN(rate <= 100);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tϵͳCPUÕ¼ÓÃÂÊΪ[%.2f%%]", rate);

+    rate = 100 - rate;

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tϵͳCPU¿ÕÏÐÂÊΪ[%.2f%%]", rate);

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Shell_UpdateCpuTimerCallBack

+* ¹¦ÄÜÃèÊö£º ¶¨Ê±¼ÆËãCPU¶¨Ê±Æ÷º¯Êý»Øµ÷

+* ²ÎÊý˵Ã÷£º

+   (IN)

+   arg:¶¨Ê±Æ÷»Øµ÷²ÎÊý

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_UpdateCpuTimerCallBack(SINT32 arg)

+{

+    Osa_UpdateCpu();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Shell_SetCpuUpdateTime

+* ¹¦ÄÜÃèÊö£º Ð޸ļÆËãCPU¸üÐÂʱ¼ä

+* ²ÎÊý˵Ã÷£º

+   (IN)

+   time_in_second:¶à³¤Ê±¼ä¼ÆËãÒ»´ÎÏß³ÌCPU(µ¥Î»£ºÃë),·¶Î§2-10

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_SetCpuUpdateTime(UINT32 time_in_second)

+{

+    UINT32 ret          = ZOSS_ERROR;

+    UINT32 freshTime    = 0;

+    

+    if(NULL == gShell_UpdataCpuTimerId)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+    

+    ret = zOss_StopTimer(gShell_UpdataCpuTimerId);  /* ÏÈÍ£Ö¹¶¨Ê±Æ÷ */

+    if(ZOSS_ERROR == ret)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tË¢ÐÂʱ¼äÉèÖÃʧ°Ü");

+        return;

+    }

+    

+    freshTime = time_in_second * 1000;

+    

+    ret = zOss_StartTimer(gShell_UpdataCpuTimerId, freshTime, Shell_UpdateCpuTimerCallBack, 0); /* Æô¶¯¶¨Ê±Æ÷ */

+    if(ZOSS_ERROR == ret)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tË¢ÐÂʱ¼äÉèÖÃʧ°Ü");

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tË¢ÐÂʱ¼äÉèÖóɹ¦");

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Shell_ShowThread

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            pThreadInfo:Ïß³ÌÏêϸÐÅÏ¢½á¹¹ÌåÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+static VOID Shell_ShowThread(T_ZOsa_ThreadUserArea *pThreadInfo)

+{

+    UINT8 index;

+    CHAR status[][10] = {"RUN","READY","BLOCK","UNKNOW"};

+    

+    zOss_AssertExN(pThreadInfo != NULL);

+

+    index = (pThreadInfo->runstatus)/2;

+    if (index >= (sizeof(status) / sizeof(status[0])))

+        index = (sizeof(status) / sizeof(status[0])) - 1;

+

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-40s%p%11s%8u%10.2f%10u%10u%12u%8u%10u",

+                pThreadInfo->threadname, pThreadInfo->threadid, status[index], 

+                pThreadInfo->priority, pThreadInfo->cpupercent, pThreadInfo->stacksize, 

+                pThreadInfo->maxstack, pThreadInfo->RunTimeInMs, pThreadInfo->msgnum, pThreadInfo->runcount);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Shell_ShowThreadTitle

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+static VOID Shell_ShowThreadTitle(VOID)

+{

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-40s%-10s%11s%10s%12s%10s%10s%12s%8s%10s",

+                "ThreadName", "ThreadID", "Status", "Priority", "CpuPercent", "StackSize", "MaxStack",

+                "RunTimeInMs", "MsgNum", "RunCount");

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_DbgShowThreadInfo

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN) 

+			CmdMsg:shellÃüÁî

+			(OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSS_DbgShowThreadInfo(T_Shell_CommandMessage *CmdMsg)

+{

+	UINT32					thread_num			= 0;	/* Ïß³ÌÊý				*/

+	ZOSS_THREAD_ID			*AllThreadIdArray	= NULL; /* ËùÓÐÏß³ÌIDÊý×éÖ¸Õë	*/

+	T_ZOsa_ThreadUserArea	*pThreadInfo		= NULL; /* Ïß³ÌUAÖ¸Õë			*/

+	ZOSS_THREAD_ID			thread_id			= NULL;

+	UINT32					i					= 0;

+	

+	zOss_AssertExN(CmdMsg != NULL);

+	

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tThread Info");

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, SHELL_SIGN);

+	

+	switch (CmdMsg->paraCount)

+	{

+	case 0: 	/* ÏÔʾËùÓÐÏß³ÌÐÅÏ¢ */

+		{

+#ifdef _OS_LINUX

+			linux_thread_sched_stat(0);

+#else

+			Shell_ShowThreadTitle();

+			thread_num = Osa_GetAllThreadId(&AllThreadIdArray); /* º¯ÊýÄÚÉêÇë¿Õ¼ä */

+			

+			if (0 == thread_num)

+			{

+				break;

+			}

+			

+			for (i = 0; i < thread_num; i++)

+			{

+				pThreadInfo = Osa_GetThreadUserArea(AllThreadIdArray[i], TRUE);

+				if (pThreadInfo)

+				{

+					Shell_ShowThread(pThreadInfo);

+				}

+			}

+			zOss_Free(AllThreadIdArray);

+#endif

+			break;

+		}

+	default:

+		{

+			if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s : ÏÔʾÏß³ÌÐÅÏ¢", CmdMsg->cmd);

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t %s  [thread_id]", CmdMsg->cmd);

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t ²ÎÊýthread_idΪָ¶¨Ïß³Ìid,Èç¹û²»Ö¸¶¨,ÏÔʾËùÓÐÏß³ÌÐÅÏ¢");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t½á¹ûÏÔʾÁÐ˵Ã÷:");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ThreadName:ΪÏß³ÌÃû");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ThreadID:Ïß³ÌID");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Status:ÔËÐÐ״̬");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Priority:Ïß³ÌÓÅÏȼ¶");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t CpuPercent:Ïß³ÌʹÓÃÂÊ");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t StackSize:Õ»´óС");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t MaxStack:×î´óջʹÓÃÂÊ");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunTimeInMs:Ïß³ÌÕ»ÔËÐÐʱ¼ä");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t MsgNum:ÏûÏ¢¶ÓÁ㤶È");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunCount:ÔËÐдÎÊý");

+			}

+			else

+			{

+#ifdef  _OS_LINUX

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tLinuxÉϲ»Ö§³Ö²ÎÊý");

+				return;

+#else

+				Shell_ShowThreadTitle();

+				

+				for (i = 0; i < CmdMsg->paraCount; i++)

+				{

+					if (-1 == Shell_StrisNumber(CmdMsg->para[i]))

+					{

+						zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+						return;

+					} 

+					thread_id = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[i], NULL, 0);

+					if (NULL == thread_id)

+					{

+						zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+						return;

+					}

+					

+					if (OSA_IdentifyThread(thread_id) != ZOSS_SUCCESS)

+					{

+						zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, " The thread 0x%08x is not exist!",thread_id);

+						break;

+					}

+					

+					pThreadInfo = Osa_GetThreadUserArea(thread_id, TRUE);

+					if (pThreadInfo)

+					{

+						Shell_ShowThread(pThreadInfo);

+					}

+				}

+#endif

+			}

+			break;

+		}

+	}

+	

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, SHELL_SIGN);

+}

+

+VOID OSS_DbgShowTaskInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_TASK_ID    *task_id_arr        = NULL;

+    T_OSS_PARAM     *pPlatCfg           = NULL;

+    ZOSS_TASK_ID    task_id             = NULL;

+    T_ZOss_TCB      pCurTCB             = {0};

+    UINT32          task_num            = 0;

+    UINT32          i                   = 0;

+    UINT32          nRet                = 0;

+    UINT32          current_ticks       = 0;

+    CHAR            run_stat_str[][6]   = {"ÔÝÍ£","¿ÕÏÐ","¾ÍÐ÷","ÔËÐÐ"};

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾÈÎÎñÐÅÏ¢\n\t %s [taskname]:ÏÔʾÈÎÎñÐÅÏ¢", CmdMsg->cmd, CmdMsg->cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Èç¹û²»Ö¸¶¨ÈÎÎñÃû£¬ÏÔʾËùÓÐÈÎÎñÐÅÏ¢£¨²»°üÀ¨SDLÈÎÎñ£©");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ½á¹ûÏÔʾÁÐ˵Ã÷:");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t TaskName:ΪÈÎÎñÃû");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t TaskID:ÈÎÎñID");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Prior:ÈÎÎñÓÅÏȼ¶");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ThreadID:ÈÎÎñËùÔÚµ÷¶ÈÏß³ÌID");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunState:ÈÎÎñÔËÐÐ״̬£¬¿ÉÄÜΪÔÝÍ££¬¿ÕÏУ¬¾ÍÐ÷£¬ÔËÐÐËÄÖÖÖ®Ò»");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t LifeTime:ÈÎÎñ×Ô´´½¨µ½ÏÖÔÚµÄtickÊý");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunTimeInMs:ÈÎÎñÔËÐÐʱ¼ä");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t CpuPencent:ÈÎÎñcpuÕ¼ÓÃÂÊ");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t MsgCounts:ÈÎÎñÏûÏ¢¶ÓÁÐÖл¹Î´´¦ÀíµÄÏûÏ¢¸öÊý");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunCounts:ÈÎÎñ±»´´½¨Ò»À´Ö´ÐеĴÎÊý");

+        return;

+    }

+    

+    current_ticks = zOss_GetTickCount();

+    if (1 == CmdMsg->paraCount)

+    {

+        task_id = zOss_GetTaskID(CmdMsg->para[0]);

+        

+        if (task_id == ZOSS_INVALID_TASK_ID)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t[ʧ°Ü]ÈÎÎñÃûΪ%s²»´æÔÚ !", CmdMsg->para[0]);

+            return;

+        }

+        

+        nRet = zOss_GetTaskInfo(task_id, &pCurTCB);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t[ʧ°Ü]»ñÈ¡%sÈÎÎñÐÅϢʧ°Ü !", CmdMsg->para[0]);

+            return;

+        }

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tTask Info");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================================================================");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-30s %-10s %8s %-10s %10s %10s %10s %10s %10s %10s","TaskName","TaskID","Prior","ThreadID","RunState","LifeTime","RunTimeInMs","CpuPencent","MsgCounts","RunCounts");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-30s %p%8u  %-10p%8s%10u%10u%10f%10u%10u", pCurTCB.task_name, pCurTCB.task_id, pCurTCB.priority,

+                    pCurTCB.thread_id, run_stat_str[pCurTCB.run_status - 1], current_ticks - pCurTCB.time, pCurTCB.runtime / 1000, pCurTCB.cpupercent, zOss_ListCount(&pCurTCB.msg_queue), pCurTCB.count);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================================================================");

+    }

+    

+    if (0 == CmdMsg->paraCount)

+    {

+        pPlatCfg = zOss_GetOssCfg();

+        task_id_arr = (ZOSS_TASK_ID *)zOss_Malloc(pPlatCfg->TaskCfg.max_task_num * sizeof(ZOSS_TASK_ID));

+        if (NULL == task_id_arr)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tzOss_Malloc for task_id_arr failed!");

+            return;

+        }

+        task_num = zOss_GetAllTaskID(task_id_arr);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tTask Info");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================================================================");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-30s %-10s %8s %-10s %10s %10s %10s %10s %10s %10s","TaskName","TaskID","Prior","ThreadID","RunState","LifeTime","RunTimeInMs","CpuPencent","MsgCounts","RunCounts");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================================================================");

+        

+        for (i = 0; i < task_num; i++)

+        {

+            nRet = zOss_GetTaskInfo(task_id_arr[i], &pCurTCB);

+            if (nRet == ZOSS_ERROR)

+            {

+                continue;   /* Èç¹ûÊÇSDLÈÎÎñÒ²¿ÉÄÜÊÇ·µ»Ø´íÎó */

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-30s %p%8u   %-10p%8s%10u%10u%10f%10u%10u", pCurTCB.task_name, pCurTCB.task_id, pCurTCB.priority,

+                              pCurTCB.thread_id, run_stat_str[pCurTCB.run_status - 1],  current_ticks-pCurTCB.time, pCurTCB.runtime, pCurTCB.cpupercent, zOss_ListCount(&pCurTCB.msg_queue), pCurTCB.count);

+        }

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t=============================================================================================");

+        zOss_Free(task_id_arr);

+    }

+    return;

+}

+

+VOID OSS_DbgDisplayThreadExecInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_THREAD_ID          tid         = ZOSS_INVALID_THREAD_ID;

+    static ZOSS_TIMER_ID    freshTimer = NULL;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if(FALSE == gOsa_SwapTimeFlag)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s   Ïß³ÌID [time]", CmdMsg->cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÏß³ÌID¿ÉÒÔ10½øÖÆÊýºÍ16½øÖÆÊý(ǰ׺0x»ò0X)");    

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t timeΪ¿ÉÑ¡ÏÉèÖÃÏÔʾµÄË¢ÐÂʱ¼ä(µ¥Î»:Ãë)£¬·¶Î§[2~10]£¬Èô²»´øtimeÔòֹͣˢÐÂ");

+        return;

+    }

+    else if(1 == CmdMsg->paraCount || 2 == CmdMsg->paraCount)

+    {

+        if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }                         

+        tid = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+        if (ZOSS_INVALID_THREAD_ID == tid)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }

+        

+        if (1 == CmdMsg->paraCount)

+        {

+            Shell_ThreadCPU((SINT32)tid);

+            if (NULL != freshTimer)

+            {

+                zOss_KillTimer(freshTimer);

+                freshTimer = NULL;

+            }

+            return;

+        }

+        

+        if (2 == CmdMsg->paraCount)

+        {

+            UINT32 freshTime = 0;

+            

+            if (-1 == Shell_StrisNumber(CmdMsg->para[1]))

+            {         

+                return;

+            }

+            

+            freshTime = strtoul((char *)CmdMsg->para[1], (char **)NULL, 0);

+            if (freshTime < 2 || freshTime > 10)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+                return;

+            }

+            if (NULL != freshTimer)

+            {

+                zOss_KillTimer(freshTimer);

+                freshTimer = NULL;

+            }

+            freshTimer = zOss_CreateTimer("Timer_ThreadCPUPrint", (ZOSS_TIMER_FUN)Shell_ThreadCPU, (SINT32)tid, TRUE);

+            if (NULL == freshTimer)

+            {

+                return;

+            }

+            if (ZOSS_ERROR == zOss_StartTimer(freshTimer, (freshTime * 1000), (ZOSS_TIMER_FUN)Shell_ThreadCPU, (SINT32)tid))

+            {

+                zOss_KillTimer(freshTimer);

+                freshTimer = NULL;

+            }

+        }

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+    }

+}

+

+

+VOID OSS_DbgDisplayThreadsExecInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32                  type        = 0;

+    UINT32                  timeLen     = 0;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    if (FALSE == gOsa_SwapTimeFlag)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+    

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s live/lazy/all time1 [time2]", CmdMsg->cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t live:Ö»ÏÔʾ»î¶¯µÄỊ̈߳¬lazy:Ö»ÏÔʾ²»»î¶¯µÄỊ̈߳¬all:ÏÔʾËùÓÐÏß³Ì");    

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t time1ÉèÖÃij¶Îʱ¼äÄÚÏß³ÌÖ´ÐÐÇé¿ö(µ¥Î»:Ãë)£¬·¶Î§[0~10](oseƽ̨Î޸ù¦ÄÜ,ÉèÖÃΪ0), 0±íʾȫ²¿Ê±¼äÄÚµÄÏß³ÌÖ´ÐÐÇé¿ö");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t time2Ϊ¿ÉÑ¡ÏÉèÖÃÏÔʾµÄË¢ÐÂʱ¼ä(µ¥Î»:Ãë,µ±time1Ϊ0ʱÓÐЧ)£¬·¶Î§[2~10]£¬Èô²»´øtime2ÔòֹͣˢÐÂ");

+        return;

+    }

+    else if (2 == CmdMsg->paraCount || 3 == CmdMsg->paraCount)

+    {

+        if (0 == strcmp((char *)CmdMsg->para[0], "live"))

+        {

+            type |= SUP_THREAD_LIVE_BIT; /* Ö»ÏÔʾ»î¶¯µÄÏß³Ì     */

+        }

+        else if (0 == strcmp((char *)CmdMsg->para[0], "lazy"))

+        {

+            type |= SUP_THREAD_LAZY_BIT; /* Ö»ÏÔʾ²»»î¶¯µÄÏß³Ì   */

+        }

+        else if (0 == strcmp((char *)CmdMsg->para[0], "all"))

+        {

+            type = 0;                   /* ÏÔʾËùÓÐÏß³Ì         */

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }

+        

+        if (-1 == Shell_StrisNumber(CmdMsg->para[1]))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }                                     

+        timeLen = strtoul((char *)CmdMsg->para[1], (char **)NULL, 0);

+

+        if (1 <= timeLen && 10 >= timeLen)

+        {

+            type |= SUP_THREAD_STATISTIC_INFO_BIT;

+        }

+        else if (0 != timeLen)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+            return;            

+        }        

+            

+        if (2 == CmdMsg->paraCount)

+        {

+            if (0 != timeLen)

+            {

+#ifdef TOS_STATISTIC_TIMESLICE

+                zOss_StatisticTimesliceStart(timeLen * 1000, type);

+#endif

+            }

+            else

+            {

+                Shell_ThreadsCPU((SINT32)type);

+            }

+            

+            if (NULL != gShell_FreshCpuTimerId)

+            {

+                zOss_KillTimer(gShell_FreshCpuTimerId);

+                gShell_FreshCpuTimerId = NULL;

+            }        

+            return;

+        }

+        

+        if (3 == CmdMsg->paraCount)

+        {

+            UINT32 freshTime = 0;

+            

+            if (0 != timeLen || -1 == Shell_StrisNumber(CmdMsg->para[2]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+                return;

+            }                                     

+            freshTime = strtoul((char *)CmdMsg->para[2], (char **)NULL, 0);

+            if (freshTime < 2 || freshTime > 10)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+                return;

+            }

+            if (NULL != gShell_FreshCpuTimerId)

+            {

+                zOss_KillTimer(gShell_FreshCpuTimerId);

+                gShell_FreshCpuTimerId = NULL;

+            }

+            gShell_FreshCpuTimerId = zOss_CreateTimer("Timer_ThreadsCPUPrint", (ZOSS_TIMER_FUN)Shell_ThreadsCPU, (long)type, TRUE);

+            if (NULL == gShell_FreshCpuTimerId)

+            {

+                return;

+            }

+            if (ZOSS_ERROR == zOss_StartTimer(gShell_FreshCpuTimerId, (freshTime * 1000), (ZOSS_TIMER_FUN)Shell_ThreadsCPU, (long)type))

+            {

+                zOss_KillTimer(gShell_FreshCpuTimerId);

+                gShell_FreshCpuTimerId = NULL;

+            }

+        }  

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+    }      

+}

+

+VOID OSS_DbgSetUpdateCPUTime(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 new_time = 0;

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if(FALSE == gOsa_SwapTimeFlag)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+

+    if (1 == CmdMsg->paraCount)

+    {

+        if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s time", CmdMsg->cmd);

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t time:Ë¢ÐÂʱ¼äÒªÇóÔÚ[2-10]ÃëÖ®¼ä");    

+            return;

+        }

+        else if (0 == Shell_StrisNumber(CmdMsg->para[0]))

+        {

+            new_time = strtoul((char *)CmdMsg->para[0], NULL, 0);

+            if (new_time >= 2 && new_time <= 10)

+            {

+                Shell_SetCpuUpdateTime(new_time);

+                return;

+            }

+        }

+    }

+    

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+

+}

+

+VOID OSS_DbgThreadSetFlag(T_Shell_CommandMessage *CmdMsg)

+{

+    BOOL        enableRunTime   = FALSE;

+    T_OSS_PARAM *pPlatCfg       = NULL;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    if (1 != CmdMsg->paraCount)

+    {

+        Shell_ThreadSetFlagUse(CmdMsg->cmd);

+        return;

+    }

+    if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+    {

+        Shell_ThreadSetFlagUse(CmdMsg->cmd);

+        return;

+    }

+

+    enableRunTime = (BOOL)strtoul((char *)CmdMsg->para[0], NULL, 0);

+

+    Osa_SwapCtl(enableRunTime);

+    

+    if (enableRunTime)

+    {

+        UINT32 freshTime = 0;

+

+        pPlatCfg    = zOss_GetOssCfg();

+        freshTime   = pPlatCfg->ExcepCfg.UpdateCPUTime;

+        

+#ifdef _OS_TOS

+# ifdef CYGOPT_KERNEL_EXTEND_CLOCK_STATISTIC_TIMESLICE

+        cyg_set_statistic_counter_flag(TRUE);

+# endif

+# ifdef CYGOPT_KERNEL_EXTEND_THREAD_STATISTIC_TIMESLICE

+        cyg_thread_set_statistic_timeslice_flag(TRUE);

+# endif

+#endif

+        if (NULL != gShell_UpdataCpuTimerId)

+        {

+            zOss_KillTimer(gShell_UpdataCpuTimerId);

+            gShell_UpdataCpuTimerId = NULL;

+        }

+        gShell_UpdataCpuTimerId = zOss_CreateTimer("Shell_UpdateCpuTimer", Shell_UpdateCpuTimerCallBack, 0, TRUE);

+        if (NULL == gShell_UpdataCpuTimerId)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t´ò¿ª¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹ØÊ§°Ü");

+            return;

+        }

+        if (ZOSS_ERROR == zOss_StartTimer(gShell_UpdataCpuTimerId, freshTime, Shell_UpdateCpuTimerCallBack, 0))

+        {

+            zOss_KillTimer(gShell_UpdataCpuTimerId);

+            gShell_UpdataCpuTimerId = NULL;

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t´ò¿ª¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹ØÊ§°Ü");

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³É¹¦´ò¿ª¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹Ø");

+        }

+        

+    }

+    else

+    {

+        UINT32                  i                   = 0;

+        UINT32                  totalNum            = 0;

+        T_ZOss_TCB              *pTCB               = NULL;

+        ZOSS_TASK_ID            *taskIdArray        = NULL;

+        ZOSS_THREAD_ID          *allThreadIdArray   = NULL;

+        T_ZOsa_ThreadUserArea   *pThreadInfo        = NULL;

+

+        if (NULL != gShell_UpdataCpuTimerId)

+        {

+            zOss_KillTimer(gShell_UpdataCpuTimerId);

+            gShell_UpdataCpuTimerId = NULL;

+        }

+        if(NULL != gShell_FreshCpuTimerId)

+        {

+            zOss_KillTimer(gShell_FreshCpuTimerId);

+            gShell_FreshCpuTimerId = NULL;

+        }

+#ifdef _OS_TOS

+# ifdef CYGOPT_KERNEL_EXTEND_CLOCK_STATISTIC_TIMESLICE

+        cyg_set_statistic_counter_flag(FALSE);

+        cyg_zero_statistic_counter_value();

+# endif

+# ifdef CYGOPT_KERNEL_EXTEND_THREAD_STATISTIC_TIMESLICE

+        cyg_thread_set_statistic_timeslice_flag(FALSE);

+        cyg_thread_zero_all_statistic_timeslice();

+# endif

+#endif

+

+#ifdef _OS_LINUX

+        linux_reset_cpupinfo();

+#else

+        totalNum = Osa_GetAllThreadId(&allThreadIdArray);                

+        for (i = 0; i < totalNum; i++)

+        {

+            pThreadInfo = Osa_GetThreadUserArea(allThreadIdArray[i], TRUE);

+            if (pThreadInfo)

+            {

+                pThreadInfo->cputime        = 0;

+                pThreadInfo->runtime        = 0;

+                pThreadInfo->RunTimeInMs    = 0;

+                pThreadInfo->runcount       = 0;

+                pThreadInfo->cpupercent     = 0;

+            }

+        }

+        zOss_Free(allThreadIdArray);

+        

+        pPlatCfg    = zOss_GetOssCfg();

+        taskIdArray = (ZOSS_TASK_ID *)zOss_Malloc(pPlatCfg->TaskCfg.max_task_num * sizeof(ZOSS_TASK_ID));

+        totalNum    = zOss_GetAllTaskID(taskIdArray);

+        for (i = 0; i < totalNum; i++)

+        {

+            pTCB = (T_ZOss_TCB *)taskIdArray[i];

+            if (pTCB != pTCB->task_id)

+            {

+                continue;

+            }

+            pTCB->cputime       = 0;

+            pTCB->cpupercent    = 0;

+            pTCB->runtime       = 0;

+        }

+        zOss_Free(taskIdArray);

+#endif

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³É¹¦¹Ø±Õ¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹Ø");

+    }

+}

+

+VOID OSS_DbgGetSysCPU(T_Shell_CommandMessage *CmdMsg)

+{

+    static ZOSS_TIMER_ID sys_timer = NULL;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    if(FALSE == gOsa_SwapTimeFlag)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            Shell_PrintSysCPU();

+            if (NULL != sys_timer)

+            {

+                zOss_KillTimer(sys_timer);

+                sys_timer = NULL;

+            }

+            break;

+        }   

+    case 1:

+        {

+            UINT32 freshTime = 0;

+            if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s [time]", CmdMsg->cmd);

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t timeΪ¿ÉÑ¡ÏÉèÖÃÏÔʾµÄË¢ÐÂʱ¼ä(µ¥Î»:Ãë)£¬·¶Î§[2~10]£¬Èô²»´øtimeÔòֹͣˢÐÂ");

+                break;

+            }

+

+            if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+                break;

+            }

+            freshTime = strtoul((char *)CmdMsg->para[0], (char **)NULL, 0);

+            if (freshTime < 2 || freshTime > 10)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+                break;

+            }

+            if (NULL != sys_timer)

+            {

+                zOss_KillTimer(sys_timer);

+                sys_timer = NULL;

+            }

+            sys_timer = zOss_CreateTimer("Timer_SysCPUPrint", (ZOSS_TIMER_FUN)Shell_PrintSysCPU, 0, TRUE);

+            if (NULL == sys_timer)

+            {

+                break;

+            }

+            if (ZOSS_ERROR == zOss_StartTimer(sys_timer, (freshTime * 1000), (ZOSS_TIMER_FUN)Shell_PrintSysCPU, 0))

+            {

+                zOss_KillTimer(sys_timer);

+                sys_timer = NULL;

+            }

+            break;

+        }

+    default:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_StartDaemonTask

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_StartDaemonTask(T_Shell_CommandMessage *CmdMsg)

+{

+    if(0 == strcmp(CmdMsg->para[0], "help") && CmdMsg->paraCount == 1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Æô¶¯ÈÎÎñµÄËÀÑ­»·¼à²â£¬¸ÃÃüÁî²»´ø²ÎÊý;");

+        return;

+    }

+

+    if (CmdMsg->paraCount != 0)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîÊäÈë´íÎó;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÇëÊäÈë%s help²é¿´¸ÃÃüÁîµÄ¹¦ÄÜ;", CmdMsg->cmd);

+        return;

+    }

+

+    if(ZOSS_SUCCESS == EXCEP_StartDaemonTask())

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:Æô¶¯³É¹¦", CmdMsg->cmd);

+

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:Æô¶¯Ê§°Ü", CmdMsg->cmd);

+    }

+

+    return;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_sys.c b/cp/ps/plat/src/oss/sup/src/sup_sys.c
new file mode 100644
index 0000000..636a6f3
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_sys.c
@@ -0,0 +1,581 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sysmgt.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : OSSÖ÷¿ØÈÎÎñ

+* ×÷    Õß : xiaxinguo

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-07-16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup.h"

+#include "drv_api.h"

+#include "ThreadPriority.h"

+#include "osa_ramdump.h"

+#include "sup_task.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define SYSM_STATUS_STARTTASK   (ZOSS_STATUS_USERBASE + 1)

+#define SYSM_TASK_NAME          "zOss_SysmTask"

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    T_ZOss_TaskTabItem *curreatpTaskItem;

+}T_P_DATA;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID Sysm_MainProc(UINT8 state, UINT32 msgId, UINT8 *pBuf, UINT16 msgLen, UINT8 *private_data);

+static UINT32 Sysm_PoweronTasks(VOID);

+static UINT32 Sysm_InitTasks(T_ZOss_TaskTabItem *pTaskItem, UINT32 task_index); 

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ZOSS_TASK_ID                gSysm_SysMTaskID        = ZOSS_INVALID_TASK_ID;

+static UINT32               gSysm_AckTaskIndex      = 0;

+static BOOL                 bInit                   = FALSE;

+static T_ZOss_TaskTabItem   *gSysm_TaskTab          = NULL;

+ZOSS_TASK_ID                *gSysm_TaskIDTab        = NULL;

+static UINT32               gSche_Max_TaskTab_Num   = 0;

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_OSE

+extern UINT32 SYSTIME_Init(VOID);

+#endif

+

+#ifdef _OS_LINUX

+extern void zx29_restart(char str, const char *cmd);

+#endif

+

+#ifdef _USE_WBT

+extern VOID zWbt_Entry(VOID);

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Init

+* ¹¦ÄÜÃèÊö£ºOSS×Óϵͳ³õʼ»¯º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Init(VOID)

+{

+    T_OSS_PARAM *pPlatCfg   = NULL;

+    UINT32      nRet        = ZOSS_SUCCESS;

+    

+    if (bInit == TRUE)             /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_SUCCESS;

+    }

+

+    /* oss cfg fs mount*/

+#ifdef _OS_TOS

+    nRet = zOss_FsMount();

+    if (nRet != ZOSS_SUCCESS)

+    {

+        zOss_RamLog((CHAR *)"SysEntry: zOss_FsMount Fail, Code=%d!", nRet);

+        return ZOSS_ERROR;

+    }

+#endif

+

+    /* Timer Init */

+#ifdef _OS_WIN

+    nRet = TIMER_Init();

+    if (nRet != ZOSS_SUCCESS)

+    {

+        zOss_RamLog((CHAR *)"SysEntry: TIMER_Init Fail, Code=%d!", nRet);

+        return ZOSS_ERROR;

+    }

+    zOss_RamLog((CHAR *)"SysEntry(%d): TIMER_Init Start OK!", zOss_GetTickCount());

+#endif

+    

+#if 0

+    /* NV Init */

+    #ifndef _USE_SMALL_VERSION

+    nRet = NV_Init();

+    if (nRet != ZOSS_SUCCESS)

+    {

+        zOss_RamLog((CHAR *)"SysEntry: NV_Init Fail, Code=%d!", nRet);

+        return ZOSS_ERROR;

+    }

+    zOss_RamLog((CHAR *)"SysEntry(%d): NV_Init Start OK!", zOss_GetTickCount());

+    #endif

+#endif

+    /* ²ÎÊýÅäÖà */

+    pPlatCfg = zOss_GetOssCfg();

+    gSysm_TaskTab = pPlatCfg->SysmCfg.pSysm_TaskItemTab;

+    gSche_Max_TaskTab_Num = pPlatCfg->SysmCfg.task_num;

+    if (gSche_Max_TaskTab_Num > pPlatCfg->TaskCfg.max_task_num)

+    {

+        return ZOSS_ERROR;

+    }

+    if (gSche_Max_TaskTab_Num != 0)

+    {

+        gSysm_TaskIDTab = (ZOSS_TASK_ID *)zOss_Malloc(sizeof(ZOSS_TASK_ID) * gSche_Max_TaskTab_Num);

+        if (gSysm_TaskIDTab == NULL)

+        {

+            return ZOSS_ERROR;

+        }

+        zOss_Memset((UINT8 *)gSysm_TaskIDTab, 0, sizeof(ZOSS_TASK_ID) * gSche_Max_TaskTab_Num);

+    }

+    

+    /* ³õʼ»¯OSS¸÷Ä£¿é£¬Æô¶¯ÏȺó´ÎÐò²»µÃ¸ü¸Ä */

+    /* ³õʼ»¯Sche */

+    nRet = SCHE_Init();

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+    /* ³õʼ»¯Except */

+    nRet = EXCEP_Init();

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+    /* ³õʼ»¯test */

+#ifdef ZOSS_TEST_MODE

+    nRet = TEST_Init();

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+#ifdef _USE_PSM

+    /* Ê¡µç¹ÜÀí³õʼ»¯ */

+#ifdef _USE_PSM_NEW_FRAMEWORK

+    nRet = zOss_PsmInit();

+#else

+    nRet = PSM_Init();

+#endif

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }    

+#endif

+

+#ifdef _OS_WIN

+    FS_Init();

+#endif

+

+#ifdef _OS_OSE

+    nRet = SYSTIME_Init();

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+

+#ifdef _USE_WBT

+    zWbt_Entry();

+#endif

+

+    /* Ramdump Init */   

+    zOss_RamdumpInit();

+

+    bInit = TRUE;

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Start

+* ¹¦ÄÜÃèÊö£ºOSSÆô¶¯º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Start(VOID)

+{

+    /* ´´½¨ÏµÍ³ÈÎÎñ */

+    ZOSS_TASK_ID taskId = zOss_CreateTask(SYSM_TASK_NAME, Sysm_MainProc, 2 * 1024, THR_SYSM_PRI, 1024, 0);

+    if (ZOSS_INVALID_TASK_ID == taskId)

+    {

+        return ZOSS_ERROR;    

+    }

+    

+    gSysm_SysMTaskID = taskId;

+    return zOss_TaskSend(EV_POWERON, NULL, 0, taskId); /* ÏòÖ÷ÈÎÎñ·¢ÉϵçÏûÏ¢ */

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskStartOK

+* ¹¦ÄÜÃèÊö£ºÓÉÏàÓ¦ÈÎÎñµ÷ÓÃ, ÈÎÎñÔÚ´¦ÀíÍêEVENT_INITºó, µ÷Óñ¾º¯Êý£¬

+            ֪ͨÖ÷¿ØÈÎÎñÆô¶¯µÇ¼Ç±íÖÐÏÂÃæµÄÈÎÎñ.

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_TaskStartOK(VOID)

+{

+    UINT32 nRet = ZOSS_SUCCESS;

+    

+    if (ZOSS_INVALID_TASK_ID == gSysm_SysMTaskID)

+    {

+        gSysm_SysMTaskID = zOss_GetTaskID(SYSM_TASK_NAME);  /* »ñÈ¡Ö÷¿ØÈÎÎñID */

+    

+        zOss_AssertExN(ZOSS_INVALID_TASK_ID != gSysm_SysMTaskID);

+    }

+    nRet = zOss_TaskSend(EV_POWERON_OK, NULL, 0, gSysm_SysMTaskID);

+

+    zOss_ASSERT(nRet != ZOSS_ERROR);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SysPowerdown

+* ¹¦ÄÜÃèÊö£º¹Ø»ú

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SysPowerdown(VOID)

+{

+    zOss_NvramFlush();

+#ifdef _USE_OSS_FS

+    zOss_SyncFS();

+#endif

+    zDrv_ShutDown();

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SysSoftReset

+* ¹¦ÄÜÃèÊö£ºÈí¼þÖØÆô

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SysSoftReset(T_ZOssSys_RESET_TYPE type)

+{

+    if (SYS_RESET_TO_EXCEPTRESET != type)

+    {

+        zOss_NvramFlush();

+#ifdef _USE_OSS_FS

+        zOss_SyncFS();

+#endif

+    }

+

+#ifdef _OS_LINUX

+    switch(type)

+    {

+        case SYS_RESET_TO_CHARGER:

+            zx29_restart(0, "drv_key reboot");

+            break;

+        case SYS_RESET_TO_ALRAM:

+            zx29_restart(0, "mmi_rtc reboot");

+            break;

+        case SYS_RESET_TO_EXCEPTRESET:

+            zx29_restart(0, "drv_except reboot");

+            break;			

+        case SYS_RESET_TO_NORMAL:

+        default:

+            zx29_restart(0, NULL);

+    }

+#else

+    switch(type)

+    {

+        case SYS_RESET_TO_NORMAL:

+            zDrv_Soft_Reset(RESET_TO_NORMAL);

+            break;

+        case SYS_RESET_TO_CHARGER:

+            zDrv_Soft_Reset(RESET_TO_CHARGER);

+            break;

+        case SYS_RESET_TO_ALRAM:

+            zDrv_Soft_Reset(RESET_TO_ALRAM);

+            break;

+        case SYS_RESET_TO_EXCEPTRESET:

+            zDrv_Soft_Reset(RESET_TO_EXCEPTRESET);

+            break;

+        default:

+            zDrv_Soft_Reset(RESET_TO_NORMAL);

+            break;

+    }

+#endif

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSysm_MainProc

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨ÈÎÎñÆô¶¯£¬Ð­ÒéÕ»ÈÎÎñ¹ÜÀí

+* ²ÎÊý˵Ã÷£º(IN)

+            state:ÈÎÎñ״̬

+            msgId:ÏûÏ¢ID

+            pBuf:ÏûÏ¢Ìå

+            msgLen:ÏûÏ¢³¤¶È

+            pPrivateData:˽ÓÐÊý¾Ý

+            (OUT)

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static VOID Sysm_MainProc(UINT8 state, UINT32 msgId, UINT8 *pBuf, UINT16 msgLen, UINT8 *pPrivateData)

+{

+    UINT32      task_index  = 0;

+    UINT32      nRet        = 0;

+    T_P_DATA    *ptPData    = NULL;

+    

+    ptPData = (T_P_DATA *)pPrivateData;

+    switch (state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch (msgId)

+            {

+            case EV_INIT:

+                {

+                    break;

+                }

+            case EV_POWERON:

+                {

+                    /* Æô¶¯ÈÎÎñ */

+                    ptPData->curreatpTaskItem = gSysm_TaskTab;

+                    task_index = 0;

+                    task_index = Sysm_InitTasks(ptPData->curreatpTaskItem, task_index);

+                    if (gSche_Max_TaskTab_Num == task_index)

+                    {

+                        /* È«²¿Æô¶¯Íê³É */

+                        nRet = Sysm_PoweronTasks();

+                        zOss_AssertExN(ZOSS_ERROR != nRet);

+            

+                        zOss_SetState(ZOSS_STATUS_WORK);

+                    }

+                    else if (gSche_Max_TaskTab_Num < task_index)

+                    {

+                        zOss_ASSERT(0);/* ´íÎó */

+                    }

+                    else

+                    {

+                        zOss_SetState(SYSM_STATUS_STARTTASK);

+                    }

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Sysm_MainProc > Recv unknown msgid=%d\n", msgId);

+                    break;

+                }

+            }

+            break;

+        }

+        

+    case SYSM_STATUS_STARTTASK:

+        {

+            switch (msgId)

+            {

+            case EV_POWERON_OK:

+                {

+                    task_index = Sysm_InitTasks(ptPData->curreatpTaskItem, gSysm_AckTaskIndex + 1);

+                    if (gSche_Max_TaskTab_Num == task_index)

+                    {

+                        /* È«²¿Æô¶¯Íê³É */

+                        nRet = Sysm_PoweronTasks();

+                        if (ZOSS_SUCCESS == nRet)

+                        {

+                            zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Poweron All Task OK!!!\n");

+                        }

+                        else

+                        {

+                            zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Poweron Task Fail!!!\n");

+                        }

+                        zOss_SetState(ZOSS_STATUS_WORK);

+                    }

+                    else if (gSche_Max_TaskTab_Num < task_index)

+                    {

+                        /* ´íÎó */

+                    }

+                    

+                    break;

+                }

+            case EV_SYSM_DOWN:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "System Down!!!\n");

+                    Nvram_Finish();

+                    zOss_Sleep(500);

+                    zDrv_ShutDown();

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Sysm_MainProc > Recv unknown msgid=%d\n", msgId);

+                    break;

+                }

+            }

+            break;

+        }

+        

+    case ZOSS_STATUS_WORK:

+        {

+            switch (msgId)

+            {

+            case EV_SYSM_DOWN:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "System Down!!!\n");

+                    Nvram_Finish();

+                    zOss_Sleep(500);

+                    zDrv_ShutDown();

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Sysm_MainProc > Recv unknown msgid=%d\n", msgId);

+                    break;

+                }

+            }

+            break;

+        }

+        

+    default:

+        {

+            zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Sysm_MainProc: recv unknown msgid=%d\n", msgId);

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSysm_PoweronTasks

+* ¹¦ÄÜÃèÊö£ºÆô¶¯ÈÎÎñ×¢²á±íÖеÄÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static UINT32 Sysm_PoweronTasks(VOID)

+{

+    UINT32 task_index   = 0;

+    UINT32 nRet         = ZOSS_SUCCESS;

+    

+    for ( ; task_index < gTask_TaskNum; task_index++)

+    {

+        nRet = zOss_GetSemaphore(gSche_SaticTaskInitSema, ZOSS_WAIT_FOREVER);

+        if (nRet != ZOSS_SUCCESS)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    nRet = zOss_DeleteSemaphore(gSche_SaticTaskInitSema);

+    

+    if (nRet != ZOSS_SUCCESS)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    for ( task_index = 0; task_index < gSche_Max_TaskTab_Num; task_index++)

+    {

+        if (NULL != gSysm_TaskIDTab[task_index])

+        {

+            nRet = zOss_TaskSend(EV_POWERON, NULL, 0, gSysm_TaskIDTab[task_index]);

+            if (ZOSS_ERROR == nRet)

+            {

+                zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Fail!\n");

+                return nRet;

+            }

+        }

+    }

+    

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSysm_InitTasks

+* ¹¦ÄÜÃèÊö£ºÆô¶¯ÈÎÎñ×¢²á±íÖеÄÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            pTaskItem:ÈÎÎñ×¢²á±í

+            task_index:ÈÎÎñ×¢²á±íÀïµÄÐòºÅ

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»Ø×îºóÆô¶¯µÄÄǸöÈÎÎñµÄϸöÈÎÎñµÄÐòÁкÅ,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static UINT32 Sysm_InitTasks(T_ZOss_TaskTabItem *pTaskItem, UINT32 task_index)

+{

+    UINT32 nRet = ZOSS_ERROR;

+    

+    zOss_AssertEx(pTaskItem != NULL && task_index <= gSche_Max_TaskTab_Num, ZOSS_ERROR);

+    

+    pTaskItem = pTaskItem + task_index;

+    

+    for ( ; task_index < gSche_Max_TaskTab_Num; task_index++)

+    {

+        if (1 == pTaskItem->is_use)

+        {

+            zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "[%d]Start Task %s ", task_index, pTaskItem->task_name);

+            

+            /* ·¢Ëͳõʼ»¯ÏûÏ¢ */

+            nRet = zOss_TaskSend(EV_INIT, NULL, 0, gSysm_TaskIDTab[task_index]);

+            

+            if (nRet == ZOSS_ERROR)

+            {

+                zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Fail!\n");

+                return ZOSS_ERROR;

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "OK!\n");

+            }

+            

+            if (1 == pTaskItem->ack_flag)

+            {

+                gSysm_AckTaskIndex = task_index;

+                zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Wait Ack!!!\n");

+                return task_index;

+            }

+        }

+        

+        pTaskItem++;

+    }

+

+    return task_index;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_task.c b/cp/ps/plat/src/oss/sup/src/sup_task.c
new file mode 100755
index 0000000..0be13eb
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_task.c
@@ -0,0 +1,2427 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS 

+* ÎÄ ¼þ Ãû : taskmgt.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÈÎÎñ¹ÜÀíÄ£¿é

+* ×÷    Õß : xiaxinguo

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-07-16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup_task.h"

+#include "osa.h"

+#include "sup.h"

+#include "ThreadPriority.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* ÈÎÎñ¹ÜÀíÄ£¿éÏûÏ¢¶¨Òå */

+#define EV_TASK_END         (UINT32)(EV_ZOSS_SCHE_BASE + 0) /* ÈÎÎñÍ˳öÏûÏ¢     */

+#define EV_TASK_CRE         (UINT32)(EV_ZOSS_SCHE_BASE + 1) /* ÈÎÎñ´´½¨ÏûÏ¢     */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+static struct

+{

+    Task_SEND_HOOK          send_to;

+    Task_SEND_DATA_HOOK     send_data_to;

+    Task_GET_ALL_ID_HOOK    get_all_id;

+    Task_GET_ID_HOOK        get_id;

+    Task_GET_THAKNAME_HOOK  get_name;

+}gSche_Task_Hook; 

+

+typedef struct 

+{

+    ZOSS_TASK_ID    task_id;

+    UINT32          msg_id;

+    UINT32          arg;

+    T_TIMER_NODE    *pTimerNode;

+}T_Task_Arg;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID Sche_DefTaskEntry(SINT32 arg);      /* µ÷¶ÈÏß³ÌÈë¿Úº¯Êý     */

+static UINT32 Sche_AddTCB(T_ZOss_TCB *ptTcb);   /* TCB±í¿ØÖƺ¯ÊýÉêÃ÷    */

+static UINT32 Sche_RemoveTCB(T_ZOss_TCB *pDelTcb);

+static T_ZOss_TCB *Sche_GetTCB(const ZOSS_TASK_ID taskId);

+static VOID TaskTimer_CallBack(T_Task_Arg *task_arg);

+static BOOL Timer_IgnoreTaskMsg(ZOSS_TIMER_ID timerId);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ZOSS_SEMAPHORE_ID                      gSche_SaticTaskInitSema = NULL;

+__tcm_data UINT32                      gTask_TaskNum           = 0;

+__tcm_data static T_ZOss_TCB           *gSche_TCBHeadPtr       = NULL;

+__tcm_data static T_ZOss_TCB           *gSche_TCBTailPtr       = NULL;

+__tcm_data static UINT32               gSche_MaxTCBLen         = 0;

+__tcm_data static ZOSS_MUTEX_ID        gSche_TCBMutex          = NULL;

+__tcm_data static ZOSS_MUTEX_ID        gSche_TRFMutex          = NULL;

+__tcm_data static ZOSS_MUTEX_ID        gSche_CreMutex          = NULL;

+__tcm_data static T_ZOss_List          gSche_TRF_List;

+__tcm_data static BOOL                 gSche_IsTaskInit        = FALSE;

+__tcm_data static UINT32               gSche_pDataRegion_Test  = 0x5a5a5a5a;

+__tcm_data static T_ZOss_TRF           *gSche_ThreadItemTab    = NULL;   

+__tcm_data static UINT32               gSche_Max_TaskTab_Num   = 0;

+__tcm_data static UINT32               gSche_Max_Thread_Num    = 0;

+__tcm_data static UINT32               gSche_Max_MsgQueue_Len  = 0;

+__tcm_data static UINT32               gSche_DeadLoop_Time     = 0;

+__tcm_data static UINT32               gSche_TaskNum           = 0;

+__tcm_data static T_ZOss_TaskTabItem   *gSche_TaskItemTab      = NULL;

+extern BOOL         gOsa_SwapTimeFlag;

+extern ZOSS_TASK_ID gExcep_DaemonTask;

+extern ZOSS_TASK_ID         *gSysm_TaskIDTab;

+

+#ifdef _USE_SDL

+__tcm_data tasksdl_desc  *tasksdl_table = NULL; 

+extern const UINT32 nof_signalcode;

+extern struct signalcode_desc signalcode_table[];

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSCHE_Init

+* ¹¦ÄÜÃèÊö£º³õʼ»¯ÈÎÎñ¹ÜÀíÄ£¿é

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 SCHE_Init(VOID)

+{

+    T_ZOss_TRF      *pTRF       = NULL;

+    T_OSS_PARAM     *pPlatCfg   = NULL;

+    ZOSS_THREAD_ID  threadId    = NULL;

+    UINT32          i           = 0;

+    UINT32          nRet        = ZOSS_ERROR;

+    UINT32          priority[8] = {THR1_PRI, THR2_PRI, THR3_PRI, THR4_PRI, THR5_PRI, THR6_PRI, THR7_PRI, THR8_PRI}; 

+    UINT32          *stSize     = NULL;

+    

+    if (gSche_IsTaskInit)            

+    {

+        return ZOSS_SUCCESS;

+    }

+    

+    /* ²ÎÊýÅäÖà */

+    pPlatCfg = zOss_GetOssCfg();

+    gSche_Max_TaskTab_Num = pPlatCfg->TaskCfg.max_task_num;

+    if (gSche_Max_TaskTab_Num < 1)

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_Max_Thread_Num = pPlatCfg->TaskCfg.max_schthread_num;

+    if (!gSche_Max_Thread_Num || gSche_Max_Thread_Num > sizeof(priority)/sizeof(priority[0]))

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_TaskItemTab = pPlatCfg->SysmCfg.pSysm_TaskItemTab;

+    gSche_TaskNum = pPlatCfg->SysmCfg.task_num;

+    

+    gSche_Max_MsgQueue_Len = pPlatCfg->TaskCfg.max_msg_queue_len;

+    if (gSche_Max_MsgQueue_Len < 1)

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_DeadLoop_Time = pPlatCfg->TaskCfg.deadloop_time;

+    

+    /* ¶¯Ì¬¿Õ¼äÉêÇë */

+    if (gSche_ThreadItemTab == 0)

+    {

+        gSche_ThreadItemTab = (T_ZOss_TRF *)zOss_Malloc(sizeof(T_ZOss_TRF) * gSche_Max_Thread_Num);

+        if (gSche_ThreadItemTab == NULL)

+        {

+            return ZOSS_ERROR;

+        }

+        zOss_Memset((UINT8 *)gSche_ThreadItemTab, 0, sizeof(T_ZOss_TRF) * gSche_Max_Thread_Num);

+    }

+        

+    /* ´´½¨»¥³â */

+    gSche_TCBMutex = zOss_CreateMutex("gSche_TCBMutex", ZOSS_INHERIT);   /* ´´½¨TCB±í»¥³âÌå */

+    if (NULL == gSche_TCBMutex)

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_TRFMutex = zOss_CreateMutex("gSche_TRFMutex", ZOSS_INHERIT);   /* ´´½¨TRF±í»¥³âÌå */

+    if (NULL == gSche_TRFMutex)

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_CreMutex = zOss_CreateMutex("gSche_CreMutex", ZOSS_INHERIT);   /* ´´½¨Create»¥³âÌå */

+    if (NULL == gSche_CreMutex)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_ListInit(&gSche_TRF_List);          /* ³õʼ»¯TRFÁ´±í */

+    

+    stSize = (UINT32 *)zOss_Malloc(gSche_Max_Thread_Num * sizeof(UINT32));

+    if (!stSize)

+        return ZOSS_ERROR;

+

+    for (i = 0; i < gSche_Max_Thread_Num; i++)

+    {

+        stSize[i] = 4096;

+    }

+    

+    for (i = 0; i < gSche_TaskNum; i++)

+    {

+        if ((gSche_TaskItemTab + i)->process_no > 0 && (gSche_TaskItemTab + i)->process_no <= gSche_Max_Thread_Num)

+        {

+            if ((gSche_TaskItemTab + i)->stack_size > stSize[(gSche_TaskItemTab + i)->process_no - 1])

+            {

+                stSize[(gSche_TaskItemTab + i)->process_no - 1] = (gSche_TaskItemTab + i)->stack_size;

+            }

+        }

+    }

+

+    for (i = 0; i < gSche_Max_Thread_Num; i++)  /* ´´½¨µ÷¶ÈÏß³Ì */

+    {

+        pTRF = &gSche_ThreadItemTab[i];

+        sprintf((char *)pTRF->thread_name, "thread%lu", i + 1);

+        pTRF->priority = priority[i];

+        pTRF->pno = 1;

+        

+        /* ´´½¨Ïß³Ì */

+        threadId = zOss_CreateThread(pTRF->thread_name, Sche_DefTaskEntry, (SINT32)pTRF, stSize[i], pTRF->priority, 1, 0);

+        if (threadId == ZOSS_INVALID_THREAD_ID)

+        {

+            zOss_Free((VOID *)stSize);

+            return ZOSS_ERROR;

+        }

+        

+        zOss_ListInit(&pTRF->TCBReady);      /* ³õʼ»¯¾ÍÐ÷ÈÎÎñÁ´±í */

+        zOss_ListInit(&pTRF->TCBStopped);    /* ³õʼ»¯ÔÝÍ£ÈÎÎñÁ´±í */

+        zOss_ListInit(&pTRF->TCBIdle);       /* ³õʼ»¯¿ÕÏÐÈÎÎñÁ´±í */

+        pTRF->thread_id = threadId;

+        zOss_ListAdd(&gSche_TRF_List, &(pTRF->node));

+        nRet = Sche_SetTaskID(threadId, pTRF);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_Free((VOID *)stSize);

+            return ZOSS_ERROR;

+        }

+    }

+    

+    zOss_Free((VOID *)stSize);

+    

+    

+    /* Æô¶¯µ÷¶ÈÏß³Ì */

+    for (i = 0; i < gSche_Max_Thread_Num; i++)

+    {

+        pTRF = &gSche_ThreadItemTab[i];

+        nRet = zOss_ResumeThread(pTRF->thread_id);

+        if (nRet == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    gSche_MaxTCBLen  = 0;

+    gSche_IsTaskInit = TRUE;

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Task_HookSet

+* ¹¦ÄÜÃèÊö£ºÉèÖÃSDLÏà¹Ø»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Task_HookSet(UINT8 type, VOID *HookFunc)

+{

+    switch (type)

+    {

+    case ZOSS_SETHOOK_SEND:

+        {

+            gSche_Task_Hook.send_to = (Task_SEND_HOOK)HookFunc;           

+            break;

+        }

+    case ZOSS_SETHOOK_SEND_DATA:

+        {

+            gSche_Task_Hook.send_data_to = (Task_SEND_DATA_HOOK)HookFunc;

+            break;

+        }

+    case ZOSS_SETHOOK_GET_ALL_ID:

+        {

+            gSche_Task_Hook.get_all_id = (Task_GET_ALL_ID_HOOK)HookFunc;

+            break;

+        }

+    case ZOSS_SETHOOK_GET_ID:

+        {

+            gSche_Task_Hook.get_id = (Task_GET_ID_HOOK)HookFunc;

+            break;

+        }

+    case ZOSS_SETHOOK_GET_NAME:

+        {

+            gSche_Task_Hook.get_name = (Task_GET_THAKNAME_HOOK)HookFunc;

+            break;

+        }

+    default:

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_CreateTask

+* ¹¦ÄÜÃèÊö£º¸Ãº¯ÊýÓÃÓÚ´´½¨Ò»¸öÐÂÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            thread_name: ÈÎÎñÃû³Æ

+            entry: ÈÎÎñÖ´ÐеÄÈë¿Úº¯Êý

+            stack_size: ¶ÑÕ»´óС£¨µ¥Î»£º×Ö½Ú£©,ĬÈÏֵΪ0

+            priority: Ïß³ÌÓÅÏȼ¶£¨0-31£©, pnoΪ0ʱÓÐÓã¬ÖµÔ½µÍÓÅÏȼ¶Ô½¸ß

+            private_data_len: ÈÎÎñ˽ÓÐÊý¾ÝµÄ´óС

+            pno:µ÷¶ÈÏ̱߳àºÅ(1-8)

+            is_static:ÊÇ·ñ¾²Ì¬ÈÎÎñ

+           (OUT)

+* ·µ »Ø Öµ£º·µ»ØÈÎÎñID,ʧ°Ü·µ»ØZOSS_INVALID_TASK_ID

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+ZOSS_TASK_ID zOss_CreateTask_EX(const CHAR      *task_name,

+                                FUNC_TASKENTRY  task_entry, 

+                                UINT32          stack_size,

+                                UINT32          priority,

+                                UINT32          private_data_len,

+                                UINT8           pno,

+                                UINT8           is_static)

+{

+    ZOSS_THREAD_ID  threadId        = NULL;

+    ZOSS_TASK_ID    testtaskId      = NULL;

+    UINT8           *pDataRegion    = NULL;

+    T_ZOss_TCB      *pTCB           = NULL;

+    T_ZOss_TRF      *pTRF           = NULL;

+    UINT32          nRet            = ZOSS_ERROR;

+    UINT32          status          = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)               /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    zOss_AssertEx(NULL != task_name && NULL != task_entry, ZOSS_INVALID_TASK_ID);

+    zOss_AssertEx(0 < stack_size && pno <= gSche_Max_Thread_Num, ZOSS_INVALID_TASK_ID);

+

+    if (strlen((char *)task_name) > ZOSS_MAX_TASKNAME_LEN)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    if (ZOSS_SUCCESS != zOss_GetMutex(gSche_CreMutex, ZOSS_WAIT_FOREVER))

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    testtaskId = zOss_GetTaskID(task_name);

+    zOss_ASSERT(ZOSS_INVALID_TASK_ID == testtaskId);

+    if (ZOSS_INVALID_TASK_ID != testtaskId)

+    {

+        zOss_PutMutex(gSche_CreMutex);

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    /* ²úÉúÈÎÎñ¿ØÖÆ¿éTCB */

+    pTCB = (T_ZOss_TCB *)zOss_Malloc(sizeof(T_ZOss_TCB));

+    if (NULL == pTCB)

+    {

+        zOss_PutMutex(gSche_CreMutex);

+        return ZOSS_INVALID_TASK_ID;

+    }

+    zOss_Memset((UINT8 *)pTCB, 0, sizeof(T_ZOss_TCB));

+    

+    /* ·ÖÅäÓû§Ë½ÓÐÊý¾Ý¿Õ¼ä */

+    if (0 == private_data_len)

+    {

+        pDataRegion = NULL;

+    }

+    else

+    {

+        private_data_len = ALIGN_TO(private_data_len, sizeof(UINT32));

+        pDataRegion = (UINT8 *)zOss_Malloc(private_data_len + 4);  /* Óû§Êý¾ÝÇø */

+        if (NULL == pDataRegion)

+        {

+            zOss_PutMutex(gSche_CreMutex);

+            zOss_Free(pTCB);

+            return ZOSS_INVALID_TASK_ID;

+        }

+        zOss_Memset(pDataRegion, 0, private_data_len);

+        *(UINT32 *)((UINT32)pDataRegion + private_data_len) = gSche_pDataRegion_Test;

+    }

+    

+    /* ÏòTCB±íÌí¼ÓÈÎÎñÐÅÏ¢ */

+    zOss_ListInit(&pTCB->msg_queue);

+    pTCB->taskData = pDataRegion;

+    strncpy((char *)pTCB->task_name,(const char *)task_name,ZOSS_MAX_TASKNAME_LEN);

+    pTCB->task_name[ZOSS_MAX_TASKNAME_LEN] = '\0';

+    pTCB->taskEntry = task_entry;

+    pTCB->HookEntry[0] = NULL;

+    pTCB->HookEntry[1] = NULL;

+    pTCB->HookEntry[2] = NULL;

+    pTCB->state = ZOSS_STATUS_INIT;

+    pTCB->priority = priority;

+    pTCB->stack_size = stack_size;

+    pTCB->private_data_len = private_data_len;

+    pTCB->task_time = 0;

+    pTCB->sender_task_id = NULL;

+    pTCB->thread_no = pno;

+    pTCB->type = SCHE_OSS_TASK;

+    pTCB->reserved[0] = is_static;

+    pTCB->malloc_size = 0xFFFFFFFF; /* mallocδʵÏÖ */

+    

+    if (pno == 0)                   /* Èç¹ûÊǶÀÕ¼Ị̈߳¬ÔòÐèÒªµ¥¶À´´½¨Ò»¸öµ÷¶ÈÏß³Ì */

+    {

+        /* ²úÉúÏ̵߳ǼDZí */

+        pTRF = (T_ZOss_TRF *)zOss_Malloc(sizeof(T_ZOss_TRF));

+        if (NULL == pTRF)

+        {

+            zOss_PutMutex(gSche_CreMutex);

+            if (0 != private_data_len)

+            {

+                zOss_Free(pDataRegion);

+            }

+            zOss_Free((UINT8 *)pTCB);

+            return ZOSS_INVALID_TASK_ID;

+        }

+        zOss_Memset((UINT8 *)pTRF, 0, sizeof(T_ZOss_TRF));

+        

+        /* ´´½¨µ÷¶ÈÏß³Ì */

+        threadId = zOss_CreateThread(task_name, Sche_DefTaskEntry, (SINT32)pTRF, stack_size, priority, 1, 0);

+        if (threadId == ZOSS_INVALID_THREAD_ID)          /* Èç¹û´´½¨Ê§°ÜÔòÊͷſռä */

+        {

+            zOss_PutMutex(gSche_CreMutex);

+            SCHE_printf("Fail!\n");

+            if (0 != private_data_len)

+            {

+                zOss_Free(pDataRegion);

+            }

+            zOss_Free((UINT8 *)pTCB);

+            zOss_Free((UINT8 *)pTRF);

+            return ZOSS_INVALID_TASK_ID;

+        }

+        

+        /* ³õʼ»¯ÈÎÎñÁ´±í */

+        zOss_ListInit(&pTRF->TCBReady);

+        zOss_ListInit(&pTRF->TCBStopped);

+        zOss_ListInit(&pTRF->TCBIdle);

+        

+        /* ÏòÏ̵߳ǼDZíÖÐдÈëµ÷¶ÈÏß³ÌÐÅÏ¢ */

+        pTRF->priority = priority;

+        pTRF->thread_id = threadId;

+        pTRF->pno = 0;

+        

+        /* ½«ÈÎÎñ¹ÒÈëµ÷¶ÈÏß³Ì */

+        pTCB->thread_id = threadId;

+        

+        nRet = Sche_SetTaskID(threadId, pTRF);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_PutMutex(gSche_CreMutex);

+            

+            SCHE_printf("Fail!\n");

+            if (0 != private_data_len)

+            {

+                zOss_Free(pDataRegion);

+            }

+            zOss_Free((UINT8 *)pTCB);

+            zOss_Free((UINT8 *)pTRF);

+            return ZOSS_INVALID_TASK_ID;

+        }

+        

+        /* ½«Ï̵߳ǼDZí¹ÒÈëTRFÁ´±í */

+        if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TRFMutex, ZOSS_WAIT_FOREVER))

+        {

+            zOss_ListAdd(&gSche_TRF_List, &(pTRF->node));

+            

+            /* Æô¶¯µ÷¶ÈÏß³Ì */

+            nRet = zOss_ResumeThread(threadId);

+            if (nRet == ZOSS_ERROR)            /* Èç¹ûÆô¶¯Ê§°ÜÔòÊͷſռä */

+            {

+                zOss_PutMutex(gSche_CreMutex);

+                SCHE_printf("Fail!\n");

+                if (0 != private_data_len)

+                {

+                    zOss_Free(pDataRegion);

+                }

+                zOss_Free((UINT8 *)pTCB);

+                status = zOss_DeleteThread(threadId);

+                if (status == ZOSS_SUCCESS)

+                {

+                    zOss_ListDelete(&gSche_TRF_List, &(pTRF->node));

+                    zOss_Free((UINT8 *)pTRF);

+                }

+                zOss_PutMutex(gSche_TRFMutex);

+                return ZOSS_INVALID_TASK_ID;

+            }

+            zOss_PutMutex(gSche_TRFMutex);

+        }

+    }

+    else                                /* ·Ç¶Àռʱ¸ù¾Ýµ÷¶ÈÏ̺߳Ž«ÈÎÎñ¹ÒÈëÏàÓ¦µ÷¶ÈÏß³Ì */

+    {

+        pTRF = &gSche_ThreadItemTab[pno - 1];

+        pTCB->thread_id = pTRF->thread_id;

+    }

+    

+    /* ½«ÈÎÎñ¿ØÖÆ¿épTaskInfo¹Òµ½ÈÎÎñÁбíÉÏ */

+    nRet = Sche_AddTCB(pTCB);

+    if (nRet == ZOSS_ERROR)             /* Èç¹ûʧ°ÜÔò±íʾ³¬¹ý×î´óÈÎÎñÊý */

+    {

+        zOss_PutMutex(gSche_CreMutex);

+        SCHE_printf("Fail!\n");

+        if (0 != private_data_len)

+        {

+            zOss_Free(pDataRegion);

+        }

+        zOss_Free((UINT8 *)pTCB);

+        if (pno == 0)                   /* Èç¹ûÊǶÀÕ¼µ÷¶ÈÏß³ÌÔòÐèҪɾ³ýÏß³Ì */

+        {

+            status = zOss_DeleteThread(threadId);

+            if (status == ZOSS_SUCCESS )

+            {

+                if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TRFMutex, ZOSS_WAIT_FOREVER))

+                {

+                    zOss_ListDelete(&gSche_TRF_List, &(pTRF->node));

+                    nRet = zOss_PutMutex(gSche_TRFMutex);

+                    if (nRet == ZOSS_ERROR)

+                    {

+                        return NULL;

+                    }

+                }

+                zOss_Free((UINT8 *)pTRF);

+            }

+        }

+        

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    pTCB->time = zOss_GetTickCount();

+    pTCB->task_id = (ZOSS_TASK_ID)pTCB;

+    

+    zOss_PutMutex(gSche_CreMutex);

+    

+    /* Ïòµ÷¶ÈÏ̷߳¢ÈÎÎñ´´½¨ÏûÏ¢ */

+    zOss_TaskSend(EV_TASK_CRE, NULL, 0, (ZOSS_TASK_ID)pTCB);

+    return pTCB;

+}

+

+ZOSS_TASK_ID zOss_CreateTask(const CHAR      *task_name,

+                             FUNC_TASKENTRY  task_entry, 

+                             UINT32          stack_size,

+                             UINT32          priority,

+                             UINT32          private_data_len,

+                             UINT8           pno)

+{

+    ZOSS_TASK_ID    taskID  = NULL;

+    UINT32          nRet    = 0;

+    

+    taskID = zOss_CreateTask_EX(task_name, task_entry, stack_size, priority, private_data_len, pno, 0);

+    if (taskID != ZOSS_INVALID_TASK_ID)

+    {

+        nRet = zOss_TaskSend(EV_INIT, NULL, 0, taskID);

+        zOss_AssertEx(nRet != ZOSS_ERROR, ZOSS_INVALID_TASK_ID);

+    }

+    return taskID;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_DeleteTask

+* ¹¦ÄÜÃèÊö£º¸Ãº¯ÊýÓÃÓÚɾ³ýÒ»¸öÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id:ÈÎÎñID,Èç¹ûΪ0£¬Ôòɾ³ýµ±Ç°ÈÎÎñ

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º²»»áÁ¢¼´É¾³ý£¬ÈÎÎñ»á´¦ÀíÍ굱ǰÏûÏ¢

+**************************************************************************/

+UINT32 zOss_DeleteTask(ZOSS_TASK_ID task_id)

+{

+    T_ZOss_TCB  *pTCB   = NULL;

+    UINT32      status  = ZOSS_ERROR;

+    UINT32      nore    = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)               /* ¼ì²éÊÇ·ñÒѳõʼ»¯            */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (NULL == task_id)                         /* ÈÎÎñIDΪ¿ÕÔòɾ³ýµ±Ç°ÈÎÎñ    */

+    {

+        task_id = zOss_GetSelfTaskID();          /* »ñÈ¡µ±Ç°ÈÎÎñID              */

+        if (task_id == ZOSS_INVALID_TASK_ID)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    pTCB = (T_ZOss_TCB *)task_id;                /* »ñÈ¡ÈÎÎñTCB±í               */

+    

+    if (pTCB->type != SCHE_OSS_TASK)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))   /* ÐźÅÁ¿±£»¤           */

+    {

+        if (task_id == pTCB->task_id)                                       /* ¼ì²éÈÎÎñÊÇ·ñ´æÔÚ     */

+        {

+            status = zOss_TaskSend(EV_TASK_END, NULL, 0, task_id);          /* Ïòµ÷¶ÈÏ̷߳¢É¾³ýÏûÏ¢ */

+            pTCB->task_id = NULL;

+        }

+        else

+        {

+            zOss_PutMutex(gSche_TCBMutex);

+            return ZOSS_ERROR;

+        }

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    return status;

+}

+

+/**************************************************************************

+*º¯ÊýÃû³Æ£ºzOss_PauseTask

+*¹¦ÄÜÃèÊö£ºÔÝÍ£ÈÎÎñÖ´ÐÐ

+*²ÎÊý˵Ã÷£ºtask_id:´ýÔÝÍ£ÈÎÎñµÄID

+*·µ»ØÖµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+*ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_PauseTask(ZOSS_TASK_ID task_id)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ResumTask

+* ¹¦ÄÜÃèÊö£º»Ö¸´ÈÎÎñ,תµ½¾ÍÐ÷̬

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id:´ý»Ö¸´ÈÎÎñµÄID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_ResumeTask(ZOSS_TASK_ID task_id)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+*º¯ÊýÃû³Æ£ºzOss_GetTaskInfo

+*¹¦ÄÜÃèÊö£º»ñÈ¡ÈÎÎñÐÅÏ¢

+*²ÎÊý˵Ã÷£º(IN)

+           task_id:ÈÎÎñID,Èç¹ûΪ0£¬»ñÈ¡µ±Ç°ÈÎÎñÐÅÏ¢

+           task_info:ÈÎÎñ¿ØÖÆ¿é±íÖ¸Õ룬ָÏò´æ·Å¸ÃÈÎÎñÐÅÏ¢µÄ´æ´¢¿é£¬ÔÚµ÷ÓÃ

+                     ǰ³õʼ»¯

+           (OUT)

+*·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+*ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetTaskInfo(ZOSS_TASK_ID task_id, T_ZOss_TCB *task_info)

+{

+    T_ZOss_TCB  *pTCB   = NULL;

+    UINT32      nore    = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)             /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_info, ZOSS_ERROR);

+    

+    if (ZOSS_INVALID_TASK_ID == task_id)       /* ÈÎÎñIDΪ¿ÕÔò»ñÈ¡µ±Ç°ÈÎÎñÐÅÏ¢ */

+    {

+        task_id = zOss_GetSelfTaskID();

+        if (task_id == ZOSS_INVALID_TASK_ID)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    pTCB = (T_ZOss_TCB *)task_id;              /* »ñÈ¡ÈÎÎñTCB±í */

+    

+    if (pTCB->type != SCHE_OSS_TASK)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        if (task_id == pTCB->task_id)       /* ÈÎÎñ´æÔÚ     */

+        {

+            *task_info = *pTCB;             /* »ñÈ¡ÈÎÎñÐÅÏ¢ */

+            nore = zOss_PutMutex(gSche_TCBMutex);

+            if (nore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return ZOSS_SUCCESS;

+        }

+        zOss_PutMutex(gSche_TCBMutex);

+    }

+    

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetAllTaskInfo

+* ¹¦ÄÜÃèÊö£º»ñÈ¡µ±Ç°ËùÓзÇSDLÈÎÎñµÄÏà¹ØÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+*           (OUT) pMonTaskInfo: ÈÎÎñÐÅÏ¢´æ·ÅµØÖ·

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËû˵Ã÷£º´Ëº¯ÊýÉêÇëµÄÄÚ´æ¿Õ¼ä£¬±ØÐëÓÉʹÓÃÕßÊÍ·Å£¬·ñÔò»áÔì³ÉÄÚ´æÐ¹Â¶¡£

+**************************************************************************/

+VOID zOss_GetAllTaskInfo(T_ZOss_Mon_Task *pMonTaskInfo)

+{

+#ifdef _USE_MONITOR

+    T_ZOss_Mon_Task  taskInfo   = {0};

+    T_ZOss_TCB      *TCBNode    = NULL;

+    UINT32          cnt         = 0;

+

+    if (pMonTaskInfo == NULL)

+    {

+        return;

+    }

+    

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        taskInfo.num = gSche_MaxTCBLen;

+        taskInfo.ele = (T_ZOss_Mon_Task_Ele *)zOss_GetUB(taskInfo.num * sizeof(T_ZOss_Mon_Task_Ele));

+        zOss_AssertExN(taskInfo.ele != NULL);

+        TCBNode = gSche_TCBHeadPtr;

+        for (cnt = 0; cnt < taskInfo.num ; cnt++)

+        {

+            taskInfo.ele[cnt].name          = TCBNode->task_name;

+            taskInfo.ele[cnt].handle        = (UINT32)TCBNode->task_id;

+            taskInfo.ele[cnt].thread_handle = (UINT32)TCBNode->thread_id;

+            taskInfo.ele[cnt].status        = TCBNode->run_status;  

+            TCBNode = TCBNode->next;

+        }

+        zOss_PutMutex(gSche_TCBMutex);

+

+        pMonTaskInfo->num = taskInfo.num;

+        pMonTaskInfo->ele = taskInfo.ele;

+    }

+#endif    

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetAllTaskID

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ËùÓÐÈÎÎñID£¬°üÀ¨SDLÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id_arr:´æ·ÅÈÎÎñIDµÄÖ¸Õ룬ÔÚµ÷ÓÃǰ³õʼ»¯

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØÈÎÎñÊý£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetAllTaskID(ZOSS_TASK_ID *task_id_arr)

+{

+    T_ZOss_TCB  *pCurTCB    = NULL;

+    UINT32      tasknum     = 0;

+    UINT32      sdltasknum  = 0;

+    UINT32      nore        = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_id_arr, ZOSS_ERROR);

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        /* ȡһ°ãÈÎÎñID */

+        if (NULL != gSche_TCBHeadPtr)   /* Á´±í²»Îª¿Õ */

+        {

+            pCurTCB = gSche_TCBHeadPtr;

+            while (NULL != pCurTCB)

+            {

+                if (pCurTCB == (T_ZOss_TCB *)pCurTCB->task_id)

+                {

+                    *task_id_arr = pCurTCB->task_id;

+                    tasknum++;

+                }

+                pCurTCB = pCurTCB->next;

+                task_id_arr++;

+            }

+        }

+        

+        /* È¡SDLÈÎÎñID */

+        if (gSche_Task_Hook.get_all_id != NULL)

+        {

+            sdltasknum = gSche_Task_Hook.get_all_id(task_id_arr);

+        }

+        

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return (tasknum + sdltasknum);

+    }

+    return 0;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskSend

+* ¹¦ÄÜÃèÊö£º¸øÈÎÎñ·¢ËÍÒì²½ÏûÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            msg:ÏûÏ¢ID

+            msg_buf:ÏûÏ¢¶ÑÕ»

+            msg_len:ÏûÏ¢³¤¶È

+            task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓÃ

+**************************************************************************/

+__tcm_func UINT32 zOss_TaskSend(UINT32 msg_id, const VOID *buf, UINT16 msg_len, ZOSS_TASK_ID task_id)

+{

+    UINT32              nRet    = ZOSS_ERROR;

+    T_ZOss_TaskMsgHead  *pMsg   = NULL;

+    T_ZOss_TCB          *pTCB   = NULL;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_id, ZOSS_ERROR);

+    

+    if (gSche_Task_Hook.send_to != NULL)

+    {

+        nRet = gSche_Task_Hook.send_to(msg_id, buf, msg_len, task_id, zOss_GetSelfTaskID());

+        if (nRet == ZOSS_SUCCESS)

+        {

+            return ZOSS_SUCCESS;

+        }

+    }

+    

+    /* ¶¨Î»Ä¿±êÈÎÎñ */

+    pTCB = (T_ZOss_TCB *)task_id;           /* »ñȡĿ±êÈÎÎñTCB±í    */

+    if (task_id != pTCB->task_id)           /* ÈÎÎñ²»´æÔÚ           */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* ·ÖÅäÏûÏ¢¿Õ¼ä */

+    pMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(msg_len + SCHE_M_TASKMSGHEAD_LEN);

+    if (NULL == pMsg)

+    {

+        return ZOSS_ERROR;

+    }

+    /* дÏûϢͷ */

+    pMsg->t_task_id     = task_id;

+    pMsg->s_task_id     = zOss_GetSelfTaskID();

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_MSG;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = msg_len;

+    if (msg_len > 0 && buf != NULL)

+    {

+        zOss_Memcpy((UINT8 *)(pMsg + 1), (UINT8 *)buf, msg_len);

+    }

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_TaskSendDataEx(pMsg);

+   

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskSendData

+* ¹¦ÄÜÃèÊö£º¸øÆäËûÈÎÎñ·¢ËÍÒì²½ÏûÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            msg:ÏûÏ¢ID

+            msg_buf:ÏûÏ¢¶ÑÕ»

+            msg_len:ÏûÏ¢³¤¶È

+            task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£º Èç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓà £¬Ö»´«µÝ

+            ÏûÏ¢Ö¸Õ룬²»×ö¿½±´£¬Òò´ËÏûÏ¢ÓÉÓû§ÊÍ·Å

+**************************************************************************/

+CODE_BEGIN(.PLAT_TCM_CODE)

+__tcm_func UINT32 zOss_TaskSendData(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID task_id)

+{

+    UINT32              nRet    = ZOSS_ERROR;

+    T_ZOss_TaskMsgHead  *pMsg   = NULL;

+    T_ZOss_TaskMsg      *pBuf   = NULL;

+    T_ZOss_TCB          *pTCB   = NULL;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_id, ZOSS_ERROR);

+    

+    if (gSche_Task_Hook.send_to != NULL)

+    {

+        nRet = gSche_Task_Hook.send_to(msg_id, buf, msg_len, task_id, zOss_GetSelfTaskID());

+        if (nRet == ZOSS_SUCCESS)

+        {

+            if (buf != NULL)

+            {

+                if (ZOSS_SUCCESS != zOss_RetUB(buf))

+                {

+                    return ZOSS_ERROR;

+                }

+            }

+            return ZOSS_SUCCESS;

+        }

+    }

+    

+    /* ¶¨Î»Ä¿±êÈÎÎñ */

+    pTCB = (T_ZOss_TCB *)task_id;           /* »ñȡĿ±êÈÎÎñTCB±í    */

+    if (task_id != pTCB->task_id)           /* ÈÎÎñ²»´æÔÚ           */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* ·ÖÅäÏûÏ¢¿Õ¼ä */

+    pMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(SCHE_M_TASKMSGEX_LEN + SCHE_M_TASKMSGHEAD_LEN);

+    if (NULL == pMsg)

+    {

+        return ZOSS_ERROR;

+    }

+    pBuf = (T_ZOss_TaskMsg *)(pMsg + 1);

+    

+    /* дÏûϢͷ */

+    pMsg->t_task_id     = task_id;

+    pMsg->s_task_id     = zOss_GetSelfTaskID();

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_DATA;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = SCHE_M_TASKMSGEX_LEN;

+    pBuf->msgbuf        = buf;

+    pBuf->msgLenEX      = msg_len;

+    

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_TaskSendDataEx(pMsg);

+    

+    return nRet;

+}

+CODE_END

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskSendDataEx

+* ¹¦ÄÜÃèÊö£º¸øÆäËûÈÎÎñ´«µÝÏûÏ¢Ìå

+* ²ÎÊý˵Ã÷£º(IN)

+            buf:ÏûÏ¢¶ÑÕ»

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓÃ

+**************************************************************************/

+__tcm_func UINT32 zOss_TaskSendDataEx(T_ZOss_TaskMsgHead *buf)

+{

+    UINT32          nRet        = ZOSS_ERROR;

+    T_ZOss_TCB      *pTCB       = NULL;

+    T_ZOss_TRF      *pTRF       = NULL;

+    ZOSS_THREAD_ID  threadId    = NULL;

+#if ZOSS_CAPT_MSG

+    UINT32          i           = 0;

+    T_ZOss_TCB      *pSTCB      = NULL;

+    T_ZOss_SDLTCB   *pSSTCB     = NULL;

+    UINT8           fleg[3]     = {0};

+#endif

+

+    zOss_AssertEx(buf != NULL, ZOSS_ERROR);

+

+    if (gSche_IsTaskInit == FALSE || buf->t_task_id == NULL 

+        || buf->send_state > ZOSS_MSGSENDTYPE_TIMER || buf->send_state < ZOSS_MSGSENDTYPE_MSG)

+    {

+        zOss_RetUB(buf);

+        return ZOSS_ERROR;

+    }

+    

+    if (buf->send_state == ZOSS_MSGSENDTYPE_DATA && gSche_Task_Hook.send_data_to != NULL)

+    {

+        nRet = gSche_Task_Hook.send_data_to(buf->msgID, ((T_ZOss_TaskMsg *)(buf + 1))->msgbuf,

+                ((T_ZOss_TaskMsg *)(buf + 1))->msgLenEX, buf->t_task_id, buf->s_task_id);

+    }

+    else if (buf->send_state == ZOSS_MSGSENDTYPE_MSG && gSche_Task_Hook.send_to != NULL)

+    {

+        nRet = gSche_Task_Hook.send_to(buf->msgID, buf + 1, buf->msgLen, buf->t_task_id, buf->s_task_id);

+    }

+    if (nRet == ZOSS_SUCCESS)

+    {

+        zOss_RetUB(buf);

+        return ZOSS_SUCCESS;

+    }

+    

+    /* ¶¨Î»Ä¿±êÈÎÎñ */

+    pTCB = (T_ZOss_TCB *)buf->t_task_id;        /* »ñȡĿ±êÈÎÎñTCB±í            */

+    if (buf->t_task_id == pTCB->task_id)        /* ÈÎÎñ´æÔÚ                     */

+    {

+        threadId = pTCB->thread_id;             /* »ñȡĿ±êÈÎÎñËùÔÚµ÷¶ÈÏß³ÌID   */

+    }

+    else

+    {

+        zOss_RetUB(buf);

+        return ZOSS_ERROR;

+    }

+    

+#if ZOSS_CAPT_MSG

+    /* ·¢ËÍÏûÏ¢²¶»ñ */

+    if (buf->s_task_id != NULL)                 /* Ô´²»ÎªÏß³Ì   */

+    {

+        pSTCB = (T_ZOss_TCB *)buf->s_task_id;

+        if (pSTCB->type == SCHE_OSS_TASK)       /*ԴΪ·ÇSDLÈÎÎñ */

+        {

+            for (i = 0; i < 3; i++)

+            {

+                if (pSTCB->dire[i] == ZOSS_MSGDIRE_OUT || pSTCB->dire[i] == ZOSS_MSGDIRE_INOUT)

+                {

+                    fleg[i] = 1;

+                    nRet = pSTCB->HookEntry[i](buf, ZOSS_MSGDIRE_OUT);

+                }

+            }

+        }

+        else if (pSTCB->type == SCHE_SDL_TASK)  /* ԴΪSDL ÈÎÎñ */

+        {

+            pSSTCB = (T_ZOss_SDLTCB *)buf->s_task_id;

+            for (i = 0; i < 3; i++)

+            {

+                if (pSSTCB->dire[i] == ZOSS_MSGDIRE_OUT || pSSTCB->dire[i] == ZOSS_MSGDIRE_INOUT)

+                {

+                    fleg[i] = 1;

+                    nRet = pSSTCB->HookEntry[i](buf, ZOSS_MSGDIRE_OUT);

+                }

+            }

+        }

+        if (fleg[2] == 1)

+        {

+            zOss_RetUB((UINT8 *)buf);

+            return ZOSS_SUCCESS;

+        }

+    }

+    

+    /* ½ÓÊÕÏûÏ¢²¶»ñ */

+    for (i = 0; i < 3; i++)

+    {

+        if (fleg[i] == 0 && (pTCB->dire[i] == ZOSS_MSGDIRE_IN || pTCB->dire[i] == ZOSS_MSGDIRE_INOUT))

+        {

+            fleg[i] = 1;

+            nRet = pTCB->HookEntry[i](buf, ZOSS_MSGDIRE_IN);

+        }

+    }

+    if (fleg[2] == 1)

+    {

+        zOss_RetUB((UINT8 *)buf);

+        return ZOSS_SUCCESS;

+    }

+    

+#endif

+    /* ÌØÊâÏûÏ¢ */

+    if (buf->msgID == EV_TASK_CRE || buf->msgID == EV_TASK_END || buf->msgID == EV_INIT || buf->msgID == EV_POWERON)

+    {

+        nRet = zOss_SendMsg(threadId, (UINT8 *)buf, buf->msgLen + SCHE_M_TASKMSGHEAD_LEN, ZOSS_WAIT_FOREVER);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_RetUB((UINT8 *)buf);

+        }

+        return nRet;

+    }

+    

+    /* Ïß³ÌÏòÈÎÎñ·¢ÏûÏ¢ */

+    if (buf->s_task_id == NULL)

+    {

+        nRet = zOss_SendMsg(threadId, (UINT8 *)buf, buf->msgLen + SCHE_M_TASKMSGHEAD_LEN, ZOSS_WAIT_FOREVER);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_RetUB((UINT8 *)buf);

+        }

+        return nRet;

+    }

+    

+    /* ÆÕͨÏûÏ¢ */

+    if (threadId == zOss_GetCurThreadID())

+    {

+        /* ÔÚͬһµ÷¶ÈÏß³ÌÖÐ */

+        zOss_ListAdd(&pTCB->msg_queue, &(buf->node));

+        if (pTCB->run_status == ZOSS_STATE_IDLE)

+        {

+            pTRF = &gSche_ThreadItemTab[pTCB->thread_no - 1];

+            zOss_ListDelete(&(pTRF->TCBIdle), &(pTCB->node));

+            zOss_ListAdd(&(pTRF->TCBReady), &(pTCB->node));

+            pTCB->run_status = ZOSS_STATE_READY;

+        }

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        /* ²»ÔÚͬһµ÷¶ÈÏß³ÌÖÐ */

+        nRet = zOss_SendMsg(threadId, (UINT8 *)buf, buf->msgLen + SCHE_M_TASKMSGHEAD_LEN, ZOSS_WAIT_FOREVER);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_RetUB((UINT8 *)buf);

+        }

+        return nRet;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_TaskSend

+* ¹¦ÄÜÃèÊö£º¸øÆäËûÈÎÎñ·¢ËÍÒì²½ÏûÏ¢,²âÊÔרÓÃ

+* ²ÎÊý˵Ã÷£º(IN)

+            msg_id:ÏûÏ¢ID

+            buf:ÏûÏ¢ÄÚÈÝ

+            msg_len:ÏûÏ¢³¤¶È

+            s_task_id:Ô´ÈÎÎñID

+            t_task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓà 

+**************************************************************************/

+__tcm_func UINT32 Sche_TaskSend(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID s_task_id, ZOSS_TASK_ID t_task_id)

+{

+    UINT32              nRet = ZOSS_ERROR;

+    T_ZOss_TaskMsgHead *pMsg = NULL;

+

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    /* ·ÖÅäÏûÏ¢¿Õ¼ä */

+    pMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(msg_len + SCHE_M_TASKMSGHEAD_LEN);

+    zOss_AssertEx(NULL != pMsg, ZOSS_ERROR);

+    

+    /* дÏûϢͷ */

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_MSG;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = msg_len;

+    pMsg->s_task_id     = s_task_id;

+    pMsg->t_task_id     = t_task_id;

+    

+    if (msg_len > 0 && buf != NULL)

+    {

+        zOss_Memcpy((UINT8 *)(pMsg + 1), (UINT8 *)buf, msg_len);

+    }

+    

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_TaskSendDataEx(pMsg);

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_TaskSendData

+* ¹¦ÄÜÃèÊö£º¸øÆäËûÈÎÎñ·¢ËÍÒì²½ÏûÏ¢,²âÊÔרÓÃ

+* ²ÎÊý˵Ã÷£º(IN)

+            msg_id:ÏûÏ¢ID

+            buf:ÏûÏ¢ÄÚÈÝ

+            msg_len:ÏûÏ¢³¤¶È

+            s_task_id:Ô´ÈÎÎñID

+            t_task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓà 

+**************************************************************************/

+__tcm_func UINT32 Sche_TaskSendData(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID s_task_id, ZOSS_TASK_ID t_task_id)

+{

+    UINT32              nRet    = ZOSS_ERROR;

+    T_ZOss_TaskMsgHead  *pMsg   = NULL;

+    T_ZOss_TaskMsg      *pBuf   = NULL;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    /* ·ÖÅäÏûÏ¢¿Õ¼ä */

+    pMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(SCHE_M_TASKMSGEX_LEN + SCHE_M_TASKMSGHEAD_LEN);

+

+    zOss_AssertEx(NULL != pMsg, ZOSS_ERROR);

+

+    pBuf = (T_ZOss_TaskMsg *)(pMsg + 1);

+    

+    /* дÏûϢͷ */

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_DATA;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = SCHE_M_TASKMSGEX_LEN;

+    pMsg->s_task_id     = s_task_id;

+    pMsg->t_task_id     = t_task_id;

+    

+    pBuf->msgbuf = buf;

+    pBuf->msgLenEX = msg_len;

+    

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_TaskSendDataEx(pMsg);

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_InterruptTaskSend

+* ¹¦ÄÜÃèÊö£ºÔÚÖжÏÖиøÈÎÎñ·¢ËÍÒì²½ÏûÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            msg:ÏûÏ¢ID

+            msg_buf:ÏûÏ¢¶ÑÕ»,ÔÚ·¢ËÍʱ²»¿½±´,ÓÉÄ¿±êÈÎÎñÔÚ´¦ÀíÍêÏûÏ¢ºóÊÍ·Å

+            msg_len:ÏûÏ¢³¤¶È

+            task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿ÚÔÚÖжÏÖÐʹÓÃ

+**************************************************************************/

+UINT32 Sche_InterruptTaskSend(UINT32 msg_id, T_ZOss_TaskMsgHead *pMsg, UINT16 msg_len, ZOSS_TASK_ID task_id)

+{

+    UINT32          nRet        = ZOSS_ERROR;

+    T_ZOss_TCB      *pTCB       = NULL;

+    ZOSS_THREAD_ID  threadId    = NULL;

+    

+    zOss_AssertEx(NULL != task_id && NULL != pMsg, ZOSS_ERROR);

+    

+    /* ¶¨Î»Ä¿±êÈÎÎñ */

+    pTCB = (T_ZOss_TCB *)task_id;            /* »ñȡĿ±êÈÎÎñTCB±í */

+    if (task_id == pTCB->task_id)

+    {

+        threadId = pTCB->thread_id;          /* »ñȡĿ±êÈÎÎñËùÔÚµ÷¶ÈÏß³ÌID */

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* Ìî³äÏûϢͷºÍÏûÏ¢Ìå */

+    pMsg->t_task_id     = task_id;

+    pMsg->s_task_id     = (ZOSS_TASK_ID)zOss_GetCurThreadID();

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_INTER;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = msg_len;

+    

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_SendMsg(threadId, (UINT8 *)pMsg, msg_len, ZOSS_NO_WAIT);

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_getBufPoint

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÍ·Ö¸Õë»ñÈ¡bufÖ¸Õë

+* ²ÎÊý˵Ã÷£º(IN)

+            phead:Í·Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º·µ»Ø VOID ÀàÐ͵ÄÖ¸Õ룬ָÏòÏûÏ¢ÄÚÈÝ£»Ê§°Ü£¬Ôò·µ»Ø ZOSS_NULL

+* ÆäËü˵Ã÷£ºÖ÷ÒªÓÃÓÚÏûϢͨѶ

+**************************************************************************/

+VOID *Sche_getBufPoint(T_ZOss_TaskMsgHead *phead)

+{

+    T_ZOss_TaskMsg *pBuf = NULL;

+    

+    zOss_AssertEx(phead != NULL, NULL);

+    

+    if (phead->send_state == ZOSS_MSGSENDTYPE_MSG)

+    {

+        return ((CHAR *)phead + SCHE_M_TASKMSGHEAD_LEN);

+    }

+    else if (phead->send_state == ZOSS_MSGSENDTYPE_DATA)

+    {

+        pBuf = (T_ZOss_TaskMsg *)((CHAR *)phead + SCHE_M_TASKMSGHEAD_LEN);

+        return (pBuf->msgbuf);

+    }

+    else

+    {

+        return NULL;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_getBufLength

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÍ·Ö¸Õë»ñÈ¡buf³¤¶È

+* ²ÎÊý˵Ã÷£º(IN)

+            phead:Í·Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º·µ»Ø buf³¤¶È

+* ÆäËü˵Ã÷£ºÖ÷ÒªÓÃÓÚÏûϢͨѶ

+**************************************************************************/

+UINT32 Sche_getBufLength(T_ZOss_TaskMsgHead *phead)

+{

+    T_ZOss_TaskMsg *pBuf = NULL;

+    

+    zOss_AssertEx(phead != NULL, 0);

+    

+    if (phead->send_state == ZOSS_MSGSENDTYPE_MSG)

+    {

+        return (phead->msgLen);

+    }

+    else if (phead->send_state == ZOSS_MSGSENDTYPE_DATA)

+    {

+        pBuf = (T_ZOss_TaskMsg *)((CHAR *)phead + SCHE_M_TASKMSGHEAD_LEN);

+        return (pBuf->msgLenEX);

+    }

+    else

+    {

+        return 0;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetState

+* ¹¦ÄÜÃèÊö£ºÉ趨ÈÎÎñ״̬

+* ²ÎÊý˵Ã÷£º(IN)

+            next_state:ÈÎÎñ״̬

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetState(UINT8 next_state)

+{

+    T_ZOss_TCB      *pTCB   = NULL;

+    ZOSS_TASK_ID    taskId  = NULL;

+    UINT32          nore    = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    taskId = zOss_GetSelfTaskID();          /* »ñÈ¡µ±Ç°ÈÎÎñID   */

+    if (ZOSS_INVALID_TASK_ID == taskId)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    pTCB = (T_ZOss_TCB *)taskId;            /* »ñÈ¡ÈÎÎñTCB±í    */

+    if (pTCB->type != SCHE_OSS_TASK)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        if (taskId != pTCB->task_id)        /* ÈÎÎñ²»´æÔÚ       */

+        {

+            zOss_PutMutex(gSche_TCBMutex);

+            return ZOSS_ERROR;

+        }

+        

+        pTCB->state = next_state;           /* ÉèÖÃ״̬         */

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return ZOSS_SUCCESS;

+    }

+    return ZOSS_ERROR;

+}

+

+#if ZOSS_CAPT_MSG

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RegTaskSendHook

+* ¹¦ÄÜÃèÊö£ºÉ趨ÈÎÎñÏûÏ¢·¢Ëͻص÷º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id:ÈÎÎñID£¬Îª0Ϊµ±Ç°ÈÎÎñ

+            intercept_Entry:»Øµ÷º¯ÊýÖ¸Õë

+            hooktype:»Øµ÷º¯ÊýÖÖÀà

+            dire:   ZOSS_SETHOOKFLAG_MONI  :ÏûÏ¢¼à¿Ø

+                    ZOSS_SETHOOKFLAG_TRACK : ÏßÐÔ¸ú×Ù

+                    ZOSS_SETHOOKFLAG_INTER : ÏûÏ¢½Ø»ñ

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉèÖÃSDLÈÎÎñʱ£¬Èë²Îtask_id²»ÄÜΪ0

+**************************************************************************/

+UINT32 zOss_RegTaskSendHook(ZOSS_TASK_ID task_id, UINT8 hooktype, UINT8 dire, TASK_SEND_HOOK intercept_Entry)

+{

+    T_ZOss_TCB      *pTCB       = NULL;

+    T_ZOss_SDLTCB   *pSDLTCB    = NULL;

+    UINT32          nore        = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (hooktype < 1 || hooktype > 3)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (intercept_Entry != NULL && (dire < 1 || dire > 3))

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (intercept_Entry == NULL)

+    {

+        dire = 0;

+    }

+    

+    if (NULL == task_id)                    /* Èç¹ûÈÎÎñIDΪ¿ÕÔòÉ趨µ±Ç°ÈÎÎñ */

+    {

+        task_id = zOss_GetSelfTaskID();

+        if (ZOSS_INVALID_TASK_ID == task_id)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    pTCB = (T_ZOss_TCB *)task_id;           /* »ñÈ¡ÈÎÎñTCB±í    */

+    

+    if (pTCB->type == SCHE_OSS_TASK)        /* ÉèÖ÷ÇSDLÈÎÎñ    */

+    {

+        /* ÐźÅÁ¿±£»¤ */

+        if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+        {

+            if (task_id != pTCB->task_id)   /* ÈÎÎñ²»´æÔÚ       */

+            {

+                zOss_PutMutex(gSche_TCBMutex);

+

+                return ZOSS_ERROR;

+            }

+            pTCB->HookEntry[hooktype - 1] = intercept_Entry;

+            pTCB->dire[hooktype - 1] = dire;

+            nore = zOss_PutMutex(gSche_TCBMutex);

+            if (nore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return ZOSS_SUCCESS;

+        }

+    }

+    else if (pTCB->type == SCHE_SDL_TASK)   /* ÉèÖÃSDLÈÎÎñ */

+    {

+        pSDLTCB = (T_ZOss_SDLTCB *)task_id;

+        pSDLTCB->HookEntry[hooktype - 1] = intercept_Entry;

+        pSDLTCB->dire[hooktype - 1] = dire;

+        return ZOSS_SUCCESS;

+    }

+    return ZOSS_ERROR;

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetSelfTaskID

+* ¹¦ÄÜÃèÊö£º»ñÈ¡µ±Ç°ÈÎÎñID

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º·µ»ØÈÎÎñID

+* ÆäËû˵Ã÷£º²»Ö§³ÖSDLÈÎÎñ

+**************************************************************************/

+__tcm_func ZOSS_TASK_ID zOss_GetSelfTaskID(VOID)

+{

+    ZOSS_THREAD_ID  threadId    = NULL;

+    T_ZOss_TCB      *pTCB       = NULL;

+    T_ZOss_TRF      *pTRF       = NULL;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    threadId = zOss_GetCurThreadID();       /* »ñÈ¡µ±Ç°Ïß³ÌID   */

+    if (threadId == NULL)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    pTRF = (T_ZOss_TRF *)Sche_GetTaskID(threadId);

+    if (pTRF == NULL)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    if (pTRF->thread_id == threadId)

+    {

+        pTCB = (T_ZOss_TCB *)zOss_ListFirst(&(pTRF->TCBReady));

+        

+        if (NULL != pTCB)

+        {

+            return (ZOSS_TASK_ID)pTCB;  /* ·ÀÖ¹ÈÎÎñËûɱʱ»ñ²»µ½ÈÎÎñid */

+        }

+    }

+    return ZOSS_INVALID_TASK_ID;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetTaskID

+* ¹¦ÄÜÃèÊö£ºÍ¨¹ýÈÎÎñÃû»ñÈ¡ÈÎÎñID

+* ²ÎÊý˵Ã÷£º(IN)

+            task_name:ÈÎÎñÃû

+            (OUT)

+* ·µ »Ø Öµ£º·µ»ØÈÎÎñID

+* ÆäËû˵Ã÷£º¿ÉÒÔ»ñÈ¡SDLÈÎÎñID

+**************************************************************************/

+__tcm_func ZOSS_TASK_ID zOss_GetTaskID(const CHAR *task_name)

+{

+    T_ZOss_TCB  *pCurTCB    = NULL;

+    UINT32      nore        = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)            /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    zOss_AssertEx(NULL != task_name, ZOSS_INVALID_TASK_ID);

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        pCurTCB = gSche_TCBHeadPtr;

+        while (NULL != pCurTCB)

+        {

+            if (0 == strcmp((char*)task_name, (char *)pCurTCB->task_name) && pCurTCB == (T_ZOss_TCB *)pCurTCB->task_id)

+            {

+                zOss_PutMutex(gSche_TCBMutex);

+                return (ZOSS_TASK_ID)pCurTCB;

+            }

+            pCurTCB = pCurTCB->next;

+        }

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_INVALID_TASK_ID;

+        }

+    }

+    

+    if (gSche_Task_Hook.get_id != NULL)

+    {

+        return gSche_Task_Hook.get_id(task_name);

+    }

+    

+    return ZOSS_INVALID_TASK_ID;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetTaskName

+* ¹¦ÄÜÃèÊö£ºÍ¨¹ýÈÎÎñID»ñÈ¡ÈÎÎñÃû

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id:ÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£º·µ»ØÈÎÎñÃû

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+__tcm_func CHAR *zOss_GetTaskName(ZOSS_TASK_ID task_id)

+{

+    T_ZOss_TCB  *pCurTCB    = NULL;

+    CHAR        *task_name  = NULL;

+

+    if (gSche_IsTaskInit == FALSE)            /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return NULL;

+    }

+

+    zOss_AssertEx(NULL != task_id, NULL);

+ 

+    if (gSche_Task_Hook.get_name != NULL)

+    {

+        task_name = gSche_Task_Hook.get_name(task_id);

+        if (task_name != NULL)

+        {

+            return task_name;

+        }

+    }

+

+    pCurTCB = (T_ZOss_TCB *)task_id;

+

+    if (pCurTCB == (T_ZOss_TCB *)pCurTCB->task_id)

+    {

+        return pCurTCB->task_name;

+    }

+

+    return NULL;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Sender

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ÏûÏ¢Ô´ÈÎÎñID

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÏûÏ¢Ô´ÈÎÎñID

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+__tcm_func ZOSS_TASK_ID zOss_Sender(VOID)

+{

+    T_ZOss_TCB *pTCB = NULL;

+    

+    pTCB = (T_ZOss_TCB *)zOss_GetSelfTaskID();      /* »ñÈ¡µ±Ç°ÈÎÎñTCB±í */

+    if (pTCB == NULL)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    if (pTCB->type != SCHE_OSS_TASK)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    return pTCB->sender_task_id;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_DeadLoop

+* ¹¦ÄÜÃèÊö£ºËÀÑ­»·¼ì²â

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id_arr:´æ·ÅËÀÑ­»·ÈÎÎñIDµÄ¿Õ¼ä

+            (OUT)

+* ·µ »Ø Öµ£ºËÀÑ­»·ÈÎÎñÊýºÍID

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 Sche_DeadLoop(ZOSS_TASK_ID *task_id_arr)

+{

+    T_ZOss_TCB  *pCurTCB            = NULL;

+    UINT32      Curtask_time        = 0;

+    UINT32      i                   = 0;

+    UINT32      deadloop_task_num   = 0;

+    UINT32      nore                = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)                  /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_id_arr, ZOSS_ERROR);

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        Curtask_time    = Osa_HwTimeRead();

+        pCurTCB         = gSche_TCBHeadPtr;

+        while (NULL != pCurTCB)

+        {

+            if (pCurTCB->run_status == ZOSS_STATE_STOPPED || pCurTCB->task_time == 0)

+            {

+                pCurTCB = pCurTCB->next;

+                continue;

+            }

+            

+            /* »ñÈ¡ÈÎÎñÖ´ÐÐʱ¼ä */

+            i = Curtask_time - pCurTCB->task_time;

+            

+            /* ÅжÏÊÇ·ñ³¬Ê± */

+            if (i >= gSche_DeadLoop_Time * 1000 * 1000)

+            {

+                *task_id_arr = pCurTCB->task_id;

+                task_id_arr++;

+                deadloop_task_num++;

+            }

+            pCurTCB = pCurTCB->next;

+        }

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    return deadloop_task_num;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskInit

+* ¹¦ÄÜÃèÊö£º´´½¨¾²Ì¬ÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_TaskInit(VOID)

+{

+    ZOSS_TASK_ID        task_id                 = NULL;

+    UINT32              task_index              = 0;

+    UINT32              i                       = 0;

+    T_OSS_PARAM         *pPlatCfg               = NULL;

+    T_ZOss_TaskTabItem  *TaskTab                = NULL;

+    UINT32              uiSche_Max_TaskTab_Num  = 0;

+    

+    pPlatCfg = zOss_GetOssCfg();

+    TaskTab = pPlatCfg->SysmCfg.pSysm_TaskItemTab;

+    uiSche_Max_TaskTab_Num = pPlatCfg->SysmCfg.task_num;

+    gSche_SaticTaskInitSema = zOss_CreateSemaphore("static_task", 0);

+#ifdef _USE_HAL_HRDTST

+    if (zDrvComm_GetPowerOnState() == POWER_ON_HDT_TEST)

+    {

+        for ( ; task_index < uiSche_Max_TaskTab_Num; task_index++)

+        {

+            if ((1 == TaskTab->is_use) && (TRUE == TaskTab->hardTestFlag))

+            {

+                task_id = zOss_CreateTask_EX(TaskTab->task_name, TaskTab->task_entry,

+                                             TaskTab->stack_size, TaskTab->priority, 

+                                             TaskTab->private_data_len, TaskTab->process_no, 1);

+                

+                if (task_id == ZOSS_INVALID_TASK_ID)

+                {

+                    return ZOSS_ERROR;

+                }

+                else

+                {

+                    gSysm_TaskIDTab[task_index] = task_id;     /* µÇ¼ÇÈÎÎñID */

+                    gTask_TaskNum++;

+                }

+            }

+            TaskTab++;

+        }

+    }

+    else

+    {

+#endif

+#ifdef _USE_SDL

+        tasksdl_table  = (tasksdl_desc *)zOss_Malloc((nof_signalcode * sizeof(tasksdl_desc)));

+        if (tasksdl_table == NULL)

+        {

+            return ZOSS_ERROR;

+        }

+        memset(tasksdl_table, 0, (nof_signalcode * sizeof(tasksdl_desc)));

+#endif

+        for ( ; task_index < uiSche_Max_TaskTab_Num; task_index++)

+        {

+#ifdef _USE_HAL_HRDTST

+            if ((1 == TaskTab->is_use) && ( FALSE == TaskTab->hardTestFlag))

+#else

+            if (1 == TaskTab->is_use)

+#endif

+            {

+                task_id = zOss_CreateTask_EX(TaskTab->task_name, TaskTab->task_entry,

+                                             TaskTab->stack_size, TaskTab->priority, 

+                                             TaskTab->private_data_len, TaskTab->process_no, 1);

+                        

+                if (task_id == ZOSS_INVALID_TASK_ID)

+                {

+                    return ZOSS_ERROR;

+                }

+                else

+                {

+                    gSysm_TaskIDTab[task_index] = task_id;     /* µÇ¼ÇÈÎÎñID */

+                    gTask_TaskNum++; 

+                }

+            }

+#ifdef _USE_SDL

+            for (i = 0; i < nof_signalcode; i++)

+            {

+                if (strcmp((const char *)TaskTab->task_name, (const char *)signalcode_table[i].task_name) == 0)

+                {

+                    tasksdl_table[i].selfid     = signalcode_table[i].selfid;

+                    tasksdl_table[i].task_id    = task_id;

+                    break;

+                }

+            }

+#endif

+            TaskTab++;

+        }

+#ifdef _USE_HAL_HRDTST

+    }

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetTaskTimer

+* ¹¦ÄÜÃèÊö: ÉèÖÃÖÜÆÚÐÔ/·ÇÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷ÏòÄ¿±êÈÎÎñ·¢ËÍÏûÏ¢;

+            ÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢²¢×Ô¶¯ÊͷŶ¨Ê±Æ÷ËùÕ¼×ÊÔ´(·ÇÖÜÆÚÐÔ).

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            desk_task:Ö¸¶¨Ä¿±êÈÎÎñ£¬Èç¹ûÄ¿±êÈÎÎñΪ¿Õʱ£¬½«·¢ËÍÉèÖö¨Ê±Æ÷µÄÈÎÎñ

+            bPeriod:ÊÇ·ñÖÜÆÚÐÔ

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷ID; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetTaskTimer(UINT32 time_len, UINT32 msg_id, UINT32 arg, ZOSS_TASK_ID desk_task_id, BOOL bPeriod)

+{

+    T_TIMER_NODE    *pTimerNode = NULL;

+    T_Task_Arg      *ptTaskArg  = NULL;

+    UINT32          status      = 0;

+

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_INVALID_TIMER_ID;

+    }

+

+    if(desk_task_id == NULL)

+    {

+        desk_task_id = zOss_GetSelfTaskID();

+        zOss_AssertEx(NULL != desk_task_id, ZOSS_INVALID_TIMER_ID);

+    }

+    

+    ptTaskArg = (T_Task_Arg *)zOss_Malloc(sizeof(T_Task_Arg));

+    if (NULL == ptTaskArg)

+    {

+        return ZOSS_INVALID_TIMER_ID;

+    }

+    

+    ptTaskArg->task_id  = desk_task_id;

+    ptTaskArg->msg_id   = msg_id;

+    ptTaskArg->arg      = arg;

+

+    pTimerNode = (T_TIMER_NODE *)zOss_CreateTimer("TaskTimer", (ZOSS_TIMER_FUN)TaskTimer_CallBack, (SINT32)ptTaskArg, bPeriod);

+    

+    if (ZOSS_INVALID_TIMER_ID == pTimerNode)

+    {

+        zOss_Free(ptTaskArg);

+    }

+    else

+    {

+        ptTaskArg->pTimerNode = pTimerNode;

+        pTimerNode->attached = (VOID *)ptTaskArg;

+        status = zOss_StartTimer(pTimerNode, time_len, NULL, 0);

+        

+        if (status == ZOSS_ERROR)

+        {

+            zOss_KillTimer(pTimerNode);

+            zOss_Free(ptTaskArg);

+            pTimerNode = ZOSS_INVALID_TIMER_ID;

+        }

+    }

+    return (ZOSS_TIMER_ID)pTimerNode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetRelativeTimer

+* ¹¦ÄÜÃèÊö: ÉèÖ÷ÇÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷;

+            ÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢²¢×Ô¶¯ÊͷŶ¨Ê±Æ÷ËùÕ¼×ÊÔ´.

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷ID; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: ±ØÐèÔÚÈÎÎñÄÚµ÷ÓÃ

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetRelativeTimer(UINT32 time_len, UINT32 msg_id, UINT32 arg)

+{

+    return zOss_SetTaskTimer(time_len, msg_id, arg, NULL, FALSE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetRelativeTimerByTaskId

+* ¹¦ÄÜÃèÊö: ÉèÖ÷ÇÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷ÏòÄ¿±êÈÎÎñ·¢ËÍÏûÏ¢;

+            ÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢²¢×Ô¶¯ÊͷŶ¨Ê±Æ÷ËùÕ¼×ÊÔ´.

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            desk_task:Ö¸¶¨Ä¿±êÈÎÎñ£¬Èç¹ûÄ¿±êÈÎÎñΪ¿Õʱ£¬½«·¢ËÍÉèÖö¨Ê±Æ÷µÄÈÎÎñ

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷ID; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetRelativeTimerByTaskId(UINT32 time_len, UINT32 msg_id, UINT32 arg, ZOSS_TASK_ID desk_task_id)

+{

+    return zOss_SetTaskTimer(time_len, msg_id, arg, desk_task_id, FALSE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetLoopTimer

+* ¹¦ÄÜÃèÊö: ÉèÖÃÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷;

+            ÒÔÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷±êʶ; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: ±ØÐèÔÚÈÎÎñÄÚµ÷ÓÃ.

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetLoopTimer(UINT32 time_len, UINT32 msg_id, UINT32 arg)

+{

+    return zOss_SetTaskTimer(time_len, msg_id, arg, NULL, TRUE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetLoopTimerByTaskId

+* ¹¦ÄÜÃèÊö: ÉèÖÃÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷ÏòÄ¿±êÈÎÎñ·¢ËÍÏûÏ¢;

+            ÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            desk_task:Ö¸¶¨Ä¿±êÈÎÎñ£¬Èç¹ûÄ¿±êÈÎÎñΪ¿Õʱ£¬½«·¢ËÍÉèÖö¨Ê±Æ÷µÄÈÎÎñ

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷ID; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetLoopTimerByTaskId(UINT32 time_len, UINT32 msg_id, UINT32 arg, ZOSS_TASK_ID desk_task_id)

+{

+    return zOss_SetTaskTimer(time_len, msg_id, arg, desk_task_id, TRUE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_SetTaskID

+* ¹¦ÄÜÃèÊö£ºÉèÖõ÷¶ÈÏß³ÌÈÎÎñÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) 

+            threadId: µ÷¶ÈÏß³Ìid

+            taskId:ÈÎÎñÐÅÏ¢Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£ºZOSS_ERRORÉèÖÃʧ°Ü£¬ZOSS_SUCCESSÉèÖóɹ¦

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+UINT32 Sche_SetTaskID(ZOSS_THREAD_ID threadId, VOID *taskId)

+{

+    T_ZOsa_ThreadUserArea *ptArea = NULL;

+    

+    zOss_AssertEx(threadId != NULL && taskId != NULL, ZOSS_ERROR);    

+    ptArea = Osa_GetThreadUserArea(threadId, TRUE);

+    if (NULL == ptArea)

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        ptArea->ptrf = taskId;

+        return ZOSS_SUCCESS;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_GetTaskID

+* ¹¦ÄÜÃèÊö£º»ñµÃµ÷¶ÈÏß³ÌÈÎÎñÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            threadId: µ÷¶ÈÏß³Ìid

+            (OUT)

+* ·µ »Ø Öµ£ºNULL »ñµÃʧ°Ü

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+__tcm_func VOID *Sche_GetTaskID(ZOSS_THREAD_ID threadId)

+{

+    T_ZOsa_ThreadUserArea *ptArea = NULL;

+    

+    zOss_AssertEx(threadId != NULL, NULL);

+    ptArea = Osa_GetThreadUserArea(threadId, FALSE);

+    

+    if (NULL == ptArea)

+    {

+        return NULL;

+    }

+    else

+    {

+        return ptArea->ptrf;

+    }

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_DefTaskEntry

+* ¹¦ÄÜÃèÊö£ºÈ±Ê¡ÈÎÎñÈë¿Ú

+* ²ÎÊý˵Ã÷£º(IN)

+            arg:²ÎÊýÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+__tcm_func static VOID Sche_DefTaskEntry(SINT32 arg)

+{

+    T_ZOss_TCB              *pTCB       = NULL;

+    T_ZOss_TRF              *pTRF       = NULL;

+    T_ZOss_TaskMsgHead      *msgPtr     = NULL;

+    T_ZOss_TaskMsg          *bufPtr     = NULL;

+    T_ZOsa_ThreadUserArea   *pUa        = NULL;

+    ZOSS_THREAD_ID          threadId    = NULL;

+    VOID                    *buf        = NULL;

+    UINT32                  msgLen      = 0;

+    UINT32                  nRet        = ZOSS_ERROR;

+    UINT32                  nore        = ZOSS_ERROR;

+#ifndef _OS_WIN

+    UINT32  tempTaskTime    = 0;

+    UINT32  taskTimeLen     = 0;

+#endif

+    

+    pTRF = (T_ZOss_TRF *)arg;

+    zOss_AssertExN(NULL != pTRF);

+    

+    pUa = Osa_GetThreadUserArea(zOss_GetCurThreadID(), FALSE);

+    zOss_AssertExN(NULL != pUa);

+

+    /* ÏûÏ¢·Ö·¢ */

+    while (1)

+    {

+        /* »ñÈ¡ÏûÏ¢ */

+        nRet = zOss_RecvMsg((VOID **)&msgPtr, &msgLen, ZOSS_WAIT_FOREVER);

+        zOss_AssertExN(nRet != ZOSS_ERROR);

+        

+        do

+        {

+            if (msgPtr->send_state > 4)

+            {

+                zOss_ASSERT(0);

+                break;

+            }

+

+            pTCB = (T_ZOss_TCB *)msgPtr->t_task_id;         /* »ñȡĿ±êÈÎÎñTCB±í   */

+            

+            switch (msgPtr->msgID)

+            {

+            case EV_TASK_END:                               /* ÈÎÎñɾ³ýÏûÏ¢        */

+                {

+                    if (NULL == Sche_GetTCB(msgPtr->t_task_id))

+                    {

+                        break;

+                    }

+                    pTCB->task_id = NULL;

+                    switch (pTCB->run_status)

+                    {

+                    case ZOSS_STATE_STOPPED:

+                        {

+                            zOss_ListDelete(&(pTRF->TCBStopped), &(pTCB->node));

+                            break;

+                        }

+                    case ZOSS_STATE_IDLE:

+                        {

+                            zOss_ListDelete(&(pTRF->TCBIdle), &(pTCB->node));

+                            break;

+                        }

+                    case ZOSS_STATE_READY:

+                        {

+                            zOss_ListDelete(&(pTRF->TCBReady), &(pTCB->node));

+                            break;

+                        }

+                    default:

+                        {

+                            break;

+                        }

+                    }

+                    Sche_RemoveTCB(pTCB);

+                    if (pTCB->taskData != NULL)

+                    {

+                        zOss_Free(pTCB->taskData);

+                    }

+

+                    while (zOss_ListCount(&pTCB->msg_queue) > 0)

+                    {

+                        buf = (VOID *)zOss_ListFirst(&pTCB->msg_queue);

+                        zOss_AssertExN(buf != NULL);

+                        zOss_ListDelete(&pTCB->msg_queue, (T_ZOss_Node *)buf);

+                        zOss_RetUB(buf);

+                    }

+                    zOss_Free(pTCB);

+                    nore = zOss_RetUB(msgPtr);

+                    if (nore == ZOSS_ERROR)

+                    {

+                        return;

+                    }

+                    if (pTRF->pno == 0)

+                    {

+                        if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TRFMutex, ZOSS_WAIT_FOREVER))

+                        {

+                            zOss_ListDelete(&gSche_TRF_List, &(pTRF->node));

+                            zOss_PutMutex(gSche_TRFMutex);

+                        }

+                        zOss_Free(pTRF);

+                        zOss_ExitThread();

+                    }              

+                    break;

+                }

+                

+            case EV_TASK_CRE:                          /* ÈÎÎñ´´½¨ÏûÏ¢  */

+                {

+                    if (pTCB->task_id == msgPtr->t_task_id)

+                    {

+                        zOss_ListAdd(&(pTRF->TCBIdle), &(pTCB->node));

+                        pTCB->run_status = ZOSS_STATE_IDLE;

+                    }

+                    zOss_RetUB(msgPtr);             

+                    break;

+                }

+                

+            default:                                   /* ÆÕͨÏûÏ¢      */

+                {

+                    if (pTCB->task_id == msgPtr->t_task_id)

+                    {

+                        zOss_ListAdd(&pTCB->msg_queue, &(msgPtr->node));

+                        if (pTCB->run_status == ZOSS_STATE_IDLE)

+                        {

+                            zOss_ListDelete(&(pTRF->TCBIdle), &(pTCB->node));

+                            zOss_ListAdd(&(pTRF->TCBReady), &(pTCB->node));

+                            pTCB->run_status = ZOSS_STATE_READY;

+                        }

+                    }

+                    else

+                    {

+                        zOss_RetUB((UINT8 *)msgPtr);

+                    }              

+                    break;

+                }

+            }

+        }while (ZOSS_SUCCESS == zOss_RecvMsg((VOID **)&msgPtr, &msgLen, ZOSS_NO_WAIT));

+        

+        /* ÏûÏ¢´¦Àí */

+        while (0 != zOss_ListCount(&(pTRF->TCBReady)))

+        {

+            pTCB = (T_ZOss_TCB *)zOss_ListFirst(&(pTRF->TCBReady));     /* È¡¾ÍÐ÷ÈÎÎñÁ´±íµÄµÚÒ»¸öÈÎÎñ */

+            if (pTCB->task_id == NULL)                                  /* Òѱ»É¾³ý */

+            {

+                pTCB->run_status = ZOSS_STATE_STOPPED;

+                zOss_ListDelete(&(pTRF->TCBReady), &(pTCB->node));

+                zOss_ListAdd(&(pTRF->TCBStopped), &(pTCB->node));

+            }

+            else

+            {

+                msgPtr = (T_ZOss_TaskMsgHead *)zOss_ListFirst(&pTCB->msg_queue);   /* È¡ÏûÏ¢¶ÓÁеĵÚÒ»¸öÏûÏ¢ */

+                zOss_AssertExN(msgPtr != NULL);

+                zOss_ListDelete(&pTCB->msg_queue, (T_ZOss_Node *)msgPtr);

+                

+                /* ¶¨Ê±Æ÷ÏûÏ¢ */

+                if (msgPtr->send_state == ZOSS_MSGSENDTYPE_TIMER)

+                {

+                    /* ¶¨Ê±Æ÷ÒѾ­É¾³ý»òÕßÔÝÍ£ */

+                    if (Timer_IgnoreTaskMsg((ZOSS_TIMER_ID)(msgPtr->s_task_id)))

+                    {

+                        zOss_RetUB((UINT8 *)msgPtr);

+                        zOss_ListDelete(&(pTRF->TCBReady), &(pTCB->node));

+                        if (zOss_ListCount(&pTCB->msg_queue) == 0)          /* ÏûÏ¢¶ÓÁÐΪ¿Õ     */

+                        {

+                            pTCB->run_status = ZOSS_STATE_IDLE;

+                            zOss_ListAdd(&(pTRF->TCBIdle), &(pTCB->node));

+                        }

+                        else                                            /* ÏûÏ¢¶ÓÁв»Îª¿Õ   */

+                        {

+                            pTCB->run_status = ZOSS_STATE_READY;

+                            zOss_ListAdd(&(pTRF->TCBReady), &(pTCB->node));

+                        }

+                        continue;

+                    }

+                    msgPtr->s_task_id = NULL;

+                }

+                /* ¼Ç¼ÏûÏ¢ÐÅÏ¢     */

+                pTCB->msg_id = msgPtr->msgID;

+                pTCB->sender_task_id = msgPtr->s_task_id;

+                /* ¸ü¸ÄÈÎÎñ״̬     */

+                pTCB->run_status = ZOSS_STATE_RUN;

+                /* É趨ÈÎÎñ¿ªÊ¼Ê±¼ä */

+                if (gOsa_SwapTimeFlag && gExcep_DaemonTask != NULL)

+                {

+                    pTCB->task_time = Osa_HwTimeRead(); //zOss_GetTickCount();

+                }

+                pUa->curtaskid  = pTCB->task_id;

+#if ZOSS_SELF_MIMO

+                

+                /* ˽ÓÐÊý¾ÝÇø±ß½ç¼ì²é */

+                if (NULL != pTCB->taskData && *(UINT32 *)((UINT32)pTCB->taskData + pTCB->private_data_len) != gSche_pDataRegion_Test)

+                {

+                    SCHE_printf("%s private data overflow", pTCB->task_name);

+                    zOss_ASSERT(0);

+                    return;

+                }

+                threadId = zOss_GetCurThreadID();

+                zOss_AssertExN(pTCB->thread_id == threadId);

+#endif

+                /* µ÷ÓÃÓû§ÏûÏ¢´¦Àíº¯Êý´¦Àí */

+                switch (msgPtr->send_state)

+                {

+                    case ZOSS_MSGSENDTYPE_TIMER:

+                    case ZOSS_MSGSENDTYPE_MSG:

+                    {

+                        pTCB->count++;

+                        if (0 == msgPtr->msgLen)

+                        {

+                            pTCB->taskEntry(pTCB->state, msgPtr->msgID, NULL, msgPtr->msgLen, pTCB->taskData);

+                        }

+                        else

+                        {

+                            pTCB->taskEntry(pTCB->state, msgPtr->msgID, (UINT8 *)(msgPtr + 1), msgPtr->msgLen, pTCB->taskData);

+                        }

+                        if (pTCB->reserved[0] == 1 && msgPtr->msgID == EV_INIT && pTCB->state == ZOSS_STATUS_INIT )

+                        {

+                            zOss_PutSemaphore(gSche_SaticTaskInitSema);

+                            pTCB->reserved[0] = 0;

+                        }

+                        /* ÊÍ·ÅÏûÏ¢ */

+                        zOss_RetUB((UINT8 *)msgPtr);

+                        break;

+                    }

+                            

+                    case ZOSS_MSGSENDTYPE_DATA:

+                    {

+                        bufPtr = (T_ZOss_TaskMsg *)(msgPtr + 1);

+                        pTCB->count++;

+                        pTCB->taskEntry(pTCB->state, msgPtr->msgID, (UINT8 *)bufPtr->msgbuf, bufPtr->msgLenEX, pTCB->taskData);

+                        zOss_RetUB((UINT8 *)msgPtr);

+                        break;

+                    }

+                            

+                    case ZOSS_MSGSENDTYPE_INTER:

+                    {

+                        pTCB->count++;

+                        pTCB->taskEntry(pTCB->state, msgPtr->msgID, (UINT8 *)msgPtr, msgPtr->msgLen, pTCB->taskData);

+                        break;

+                    }

+                            

+                    default:

+                    {

+                        break;

+                    }

+                }

+

+#if ZOSS_SELF_MIMO

+                /* ˽ÓÐÊý¾ÝÇø±ß½ç¼ì²é */

+                if (NULL != pTCB->taskData && *(UINT32 *)((UINT32)pTCB->taskData + pTCB->private_data_len) != gSche_pDataRegion_Test)

+                {

+                    SCHE_printf("%s private data overflow", pTCB->task_name);

+                    zOss_ASSERT(0);

+                    return;

+                }

+#endif

+#ifndef _OS_WIN

+                if (gOsa_SwapTimeFlag)

+                {

+                    tempTaskTime = Osa_HwTimeRead();

+                    if (tempTaskTime >= pTCB->task_time)

+                    {

+                        taskTimeLen = tempTaskTime - pTCB->task_time;

+                    }

+                    else

+                    {

+                        taskTimeLen = tempTaskTime + ~pTCB->task_time;  /* ʱ¼äÒç³ö´¦Àí */

+                    }

+                    pTCB->cputime += taskTimeLen;

+                    pTCB->runtime += taskTimeLen;

+                }

+#endif

+                pUa->curtaskid = 0;

+                /* ÖØÖÃÈÎÎñÖ´ÐÐʱ¼ä */

+                pTCB->task_time = 0;

+                zOss_ListDelete(&(pTRF->TCBReady), &(pTCB->node));

+                if (zOss_ListCount(&pTCB->msg_queue) == 0)                  /* ÏûÏ¢¶ÓÁÐΪ¿Õ     */

+                {

+                    pTCB->run_status = ZOSS_STATE_IDLE;

+                    zOss_ListAdd(&(pTRF->TCBIdle), &(pTCB->node));

+                }

+                else                                                    /* ÏûÏ¢¶ÓÁв»Îª¿Õ   */

+                {

+                    pTCB->run_status = ZOSS_STATE_READY;

+                    zOss_ListAdd(&(pTRF->TCBReady), &(pTCB->node));

+                }

+            }

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_GetTCB

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÈÎÎñID»ñÈ¡TCB

+* ²ÎÊý˵Ã÷£º(IN)

+            taskId:ÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºTCB±íÖ¸Õ룬ʧ°Ü·µ»ØNULL

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+__tcm_func static T_ZOss_TCB *Sche_GetTCB(const ZOSS_TASK_ID taskId)

+{

+    T_ZOss_TCB *pCurTCB = NULL;

+    

+    zOss_AssertEx(NULL != gSche_TCBHeadPtr, NULL);

+  

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        pCurTCB = gSche_TCBHeadPtr;

+        while (NULL != pCurTCB)

+        {

+            if (pCurTCB == (T_ZOss_TCB *)taskId)

+            {

+                zOss_PutMutex(gSche_TCBMutex);

+                return pCurTCB;

+            }

+            pCurTCB = pCurTCB->next;

+        }

+        zOss_PutMutex(gSche_TCBMutex);

+    }

+    return NULL;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_AddTCB

+* ¹¦ÄÜÃèÊö£ºÌí¼ÓÒ»¸öTCB

+* ²ÎÊý˵Ã÷£º(IN)

+            ptTcb:Ìí¼ÓµÄTCB±íÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static UINT32 Sche_AddTCB(T_ZOss_TCB *ptTcb)

+{

+    UINT32 nore = ZOSS_ERROR;

+    

+    zOss_AssertEx(NULL != ptTcb, ZOSS_ERROR);

+    

+    ptTcb->next = NULL;

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        if (gSche_MaxTCBLen >= gSche_Max_TaskTab_Num)                /* ³¬¹ý×î´óÈÎÎñÊý */

+        {

+            zOss_PutMutex(gSche_TCBMutex);

+            return ZOSS_ERROR;

+        }

+        

+        if (NULL == gSche_TCBTailPtr)

+        {

+            gSche_TCBHeadPtr = ptTcb;

+            gSche_TCBTailPtr = ptTcb;

+        }

+        else

+        {

+            gSche_TCBTailPtr->next = ptTcb;

+            gSche_TCBTailPtr = ptTcb;

+        }

+        

+        gSche_MaxTCBLen++;

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return ZOSS_SUCCESS;

+    }

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_RemoveTCB

+* ¹¦ÄÜÃèÊö£ºÉ¾³ýÒ»¸öTCB£¬²»ÊÍ·Å

+* ²ÎÊý˵Ã÷£º(IN)

+            pDelTcb:ÐèҪɾ³ýµÄTCB±íÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static UINT32 Sche_RemoveTCB(T_ZOss_TCB *pDelTcb)

+{

+    T_ZOss_TCB  *pCurTCB    = NULL;

+    UINT32      nore        = ZOSS_ERROR;

+    

+    zOss_AssertEx(NULL != pDelTcb, ZOSS_ERROR);

+

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        if (NULL == gSche_TCBHeadPtr)       /* Á´±íΪ¿Õ */

+        {

+            zOss_PutMutex(gSche_TCBMutex);

+            return ZOSS_ERROR;

+        }

+

+        if (pDelTcb == gSche_TCBHeadPtr)    /* ɾ³ýÍ·½áµã */

+        {

+            if (gSche_TCBHeadPtr == gSche_TCBTailPtr)   /* Ö»ÓÐÒ»¸ö½áµã */

+            {

+                gSche_TCBTailPtr = NULL;

+                gSche_TCBHeadPtr = NULL;

+            }

+            else

+            {

+                gSche_TCBHeadPtr = gSche_TCBHeadPtr->next;

+            }

+            gSche_MaxTCBLen--;

+            nore = zOss_PutMutex(gSche_TCBMutex);

+            if (nore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return ZOSS_SUCCESS;

+        }

+

+        pCurTCB = gSche_TCBHeadPtr;

+        while (NULL != pCurTCB)

+        {

+            if (pCurTCB->next == pDelTcb)

+            {

+                pCurTCB->next = pDelTcb->next;

+                if (gSche_TCBTailPtr == pDelTcb)  /* ɾ³ýβ½áµã */

+                {

+                    gSche_TCBTailPtr = pCurTCB;

+                }

+                gSche_MaxTCBLen--;

+                nore = zOss_PutMutex(gSche_TCBMutex);

+                if (nore == ZOSS_ERROR)

+                {

+                    return ZOSS_ERROR;

+                }

+                return ZOSS_SUCCESS;

+            }

+            pCurTCB = pCurTCB->next;

+        }

+        zOss_PutMutex(gSche_TCBMutex);

+    }

+    return ZOSS_ERROR;

+}

+

+__tcm_func static VOID TaskTimer_CallBack(T_Task_Arg *task_arg)

+{

+    T_ZOss_TaskMsgHead *pTaskMsg = NULL;

+    

+    zOss_AssertExN(task_arg != NULL);

+    

+    pTaskMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(sizeof(T_ZOss_TaskMsgHead) + sizeof(task_arg->arg)); /* ÉêÇëÄÚ´æ³Ø */

+    

+    zOss_AssertExN(pTaskMsg != NULL);

+    

+    pTaskMsg->send_state    = ZOSS_MSGSENDTYPE_TIMER;

+    pTaskMsg->msgID         = task_arg->msg_id;

+    pTaskMsg->msgLen        = sizeof(task_arg->arg);

+    pTaskMsg->t_task_id     = task_arg->task_id;

+    pTaskMsg->s_task_id     = (ZOSS_TASK_ID)task_arg->pTimerNode;

+    zOss_Memcpy((UINT8 *)(pTaskMsg + 1), &(task_arg->arg), pTaskMsg->msgLen);

+    zOss_TaskSendDataEx(pTaskMsg); /* ·¢ËÍÏûÏ¢ */

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Timer_IgnoreTaskMsg

+* ¹¦ÄÜÃèÊö: ÅжÏÊÇ·ñÐèÒªºöÂÔÊÕµ½µÄ¶¨Ê±Æ÷ÏûÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            timerId:¶¨Ê±Æ÷ID

+            (OUT)

+* ·µ »Ø Öµ: ÐèÒªºöÂÔ:TRUE;·ñÔòFALSE

+* ÆäËü˵Ã÷: ¸Ãº¯Êý½öÌṩ¸øÈÎÎñµ÷¶È³ÌÐòʹÓã¬ÓÉÓû§±£Ö¤¡£

+            ¶ÔÓÚ·ÇÖÜÆÚÐÔ¶¨Ê±Æ÷£¬Èç¹û·µ»ØTRUE,ÔòͬʱÊͷŶ¨Ê±Æ÷ËùÕ¼×ÊÔ´

+**************************************************************************/

+__tcm_func static BOOL Timer_IgnoreTaskMsg(ZOSS_TASK_ID timerId)

+{

+    T_TIMER_NODE *pTimerNode = NULL;

+    

+    zOss_AssertEx(NULL != timerId, TRUE);

+    pTimerNode = (T_TIMER_NODE *)timerId;

+    

+    if (pTimerNode->Flag != TIMER_USE && pTimerNode->Flag != TIMER_SUSPEND)

+    {

+        return TRUE;

+    }

+    

+    if (pTimerNode->bPeriod == FALSE)

+    {

+        zOss_KillTimer(timerId);

+    }

+        

+    return FALSE;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_vsim.c b/cp/ps/plat/src/oss/sup/src/sup_vsim.c
new file mode 100644
index 0000000..8bb7963
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_vsim.c
@@ -0,0 +1,781 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98_VSIM

+* ÎÄ ¼þ Ãû : sup_vsim.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : vsimÊý¾Ý¹ÜÀí½Ó¿Ú

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2016-08-06

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "drv_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define VSIM_OP_MEM           0x01  /* VSIMÄÚ´æÄ£Ê½   */

+#define VSIM_OP_FLASH         0x02  /* VSIM FLASHģʽ */

+

+#define VSIM_SYMBOL_DOWNLOAD  0xA2  /* °æ±¾ÏÂÔØ±ê־λ */

+#define VSIM_SYMBOL_NORMAL    0xB3  /* Õý³£±ê־λ     */

+#define VSIM_SYMBOL_WRITE     0xC4  /* дÊý¾Ý±ê־λ   */

+#define VSIM_SYMBOL_MEM       0xD5  /* VSIM ÄÚ´æÄ£Ê½  */

+

+#define VSIM_WORK_AREA        0x01  /* ¹¤×÷Çø±êʶ         */

+#define VSIM_BACKUP_AREA      0x02  /* ±¸·ÝÇø±êʶ         */

+#define VSIM_BOTH_AREA        0x03  /* ¹¤×÷ÇøºÍ±¸·ÝÇø±êʶ */

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷

+**************************************************************************/

+extern UINT8  zOss_GetVsimSupport(VOID);

+extern VOID zOss_vSIMAgtInit(VOID);

+extern SINT32 zDrvNand_SimNvRead(UINT32 dwStart, UINT32 dwLen, UINT8* to);

+extern SINT32 zDrvNand_SimNvProgram(UINT32 dwStart, UINT32 dwLen, UINT8* from);

+extern SINT32 zDrvNand_SimNvFacRead(UINT32 dwStart, UINT32 dwLen, UINT8* to);

+extern SINT32 zDrvNand_SimNvFacProgram(UINT32 dwStart, UINT32 dwLen, UINT8* from);

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static UINT32 vSIM_Resume_Data(UINT8 index);

+static VOID vSIM_Fill_Factory(VOID);

+static BOOL vSIM_Check_Data(VOID);

+static SINT32 vSIM_ReadWithNoReset(UINT32 dwStart, UINT32 dwLen, UINT8* to);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static BOOL             gvSIM_Inited   = FALSE;

+static BOOL             gvSIM_OP_MODE  = VSIM_OP_FLASH;

+static BOOL             gvSIM_InResume = FALSE;         /* vSIM»Ö¸´Á÷³ÌÖÐ */

+static VOID             *gvSIM_FacMem  = NULL;

+static ZOSS_MUTEX_ID    gvSIM_Mutex    = ZOSS_NULL;

+static T_vSIM_PARAM     *gpvSIM_Param  = NULL;

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º VSIM_Init

+* ¹¦ÄÜÃèÊö£º VSIM³õʼ»¯

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_vSIMInit(VOID)

+{

+#if 0

+    T_OSS_PARAM *pOssParam = NULL;

+

+    if (!zOss_GetVsimSupport())

+    {

+        return ZOSS_SUCCESS;

+    }

+    

+    if (gvSIM_Inited)

+    {

+        return ZOSS_SUCCESS;

+    }

+

+    pOssParam    = zOss_GetOssCfg();

+    gpvSIM_Param = &(pOssParam->vSIMCfg);

+

+    if (!vSIM_Check_Data())

+    {

+        return ZOSS_ERROR;

+    }

+

+    gvSIM_Mutex = zOss_CreateMutex("vSIM_Mutex", ZOSS_INHERIT);

+    if (gvSIM_Mutex == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _USE_VSIM_AGT

+    zOss_vSIMAgtInit();

+#endif

+

+    gvSIM_Inited = TRUE;

+

+    return ZOSS_SUCCESS;

+#else

+	return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMDataRead

+* ¹¦ÄÜÃèÊö£º ¶Áȡָ¶¨Çø¼äµÄvSIMÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            addr:  Æ«ÒÆµØÖ·

+*            data:  Êý¾Ý´æ´¢¿Õ¼ä

+*            len:   ¶ÁÈ¡Êý¾ÝµÄ³¤¶È,µ¥Î»×Ö½Ú;

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_vSIMDataRead(UINT32 addr, VOID *data, UINT32 len)

+{

+#if 0

+    SINT32  status = -1;

+

+    zOss_AssertEx(gvSIM_Inited, ZOSS_ERROR);

+    zOss_AssertEx(addr >= gpvSIM_Param->Work_Area_Base_Addr

+                  && len  <= gpvSIM_Param->Area_Size

+                  && addr + len <= gpvSIM_Param->Work_Area_Base_Addr + gpvSIM_Param->Area_Size,

+                  ZOSS_ERROR);

+

+    zOss_GetMutex(gvSIM_Mutex, ZOSS_WAIT_FOREVER);

+

+    if(VSIM_OP_MEM == gvSIM_OP_MODE)

+    {

+        if(!gvSIM_FacMem)

+        {

+            zOss_PutMutex(gvSIM_Mutex);

+            return ZOSS_ERROR;

+        }

+        zOss_Memcpy(data, (VOID *)((UINT8 *)gvSIM_FacMem + addr), len);

+        status = 0;

+    }

+    else

+    {

+        status = zDrvNand_SimNvRead(gpvSIM_Param->Work_Area_Base_Addr + addr, len, data);

+    }

+

+

+    zOss_PutMutex(gvSIM_Mutex);

+

+    return (status == 0) ? ZOSS_SUCCESS : ZOSS_ERROR;

+#else

+    zOss_AssertEx(0, ZOSS_ERROR);

+    return ZOSS_ERROR;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMDataWrite

+* ¹¦ÄÜÃèÊö£º дÈëÖ¸¶¨Çø¼äµÄvSIMÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            addr:  µØÖ·

+*            data:  Êý¾ÝÔ´¿Õ¼ä

+*            len:   дÈëÊý¾ÝµÄ³¤¶È,µ¥Î»×Ö½Ú;

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_vSIMDataWrite(UINT32 addr, VOID *data, UINT32 len)

+{

+#if 0

+    UINT8   symbol = VSIM_SYMBOL_WRITE;

+    SINT32  status = -1;

+

+    zOss_AssertEx(gvSIM_Inited, ZOSS_ERROR);

+    zOss_AssertEx(addr >= gpvSIM_Param->Work_Area_Base_Addr

+                  && len  <= gpvSIM_Param->Area_Size

+                  && addr + len <= gpvSIM_Param->Work_Area_Base_Addr + gpvSIM_Param->Area_Size,

+                  ZOSS_ERROR);

+

+    zOss_GetMutex(gvSIM_Mutex, ZOSS_WAIT_FOREVER);

+

+    if(VSIM_OP_MEM == gvSIM_OP_MODE)

+    {

+        if(!gvSIM_FacMem)

+        {

+            zOss_PutMutex(gvSIM_Mutex);

+            return ZOSS_ERROR;

+        }

+        zOss_Memcpy((VOID *)((UINT8 *)gvSIM_FacMem + addr), data, len);

+        status = 0;

+    }

+    else

+    {

+        do

+        {

+            /* д¹¤×÷Çø */

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Base_Addr + addr, len, data);

+            if (status != 0)

+            {

+                break;

+            }

+

+            symbol = VSIM_SYMBOL_NORMAL;

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            /* д±¸·ÝÇø */

+            symbol = VSIM_SYMBOL_WRITE;

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Base_Addr + addr, len, data);

+            if (status != 0)

+            {

+                break;

+            }

+

+            symbol = VSIM_SYMBOL_NORMAL;

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+        }while(0);

+    }

+

+    zOss_PutMutex(gvSIM_Mutex);

+

+    return (status == 0) ? ZOSS_SUCCESS : ZOSS_ERROR;

+#else

+    zOss_AssertEx(0, ZOSS_ERROR);

+    return ZOSS_ERROR;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMFacWrite

+* ¹¦ÄÜÃèÊö£º дÈëvSIM³ö³§ÇøµÄÈ«²¿Êý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            data:  Êý¾Ý´æ´¢¿Õ¼ä

+*            len:   ¶ÁÈ¡Êý¾ÝµÄ³¤¶È,µ¥Î»×Ö½Ú;

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_vSIMFacWrite(VOID *data, UINT32 len)

+{

+#if 0

+    UINT8   symbol = VSIM_SYMBOL_WRITE;

+    SINT32  status = -1;

+

+    zOss_AssertEx(gvSIM_Inited && gpvSIM_Param->Area_Size >= len, ZOSS_ERROR);

+

+    if(VSIM_OP_MEM == gvSIM_OP_MODE)

+    {

+        zOss_AssertEx(!gvSIM_FacMem, ZOSS_ERROR);

+        gvSIM_FacMem = zOss_Malloc(len);

+        if(NULL == gvSIM_FacMem)

+        {

+            return ZOSS_ERROR;

+        }

+        zOss_Memcpy(gvSIM_FacMem, data, len);

+        status = 0;

+    }

+    else

+    {

+        do

+        {

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            status = zDrvNand_SimNvFacProgram(gpvSIM_Param->Factory_Area_Base_Addr, len, data);

+            if(status != 0)

+            {

+                break;

+            }

+

+            symbol = VSIM_SYMBOL_DOWNLOAD;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+            if(status != 0)

+            {

+                break;

+            }

+        }while(0);

+    }

+    

+    return (status == 0) ? ZOSS_SUCCESS : ZOSS_ERROR;

+#else

+    zOss_AssertEx(0, ZOSS_ERROR);

+    return ZOSS_ERROR;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMRecovery

+* ¹¦ÄÜÃèÊö£º ´Ó³ö³§Çø»Ö¸´Êý¾Ýµ½¹¤×÷ÇøºÍ±¸·ÝÇø

+* ²ÎÊý˵Ã÷£º (IN)

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º ÖØÆôºóÉúЧ

+**************************************************************************/

+UINT32 zOss_vSIMRecovery(VOID)

+{

+#if 0

+    UINT8 symbol = VSIM_SYMBOL_DOWNLOAD;

+    

+    if(gvSIM_OP_MODE == VSIM_OP_MEM)

+        return ZOSS_ERROR;

+

+    return zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol) == DRV_SUCCESS ? ZOSS_SUCCESS : ZOSS_ERROR;

+#else

+    zOss_AssertEx(0, ZOSS_ERROR);

+    return ZOSS_ERROR;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMSetErrorAddr

+* ¹¦ÄÜÃèÊö£º ¸ù¾Ý³ö´íµÄµØÖ·¿Õ¼ä,ÉèÖöÔÓ¦Çø¼äµÄ±ê־λ,ÒÔ±ãÖØÆôºó½øÈë»Ö¸´Á÷³Ì,½â¾önandµÄ±ÈÌØÎ»·´×ªÎÊÌâ

+* ²ÎÊý˵Ã÷£º addr:²Ù×÷³ö´íÇøÓòµÄÂß¼­µØÖ·

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º Çý¶¯½öÔÚvSIMÇø²Ù×÷³öÏÖECC´íÎóʱµ÷ÓÃ

+**************************************************************************/

+VOID zOss_vSIMSetErrorAddr(UINT32 addr)

+{

+#if 0

+    UINT8  symbol   = VSIM_SYMBOL_WRITE;

+    UINT32 rw_start = 0;

+    UINT32 bk_start = 0;

+    UINT32 rw_end   = 0;

+    UINT32 bk_end   = 0;

+

+    rw_start = gpvSIM_Param->Work_Area_Base_Addr;

+    bk_start = gpvSIM_Param->Backup_Area_Base_Addr;

+    rw_end   = rw_start + gpvSIM_Param->Area_Size - 1;

+    bk_end   = bk_start + gpvSIM_Param->Area_Size - 1;

+

+    gvSIM_InResume = TRUE;

+    if(addr >= rw_start && addr <= rw_end)

+    {

+        zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+    }

+    else if(addr >= bk_start && addr <= bk_end)

+    {

+        zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+    }

+    else

+    {

+        zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr,   1, &symbol);

+        zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+        symbol = VSIM_SYMBOL_DOWNLOAD;

+        zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+    }

+    gvSIM_InResume = FALSE;

+    return;

+#else

+    return;	

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMInResume

+* ¹¦ÄÜÃèÊö£º ÊÇ·ñ´¦ÓÚ»Ö¸´Á÷³ÌÖÐ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º TRUE:´¦ÓÚ»Ö¸´Á÷³Ì£»FLASE:²»´¦ÓÚ»Ö¸´Á÷³Ì

+* ÆäËü˵Ã÷£º Çý¶¯Ê¹ÓÃ

+**************************************************************************/

+BOOL zOss_vSIMInResume(VOID)

+{

+    return gvSIM_InResume;

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º vSIM_Resume_Data

+* ¹¦ÄÜÃèÊö£º »Ö¸´Êý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*                index: ÇøÓòË÷ÒýºÅ:

+*                index = VSIM_WORK_AREA:   »Ö¸´¹¤×÷Çø

+*                index = VSIM_BACKUP_AREA: »Ö¸´±¸·ÝÇø  

+*                index = VSIM_BOTH_AREA:   »Ö¸´¹¤×÷ÇøºÍ±¸·ÝÇø  

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 vSIM_Resume_Data(UINT8 index)

+{

+    UINT8   symbol = 0;

+    UINT8   *temp  = NULL;

+    SINT32  status = -1;

+    

+    switch (index)

+    {

+    case VSIM_WORK_AREA:

+        {

+            temp = (UINT8 *)zOss_Malloc(gpvSIM_Param->Area_Size);

+            if (temp == NULL)

+            {

+                return ZOSS_ERROR;

+            }

+            status = zDrvNand_SimNvRead(gpvSIM_Param->Backup_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = TRUE;

+

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = FALSE;

+            

+            zOss_Free(temp);

+            return ZOSS_SUCCESS;

+        }

+    case VSIM_BACKUP_AREA:

+        {

+            temp = (UINT8 *)zOss_Malloc(gpvSIM_Param->Area_Size);

+            if (temp == NULL)

+            {

+                return ZOSS_ERROR;

+            }

+            

+            status = zDrvNand_SimNvRead(gpvSIM_Param->Work_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = TRUE;

+

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = FALSE;

+            

+            zOss_Free(temp);

+            return ZOSS_SUCCESS;

+        }

+    case VSIM_BOTH_AREA:

+        {           

+            temp = (UINT8 *)zOss_Malloc(gpvSIM_Param->Area_Size);

+            if (temp == NULL)

+            {

+                return ZOSS_ERROR;

+            }

+            zOss_Memset(temp, 0xff, gpvSIM_Param->Area_Size);

+            

+            status = zDrvNand_SimNvFacRead(gpvSIM_Param->Factory_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                zOss_Free(temp);

+                zOss_AssertEx(0, ZOSS_ERROR);

+            }

+

+            gvSIM_InResume = TRUE;

+            

+            /* »Ö¸´¹¤×÷Çø */

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            /* »Ö¸´±¸·ÝÇø */

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            /* ÖØÖóö³¡Çø±ê־λ */

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = FALSE;

+            

+            zOss_Free(temp);

+            

+            return ZOSS_SUCCESS;

+        }

+    default:

+        {

+            return ZOSS_ERROR;

+        }    

+    }

+

+    gvSIM_InResume = FALSE;

+

+    if(temp != NULL)

+    {

+        zOss_Free(temp);

+    }

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºvSIM_Fill_Factory

+* ¹¦ÄÜÃèÊö£º´Ó¹¤×÷Çø/±¸·ÝÇø¿½±´Êý¾Ýµ½³ö³§Çø

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÎÞ

+**************************************************************************/

+static VOID vSIM_Fill_Factory(VOID)

+{

+    VOID    *temp  = NULL;

+    UINT8   symbol = 0;

+    SINT32  Status = -1;

+

+    temp = zOss_Malloc(gpvSIM_Param->Area_Size);

+    zOss_AssertExN(temp != NULL);

+

+    do

+    {

+        Status = vSIM_ReadWithNoReset(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+        if(Status != 0 || symbol != VSIM_SYMBOL_NORMAL)

+        {

+            break;

+        }

+

+        Status = zDrvNand_SimNvRead(gpvSIM_Param->Work_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);        

+        if(Status != 0)

+        {

+            break;

+        }

+

+        symbol = VSIM_SYMBOL_NORMAL;

+        gvSIM_InResume = TRUE;

+        zDrvNand_SimNvFacProgram(gpvSIM_Param->Factory_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+        zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+        gvSIM_InResume = FALSE;

+

+        zOss_Free(temp);

+        return;

+    }while(0);

+

+    do

+    {

+        Status = vSIM_ReadWithNoReset(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+        if(Status != 0 || symbol != VSIM_SYMBOL_NORMAL)

+        {

+            break;

+        }

+

+        Status = zDrvNand_SimNvRead(gpvSIM_Param->Backup_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);        

+        if(Status != 0)

+        {

+            break;

+        }

+

+        symbol = VSIM_SYMBOL_NORMAL;

+        gvSIM_InResume = TRUE;

+        zDrvNand_SimNvFacProgram(gpvSIM_Param->Factory_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+        zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+        gvSIM_InResume = FALSE;

+

+        zOss_Free(temp);

+        return;

+    }while(0);

+

+    zOss_Free(temp);

+    zOss_AssertExN(0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º vSIM_ReadWithNoReset

+* ¹¦ÄÜÃèÊö£º ¼òµ¥·â×°Çý¶¯¶Á½Ó¿Ú£¬·¢ÉúECC´íÎóʱ²»ÖØÆô

+* ²ÎÊý˵Ã÷£º (IN)

+*                dwStart: Æ«ÒÆµØÖ·

+*                dwLen:   ³¤¶È

+*                to:      Ä¿±ê»º´æ¿Õ¼ä

+*            (OUT)

+* ·µ »Ø Öµ£º ͬÇý¶¯½Ó¿Ú·µ»ØÖµ£¬³É¹¦·µ»Ø0

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static SINT32 vSIM_ReadWithNoReset(UINT32 dwStart, UINT32 dwLen, UINT8* to)

+{

+    SINT32 status = -1;

+    

+    gvSIM_InResume = TRUE;

+    status = zDrvNand_SimNvRead(dwStart, dwLen, to);

+    gvSIM_InResume = FALSE;

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º vSIM_Check_Data

+* ¹¦ÄÜÃèÊö£º vSIMÊý¾Ý»Ö¸´Á÷³Ì

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØTRUE, ·ñÔò·µ»ØFALSE

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL vSIM_Check_Data(VOID)

+{

+    UINT8   index           = 0;

+    UINT8   WorkArea_Symbol = 0;

+    UINT8   BackUp_Symbol   = 0;

+    UINT8   Factory_Symbol  = 0;

+    UINT32  status          = ZOSS_ERROR;

+    SINT32  WorkArea_Status = -1;

+    SINT32  BackUp_Status   = -1;

+

+    status = vSIM_ReadWithNoReset(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &Factory_Symbol);

+    if(Factory_Symbol == VSIM_SYMBOL_MEM)

+    {

+        gvSIM_OP_MODE = VSIM_OP_MEM;

+        return TRUE;

+    }

+    

+    /* °æ±¾ÏÂÔØ */

+    if(Factory_Symbol == VSIM_SYMBOL_DOWNLOAD)

+    {

+        return (vSIM_Resume_Data(VSIM_WORK_AREA | VSIM_BACKUP_AREA) == ZOSS_SUCCESS) ? TRUE : FALSE;

+    }

+

+    /* ³ö³§Çøµôµç */

+    if(status != 0 || Factory_Symbol == VSIM_SYMBOL_WRITE)

+    {

+        vSIM_Fill_Factory();

+    }

+

+    /* ¶ÁÈ¡¹¤×÷ÇøºÍ±¸·ÝÇøÖеıê־λ */

+    WorkArea_Status = zDrvNand_SimNvRead(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &WorkArea_Symbol);

+    BackUp_Status   = zDrvNand_SimNvRead(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &BackUp_Symbol);

+    if (WorkArea_Status == 0 && BackUp_Status == 0)

+    {

+        if (WorkArea_Symbol != VSIM_SYMBOL_NORMAL)

+        {

+            index = VSIM_WORK_AREA;

+        }

+

+        if (BackUp_Symbol != VSIM_SYMBOL_NORMAL)

+        {

+            index |= VSIM_BACKUP_AREA;

+        }

+

+        if (index != 0)

+        {

+            status = vSIM_Resume_Data(index);

+            if (status != ZOSS_SUCCESS)

+            {

+                return FALSE;

+            }

+        }

+    }

+    else if (WorkArea_Status == 0 && WorkArea_Symbol == VSIM_SYMBOL_NORMAL)

+    {

+        index  = VSIM_BACKUP_AREA;

+        status = vSIM_Resume_Data(index);

+        if (status != ZOSS_SUCCESS)

+        {

+            return FALSE;

+        }

+    }

+    else if (BackUp_Status == 0 && BackUp_Symbol == VSIM_SYMBOL_NORMAL)

+    {

+        index  = VSIM_WORK_AREA;

+        status = vSIM_Resume_Data(index);

+        if (status != ZOSS_SUCCESS)

+        {

+            return FALSE;

+        }  

+    }

+    else

+    {

+        index  = VSIM_WORK_AREA | VSIM_BACKUP_AREA;

+        status = vSIM_Resume_Data(index);

+        if (status != ZOSS_SUCCESS)

+        {

+            return FALSE;

+        }

+    }

+

+    return TRUE;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_vsim_agt.c b/cp/ps/plat/src/oss/sup/src/sup_vsim_agt.c
new file mode 100644
index 0000000..b9ce357
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_vsim_agt.c
@@ -0,0 +1,215 @@
+/*******************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+********************************************************************************

+* Ä£ ¿é Ãû : P98_VSIM

+* ÎÄ ¼þ Ãû : vsim_icp.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : vsimÊý¾Ý¹ÜÀí½Ó¿Ú

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2016-08-06

+* ÆäËü˵Ã÷ : 

+*******************************************************************************/

+

+/*******************************************************************************

+* #includeÇø

+*******************************************************************************/

+#include "oss_api.h"

+#include "drv_api.h"

+#include "drvs_rpmsg.h"

+#include "drvs_icp.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/*******************************************************************************

+* ºê¶¨ÒåÇø

+*******************************************************************************/

+#define VSIM_ICP_CHANNEL_SIZE    (1 * 1024)

+#define VSIM_ICP_CHANNEL         (VSIM)

+#define VSIM_ICP_MAX_SIZE        (5 * 1024)

+#define VSIM_ICP_MSG_HEADER_SIZE (16)

+#define VSIM_ICP_BUF_SIZE        (VSIM_ICP_MAX_SIZE-VSIM_ICP_MSG_HEADER_SIZE)

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/

+

+typedef struct
+{

+    UINT32 addr;

+    UINT32 len;

+    CHAR   buf[VSIM_ICP_BUF_SIZE];

+} icp_msg_data_t;

+

+typedef struct

+{

+    unsigned long  cmd;

+    unsigned long  total;

+    icp_msg_data_t data;

+} icp_msg_t;

+

+enum
+{

+    VSIM_CMD_RECOVERY = 1,

+	VSIM_CMD_WRITE_FACTORY,

+	VSIM_CMD_WRITE_SPECIAL,

+};

+

+/*******************************************************************************

+* Íⲿº¯ÊýÉùÃ÷

+*******************************************************************************/

+

+

+/*******************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+*******************************************************************************/

+static UINT32 vsim_icp_buf[VSIM_ICP_MAX_SIZE / sizeof(UINT32)];

+

+/*******************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+*******************************************************************************/

+

+

+/*******************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+*******************************************************************************/

+

+/*******************************************************************************

+* º¯ÊýÃû³Æ£º vSIM_Resume_Data

+* ¹¦ÄÜÃèÊö£º »Ö¸´Êý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*                index: ÇøÓòË÷ÒýºÅ:

+*                index = VSIM_WORK_AREA:   »Ö¸´¹¤×÷Çø

+*                index = VSIM_BACKUP_AREA: »Ö¸´±¸·ÝÇø  

+*                index = VSIM_BOTH_AREA:   »Ö¸´¹¤×÷ÇøºÍ±¸·ÝÇø  

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+*******************************************************************************/

+static VOID vsim_icp_read_blocked(SINT32 args)

+{

+    UINT32          ret   = ZOSS_ERROR;

+    CHAR            *pBuf = NULL;

+    CHAR            *pTmp = NULL;

+    UINT32           len  = 0;

+    icp_msg_t       *pMsg = NULL;    

+    T_ZDrvRpMsg_Msg msgRead;

+    T_ZDrvRpMsg_Msg msgWrite;

+

+    msgRead.actorID = ICP_MSG_ACTOR_A9;

+    msgRead.chID    = VSIM_ICP_CHANNEL;

+    msgRead.buf     = vsim_icp_buf;

+

+    msgWrite.actorID = ICP_MSG_ACTOR_A9;

+    msgWrite.chID    = VSIM_ICP_CHANNEL;

+

+    while(1)

+    {

+        ret = ZOSS_ERROR;

+        msgRead.flag = ~RPMSG_READ_POLL;

+        msgRead.len  = sizeof(vsim_icp_buf);

+

+        do

+        {

+            ret = zDrvRpMsg_Read(&msgRead);

+            if (ret == RPMSG_CHANNEL_INEXISTANCE)

+                break;

+            zOss_ASSERT(ret > 0);

+

+            pMsg = (icp_msg_t *)vsim_icp_buf;

+            if(pMsg->total)

+            {

+                if(!pBuf)

+                {

+                    pBuf = zOss_Malloc(pMsg->total);

+                    if (pBuf == NULL)

+                        zOss_ASSERT(pBuf != NULL);

+

+                    pTmp = pBuf;

+                    len = pMsg->total;

+                }

+                zOss_Memcpy(pTmp, pMsg->data.buf, pMsg->data.len);

+                pTmp += pMsg->data.len;

+                len -= pMsg->data.len;

+

+                msgWrite.buf = &ret;

+                ret = 0;

+                msgWrite.flag = RPMSG_WRITE_INT;

+                msgWrite.len = sizeof(ret);

+                ret = zDrvRpMsg_Write(&msgWrite);

+                zOss_ASSERT(ret > 0);

+            }

+        }while(len > 0);

+

+        if (ret == RPMSG_CHANNEL_INEXISTANCE)

+            continue;

+

+        switch (pMsg->cmd)

+        {

+            case VSIM_CMD_RECOVERY:

+                ret = zOss_vSIMRecovery();

+                break;

+

+            case VSIM_CMD_WRITE_FACTORY:                    

+                ret = zOss_vSIMFacWrite((VOID *)pBuf, pMsg->total);

+                ret = 0;

+                break;

+

+            case VSIM_CMD_WRITE_SPECIAL:

+                ret = zOss_vSIMDataWrite(pMsg->data.addr, (VOID *)pBuf, pMsg->total);

+                ret = 0;

+                break;

+

+            default:

+                break;

+        }

+

+        if (pBuf != NULL)

+        {

+            zOss_Free(pBuf);

+            pBuf = NULL;

+        }

+

+        msgWrite.buf = &ret;

+        msgWrite.flag = RPMSG_WRITE_INT;

+        msgWrite.len = sizeof(ret);

+        ret = zDrvRpMsg_Write(&msgWrite);

+        zOss_ASSERT(ret > 0);

+

+        zOss_Memset(vsim_icp_buf, 0, VSIM_ICP_MAX_SIZE);

+    }

+}

+

+

+/*******************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+*******************************************************************************/

+/*******************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMAgtInit

+* ¹¦ÄÜÃèÊö£º VSIM´úÀí³õʼ»¯

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+*******************************************************************************/

+VOID zOss_vSIMAgtInit(VOID)

+{

+    SINT32         ret;

+    ZOSS_THREAD_ID threadID;

+    

+    ret = zDrvRpMsg_CreateChannel(ICP_MSG_ACTOR_A9, VSIM_ICP_CHANNEL, VSIM_ICP_CHANNEL_SIZE);

+    zOss_ASSERT(ret == DRV_SUCCESS);

+

+

+    threadID = zOss_CreateThread("vsim_icp_read_thread", vsim_icp_read_blocked, 0, 4 * 1024, 25, 1, 1);

+    zOss_ASSERT(threadID != NULL);

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/ws/makefile b/cp/ps/plat/src/oss/sup/ws/makefile
new file mode 100644
index 0000000..4c9e1f0
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/ws/makefile
@@ -0,0 +1,48 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: ±àÒë×Óϵͳsup

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_SUBSYS_NAME = plat_sup

+

+_SUBSYS_LIB_PATH = $(PLAT_LIB_INTERNAL_PATH)

+

+_ALL_MDLS = 

+_ALL_OBJECTS = 

+

+MDL_PATH = $(PLAT_PATH)/src/oss/sup/src

+

+#===============================================================================

+#SUPÄ£¿é

+#===============================================================================

+sup:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(MDL_PATH)

+supclean:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(MDL_PATH) clean

+

+_ALL_MDLS += sup 

+_ALL_OBJECTS += $(wildcard $(OBJ_PATH)/plat/oss/sup/*.o) 

+

+ifeq ($(USE_VDD),yes)

+_ALL_OBJECTS += $(wildcard $(OBJ_PATH)/plat/drv/vdd/*.o)

+endif

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/lib_rules.mk

+