; Copyright 1996 Acorn Computers Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;     http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
; -*- Mode: Assembler -*-
;* Shared library kernel: Arthur module version
;* Lastedit: 22 Feb 90 16:07:23 by Harry Meekings *
;
; Copyright (C) Acorn Computers Ltd., 1988.
;

        GBLL    Brazil_Compatible
        GBLS    Calling_Standard
        GBLL    ModeMayBeNonUser
        GBLL    SharedLibrary
        GBLL    DDE

Brazil_Compatible  SETL  {FALSE}
Calling_Standard   SETS  "APCS_U"
ModeMayBeNonUser   SETL  {TRUE}
SharedLibrary      SETL  {TRUE}
DDE                SETL  {TRUE}

        GET     s.h_Regs
        GET     s.h_Brazil
        GET     s.h_modmacro

        Module  kernel

        AREA    |C$$data|, DATA

dataStart
        GET     kernel.s.k_data
dataEnd

        AREA    |Lib$$Init|, READONLY

        &       1
        &       entriesStart
        &       entriesEnd
        &       dataStart
        &       dataEnd

        AREA    |RTSK$$Data|, DATA, READONLY
        ; an empty one, so the symbols below are always defined

        AREA    |K$$Code|, CODE, READONLY
        IMPORT  |RTSK$$Data$$Base|
        IMPORT  |RTSK$$Data$$Limit|

        CV_Code
entriesStart
        GET     kernel.s.k_entries
entriesEnd
CV_Entries SETL {TRUE}
        GET     kernel.s.k_entries

|_kernel_stkovfs_0v|
        MOV     r11, r12
|_kernel_stkovfs_v|
        STMFD   r12!, {r11}             ; implied required frame size (pro tem)
        MOV     r11, r10                ; fp (may not mark as chunk change)
        MOV     r10, r13                ; sl
        MOV     r13, r12                ; sp
        LDMFD   r13!, {ip}              ; recover frame requirement
        STR     r14, [sl, #SC_veneerStkexLink-SC_SLOffset]
        BL      |_kernel_stkovf_split|
        MOV     r12, r13                ; sp
        MOV     r13, r10                ; sl
        MOV     r10, r11                ; fp
        LDR     r14, [r10, #-4]         ; link to stackunextend created by extend code
        ORR     r14, r14, #&40000000    ; set Z in it, to mark veneer
        STR     r14, [r10, #-4]
        LDR     r14, [r13, #SC_prev-SC_SLOffset] ; we've changed stack chunks!
        LDR     r14, [r14, #SC_veneerStkexLink]
        MOVS    pc, r14

|_kernel_NoVeneer|
        ADR     r0, E_NoVeneer
        SWI     GenerateError

        ErrorBlock NoVeneer, "No Veneer", C48

        LNK     kernel.s.k_body