12e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/** 22e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * Copyright(c) 2011 Trusted Logic. All rights reserved. 32e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 42e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * Redistribution and use in source and binary forms, with or without 52e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * modification, are permitted provided that the following conditions 62e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * are met: 72e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 82e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * * Redistributions of source code must retain the above copyright 92e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * notice, this list of conditions and the following disclaimer. 102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * * Redistributions in binary form must reproduce the above copyright 112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * notice, this list of conditions and the following disclaimer in 122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * the documentation and/or other materials provided with the 132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * distribution. 142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * * Neither the name Trusted Logic nor the names of its 152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * contributors may be used to endorse or promote products derived 162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * from this software without specific prior written permission. 172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley */ 302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/*---------------------------------------------------------------------------- 322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * Notes 332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * ===== 342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * This file is an extension to the delegation client for SMC omap3. It 362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * permits to manage two differences with the original client: 372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * - command line parsing to take into account a file as input 382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * - associate a specific path to each partition 392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *----------------------------------------------------------------------------*/ 412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <stdarg.h> 422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <assert.h> 432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <stdlib.h> 442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <stdio.h> 452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <string.h> 462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "s_version.h" 482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "s_error.h" 492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "s_type.h" 502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "smc_properties.h" 512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/* 532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * This function : 542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 1) parses the configuration file of the SMC 552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 2) checks that all mandatory partition name are present and valid 562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 3) associates partition names to one of the 16 partition IDs 572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 4) Mapping is as follow: 582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * -- partition 0 <--> File System 592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * -- partition 1 <--> Keystore System 602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * -- partition 2 <--> Keystore User 612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * -- partition 15 <--> Super Partition 622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * 632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * It returns 0 in case of success and the error code requested by tf_daemon otherwise. 642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley */ 652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleyint parseCommandLineExtension(char* configurationFileName, char* partitionNames[16]) 662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{ 672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley int error = 0; 682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley uint32_t i = 0; 692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley char * tmpChar = NULL; 702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley if (configurationFileName == NULL) 722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley { 732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley return 1; 742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley } 752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley error = smcPropertiesParse(configurationFileName); 772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley if ( error != 0 ) 782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley { 792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley return error; 802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley } 812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley /* Allocate SMC partition file Name */ 832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley for(i=0; i<15; i++) 842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley { 852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley partitionNames[i] = NULL; 862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley } 872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley /* File System File Name */ 902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley tmpChar = smcGetPropertyAsString(FILE_SYSTEM_FILE_NAME); 912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley if ( tmpChar == NULL ) 922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley { 932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley printf("Main system partition storage file name is missing.\n"); 942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley goto return_error; 952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley } 962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley partitionNames[0] = malloc (strlen(tmpChar) + 1); 972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley sprintf(partitionNames[0], "%s", tmpChar); 982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley /* Keystore System File Name */ 1002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley tmpChar = smcGetPropertyAsString(KEYSTORE_SYSTEM_FILE_NAME); 1012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley if ( tmpChar == NULL ) 1022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley { 1032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley printf("Main system partition storage file name is missing.\n"); 1042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley goto return_error; 1052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley } 1062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley partitionNames[1] = malloc (strlen(tmpChar) + 1); 1072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley sprintf(partitionNames[1], "%s", tmpChar); 1082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 1092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley /* Keystore User File Name */ 1102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley tmpChar = smcGetPropertyAsString(KEYSTORE_USER_FILE_NAME); 1112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley if ( tmpChar == NULL ) 1122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley { 1132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley printf("Main system partition storage file name is missing.\n"); 1142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley goto return_error; 1152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley } 1162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley partitionNames[2] = malloc (strlen(tmpChar) + 1); 1172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley sprintf(partitionNames[2], "%s", tmpChar); 1182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 1192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley /* Super Partition File Name */ 1202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley tmpChar = smcGetPropertyAsString(SUPER_PARTITION_FILE_NAME); 1212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley if ( tmpChar == NULL ) 1222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley { 1232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley printf("Main system partition storage file name is missing.\n"); 1242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley goto return_error; 1252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley } 1262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley partitionNames[15] = malloc (strlen(tmpChar) + 1); 1272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley sprintf(partitionNames[15], "%s", tmpChar); 1282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 1292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley /* return Success */ 1302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley return 0; 1312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley 1322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleyreturn_error: 1332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley for (i=0; i<15; i++) 1342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley { 1352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley if (partitionNames[i] != NULL) free(partitionNames[i]); 1362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley } 1372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley return 1; 1382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley} 139