Changeset 15082


Ignore:
Timestamp:
Nov 19, 2011, 10:35:26 PM (8 years ago)
Author:
gb
Message:

When stack-allocating variable-sized objects, check proposed new
SP value against tcr.cs_limit rather than depending on hitting
guard pages. Small/fixedsize objects will still run into the
guard page(s) and cause overflow to be signaled.

(This basically means that larger things can be stack-consed
successfully, and that the limit has to do with available stack
space.)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/arm-spentry.s

    r14971 r15082  
    10551055        __(uuo_error_reg_not_xtype(al,arg_y,xtype_unsigned_byte_24))
    105610561:             
    1057         __(unbox_fixnum(imm0,arg_z))
    1058         __(extract_fulltag(imm1,imm0))
     1057        __(unbox_fixnum(imm2,arg_z))
     1058        __(extract_fulltag(imm1,imm2))
    10591059        __(cmp imm1,#fulltag_nodeheader)
    10601060        __(bne 1f)
    10611061        __(dnode_align(imm1,arg_y,node_size))
    1062         __(cmp imm1,#stack_alloc_limit)
    1063         __(bhs stack_misc_alloc_no_room)
    10641062        __(mov imm0,#subtag_u32_vector)
    10651063        __(orr imm0,imm0,arg_y,lsl #num_subtag_bits-fixnumshift)
    1066         __(mov temp0,#stack_alloc_marker)
    1067         __(mov temp1,sp)
    1068         __(stack_allocate_zeroed_ivector(imm0,imm1))
    1069         __(unbox_fixnum(imm0,arg_z))
    1070         __(strb imm0,[sp])
    1071         __(add arg_z,sp,#fulltag_misc)
    1072         __(stmdb sp!,{temp0,temp1})
    1073         __(bx lr)
     1064        __(b 9f)
    107410651:      __(mov imm0,arg_y,lsl #num_subtag_bits-fixnumshift)
    10751066        __(orr imm0,imm0,arg_z,lsr #fixnumshift)
     
    10891080        __(movne imm1,imm1,lsr#3+fixnumshift)
    109010818:      __(dnode_align(imm1,imm1,node_size))
    1091         __(cmp imm1,#stack_alloc_limit)
    1092         __(bhs stack_misc_alloc_no_room)
     10829:     
     1083        __(ldr temp0,[rcontext,tcr.cs_limit])
     1084        __(sub temp1,sp,imm1)
     1085        __(cmp temp1,temp0)
     1086        __(bls stack_misc_alloc_no_room)
    10931087        __(mov temp0,#stack_alloc_marker)
    10941088        __(mov temp1,sp)
    10951089        __(stack_allocate_zeroed_ivector(imm0,imm1))
    10961090        __(add arg_z,sp,#fulltag_misc)
     1091        __(strb imm2,[sp])
    10971092        __(stmdb sp!,{temp0,temp1})
    10981093        __(bx lr)
     
    13281323        __(mov imm1,imm1,lsl #num_subtag_bits-fixnumshift)
    13291324        __(orr imm1,imm1,#subtag_u32_vector)
    1330         __(cmp imm0,#stack_alloc_limit)
    1331         __(bge 3f)
     1325        __(sub arg_x,sp,imm0)
     1326        __(ldr arg_y,[rcontext,#tcr.cs_limit])
     1327        __(cmp arg_x,arg_y)
     1328        __(blo 3f)
    13321329        __(stack_allocate_zeroed_ivector(imm1,imm0))
    13331330        __(mov imm0,#subtag_simple_vector)
     
    16441641        __(add imm1,imm1,#node_size)
    16451642        __(add imm0,imm1,#node_size)
    1646         __(cmp imm0,#stack_alloc_limit)
     1643        __(sub imm2,sp,imm0)
     1644        __(ldr temp0,[rcontext,#tcr.cs_limit])
     1645        __(cmp imm2,temp0)
    16471646        __(mov temp0,sp)
    1648         __(bhs 1f)
     1647        __(bls 1f)
    16491648        __(mov imm1,imm1,lsl #num_subtag_bits)
    16501649        __(orr imm1,imm1,#subtag_u8_vector)
     
    16761675        __(add imm1,imm1,#node_size)
    16771676        __(add imm0,imm1,#node_size)
    1678         __(cmp imm0,#stack_alloc_limit)
     1677        __(sub imm2,sp,imm0)
     1678        __(ldr temp0,[rcontext,#tcr.cs_limit])
     1679        __(cmp imm2,temp0)
    16791680        __(mov temp0,sp)
    1680         __(bhs 1f)
     1681        __(bls 1f)
    16811682        __(mov imm1,imm1,lsl #num_subtag_bits)
    16821683        __(orr imm1,imm1,#subtag_u8_vector)
     
    17131714        __(orr imm1,imm1,#subtag_u32_vector)
    17141715        __(add imm0,imm0,#dnode_size)
    1715         __(cmp imm0,#stack_alloc_limit)
    1716         __(bge 4f)
     1716        __(ldr temp0,[rcontext,#tcr.cs_limit])
     1717        __(sub imm2,sp,imm0)
     1718        __(cmp imm2,temp0)
     1719        __(bls 4f)
    17171720        __(stack_allocate_zeroed_ivector(imm1,imm0))
    17181721        __(mov imm0,#subtag_simple_vector)
     
    17551758        __(mov imm1,imm0,lsl #num_subtag_bits-fixnumshift)
    17561759        __(orr imm1,imm1,#subtag_u32_vector)
     1760        __(sub temp2,sp,imm1)
     1761        __(ldr arg_x,[rcontext,#tcr.cs_limit])
     1762        __(cmp temp2,arg_x)       
    17571763        __(mov temp2,sp)
    17581764        __(mov arg_x,#stack_alloc_marker)
     1765        __(bls 3f)
    17591766        __(stack_allocate_zeroed_ivector(imm1,temp1))
    17601767        __(unbox_fixnum(imm1,temp0))
     
    17711778        __(add vsp,vsp,#fixnumone)
    17721779        __(bx lr)
    1773 
     17803:      /* Have to heap-cons. */       
     1781        __(stmdb sp!,{arg_x,temp2})
     1782        __(vpush1(nargs))
     1783        __(mov arg_y,nargs)
     1784        __(mov arg_z,temp0)
     1785        __(build_lisp_frame(imm0))
     1786        __(bl _SPmisc_alloc)
     1787        __(restore_lisp_frame(imm0))
     1788        __(vpop1(nargs))
     1789        __(add imm0,nargs,#misc_data_offset)
     1790        __(b 5f)
     17914:      __(vpop1(temp0))
     1792        __(subs imm0,imm0,#fixnumone)
     1793        __(str temp0,[arg_z,imm0])
     17945:      __(subs nargs,nargs,#fixnumone)
     1795        __(bne 4b)
     1796        __(add vsp,vsp,#fixnumone)
     1797        __(bx lr)
     1798       
    17741799/* Allocate a "fulltag_misc" object.  On entry, arg_y contains the element  */
    17751800/* count (boxed) and  arg_z contains the subtag (boxed).  Both of these   */
     
    20652090        __(bne stack_misc_alloc_init_ivector)
    20662091        __(dnode_align(imm1,arg_x,node_size))
    2067         __(cmp imm1,#stack_alloc_limit)
    2068         __(bge stack_misc_alloc_init_no_room)
     2092        __(ldr temp1,[rcontext,#tcr.cs_limit])
     2093        __(sub temp0,sp,imm1)
     2094        __(cmp temp0,temp1)
     2095        __(bls stack_misc_alloc_init_no_room)
    20692096        __(mov imm0,#subtag_u32_vector)
    20702097        __(orr imm0,imm0,arg_x,lsl #num_subtag_bits-fixnumshift)
     
    43044331        __(movne imm1,imm1,lsr#3+fixnumshift)
    430543328:      __(dnode_align(imm1,imm1,node_size))
    4306         __(cmp imm1,#stack_alloc_limit)
    4307         __(bhs stack_misc_alloc_init_no_room)
     4333        __(ldr temp0,[rcontext,#tcr.cs_limit])
     4334        __(sub temp1,sp,imm1)
     4335        __(cmp temp1,temp0)
     4336        __(bls stack_misc_alloc_init_no_room)
    43084337        __(mov temp0,#stack_alloc_marker)
    43094338        __(mov temp1,sp)
Note: See TracChangeset for help on using the changeset viewer.