Fix linking with musl libc with asm enabled.
authorTimothy B. Terriberry <tterribe@xiph.org>
Fri, 23 Sep 2016 19:38:06 +0000 (12:38 -0700)
committerTimothy B. Terriberry <tterribe@xiph.org>
Fri, 23 Sep 2016 19:47:39 +0000 (12:47 -0700)
We made sure to emit emms before potentially calling/returning to
 applicate code, but not before calling libc code.
It turns out musl libc's malloc/free implementation use floating
 point, so they don't work correctly unless we do.
Add some extra calls to make sure the FPU is in the proper state
 any place we might potentially call malloc or free.

Thanks to Rune (ztsdztsd on Trac) for the report.

Fixes #2287

lib/decode.c
lib/encode.c

index 93b806c..c243849 100644 (file)
@@ -1203,6 +1203,9 @@ static void oc_dec_residual_tokens_unpack(oc_dec_ctx *_dec){
 
 
 static int oc_dec_postprocess_init(oc_dec_ctx *_dec){
+  /*musl libc malloc()/realloc() calls might use floating point, so make sure
+     we've cleared the MMX state for them.*/
+  oc_restore_fpu(&_dec->state);
   /*pp_level 0: disabled; free any memory used and return*/
   if(_dec->pp_level<=OC_PP_LEVEL_DISABLED){
     if(_dec->dc_qis!=NULL){
index 90dc46c..3309f97 100644 (file)
@@ -907,6 +907,9 @@ static void oc_enc_drop_frame_pack(oc_enc_ctx *_enc){
 }
 
 static void oc_enc_frame_pack(oc_enc_ctx *_enc){
+  /*musl libc malloc()/realloc() calls might use floating point, so make sure
+     we've cleared the MMX state for them.*/
+  oc_restore_fpu(&_enc->state);
   oggpackB_reset(&_enc->opb);
   /*Only proceed if we have some coded blocks.*/
   if(_enc->state.ntotal_coded_fragis>0){