SPM: Implement version check for stateless service

Encode the service version and stateless indicator into
stateless handle, validate the stateless handle indicator,
version and index before using.

Change-Id: Id5f388f938a758803863958dfbb0c0011c2e1f04
Signed-off-by: Mingyang Sun <mingyang.sun@arm.com>
diff --git a/tools/tfm_parse_manifest_list.py b/tools/tfm_parse_manifest_list.py
index d4a0d80..cfc6bfc 100644
--- a/tools/tfm_parse_manifest_list.py
+++ b/tools/tfm_parse_manifest_list.py
@@ -231,12 +231,23 @@
 
     # Auto-allocate stateless handle
     for i in range(0, static_handle_max_num):
-        if reordered_stateless_list[i] == None:
+        if reordered_stateless_list[i] == None and len(stateless_services) > 0:
             service = stateless_services.pop(0)
             service['stateless_handle'] = i + 1
             reordered_stateless_list[i] = service
-        if len(stateless_services) == 0:
-            break
+        """
+        Encode stateless flag and version into stateless handle
+        bit 30: stateless handle indicator
+        bit 15-8: stateless service version
+        bit 7-0: stateless handle index
+        """
+        if reordered_stateless_list[i] != None:
+            stateless_handle_value = reordered_stateless_list[i]['stateless_handle']
+            stateless_flag = 1 << 30
+            stateless_handle_value |= stateless_flag
+            stateless_version = (reordered_stateless_list[i]['version'] & 0xFF) << 8
+            stateless_handle_value |= stateless_version
+            reordered_stateless_list[i]['stateless_handle'] = '0x%08x' % stateless_handle_value
 
     return reordered_stateless_list