aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuji Mano <yuji.mano@am.sony.com>2009-03-19 13:54:17 -0700
committerYuji Mano <yuji.mano@am.sony.com>2009-03-23 12:19:04 -0700
commit171753db0f9430e41907323b7d98aaeaf32c4b68 (patch)
treed66ee2cf91f769b4c0bdaf43f5d0d90532f5c3f6
parent82b2880147437f8337f6704b3ef8864098f5710e (diff)
downloadmars-src-171753db0f9430e41907323b7d98aaeaf32c4b68.tar.gz
base: Context negative num mpus segfault
This patch fixes a bug that would result in a segfault if a negative number of mpus are requested when creating a MARS context. Also the internal function mars_mpu_max() now returns 0 as a successful result. The caller is responsible for handling a return of 0 appropriately. MARS_ERROR_INTERNAL is only returned if there was some error to retrieve the count. Signed-off-by: Yuji Mano <yuji.mano@am.sony.com> Acked-by: Kazunori Asayama <asayama@sm.sony.co.jp>
-rw-r--r--base/include/host/mars/context.h5
-rw-r--r--base/src/host/lib/context.c6
-rw-r--r--base/src/host/lib/context_internal.h2
-rw-r--r--base/src/host/lib/mpu_cell.c12
4 files changed, 16 insertions, 9 deletions
diff --git a/base/include/host/mars/context.h b/base/include/host/mars/context.h
index 7888320..db39470 100644
--- a/base/include/host/mars/context.h
+++ b/base/include/host/mars/context.h
@@ -88,12 +88,13 @@ extern "C" {
* each MARS context will suffer the large over head of MPU context switches.
*
* \param[out] mars - address of pointer to MARS context
- * \param[in] num_mpus - number of mpus utilized by MARS context
+ * \param[in] num_mpus - number of mpus requested by MARS context
* \param[in] shared - specifies if context is shared or not
* \return
* MARS_SUCCESS - successfully created MARS context
* \n MARS_ERROR_NULL - null pointer specified
- * \n MARS_ERROR_PARAMS - bad MARS params specified
+ * \n MARS_ERROR_LIMIT - no more available MPUs
+ * \n MARS_ERROR_PARAMS - more MPUs requested than there are available
* \n MARS_ERROR_MEMORY - not enough memory
* \n MARS_ERROR_INTERNAL - some internal error occurred
*/
diff --git a/base/src/host/lib/context.c b/base/src/host/lib/context.c
index d6c7ad5..22dbbc9 100644
--- a/base/src/host/lib/context.c
+++ b/base/src/host/lib/context.c
@@ -183,7 +183,7 @@ int mars_context_create(struct mars_context **mars_ret, uint32_t num_mpus,
uint8_t shared)
{
int ret;
- int num_mpus_max;
+ uint32_t num_mpus_max;
struct mars_context *mars = NULL;
/* check function params */
@@ -194,7 +194,9 @@ int mars_context_create(struct mars_context **mars_ret, uint32_t num_mpus,
ret = mars_mpu_max(&num_mpus_max);
if (ret != MARS_SUCCESS)
return ret;
- if (num_mpus_max < (int)num_mpus)
+ if (!num_mpus_max)
+ return MARS_ERROR_LIMIT;
+ if (num_mpus > num_mpus_max)
return MARS_ERROR_PARAMS;
if (!num_mpus)
num_mpus = num_mpus_max;
diff --git a/base/src/host/lib/context_internal.h b/base/src/host/lib/context_internal.h
index a5ca963..ef8e0e3 100644
--- a/base/src/host/lib/context_internal.h
+++ b/base/src/host/lib/context_internal.h
@@ -72,7 +72,7 @@ struct mars_context {
mars_callback_t callback_handler;
};
-int mars_mpu_max(int *num);
+int mars_mpu_max(uint32_t *num);
int mars_mpu_run(mars_mpu_context_t *mpu, uint64_t params_ea);
int mars_mpu_wait(mars_mpu_context_t *mpu);
diff --git a/base/src/host/lib/mpu_cell.c b/base/src/host/lib/mpu_cell.c
index cff9233..49744fd 100644
--- a/base/src/host/lib/mpu_cell.c
+++ b/base/src/host/lib/mpu_cell.c
@@ -89,16 +89,20 @@ static int numa_mpu_max(void)
extern const unsigned char mars_kernel_entry[];
-int mars_mpu_max(int *num)
+int mars_mpu_max(uint32_t *num)
{
+ int mpu_max;
+
if (mars_numa_enabled())
- *num = numa_mpu_max();
+ mpu_max = numa_mpu_max();
else
- *num = spe_cpu_info_get(SPE_COUNT_USABLE_SPES, -1);
+ mpu_max = spe_cpu_info_get(SPE_COUNT_USABLE_SPES, -1);
- if (*num <= 0)
+ if (mpu_max < 0)
return MARS_ERROR_INTERNAL;
+ *num = mpu_max;
+
return MARS_SUCCESS;
}