/* vmswap.c 2.4 2/14/80 */
register struct text
*xp
;
p
->p_szpt
= clrnd(ctopt(p
->p_ssize
+ p
->p_dsize
+ p
->p_tsize
));
if (vgetpt(p
, memall
) == 0)
if (vgetu(p
, memall
, Swapmap
, &swaputl
, (struct user
*)0) == 0) {
swdspt(p
, &swaputl
, B_READ
);
rate
.v_pgin
+= p
->p_aveflt
;
int xswapwant
, xswaplock
;
* ds and ss are the old data size and the stack size
* of the process, and are supplied during page table
register struct pte
*map
;
register struct user
*utl
;
if ((xswaplock
& 2) == 0) {
sleep((caddr_t
)map
, PSWP
);
if (swpexpand(p
->p_dsize
, p
->p_ssize
, &utl
->u_dmap
, &utl
->u_smap
) == 0
|| vgetswu(p
, utl
) == 0) {
if (p
->p_textp
->x_ccount
== 1)
p
->p_textp
->x_swrss
= p
->p_textp
->x_rssize
;
p
->p_swrss
= p
->p_rssize
;
vsswap(p
, dptopte(p
, 0), MDATA
, 0, ds
, &utl
->u_dmap
);
vsswap(p
, sptopte(p
, CLSIZE
-1), MSTACK
, 0, ss
, &utl
->u_smap
);
rate
.v_pgin
-= p
->p_aveflt
;
wakeup((caddr_t
)&runout
);
* Swap the data and stack page tables in or out.
* Only hard thing is swapping out when new pt size is different than old.
* If we are growing new pt pages, then we must spread pages with 2 swaps.
* If we are shrinking pt pages, then we must merge stack pte's into last
* data page so as not to lose them (and also do two swaps).
register struct user
*utl
;
register int szpt
, tsz
, ssz
;
register struct pte
*pte
;
szpt
= clrnd(ctopt(p
->p_tsize
+ p
->p_dsize
+ p
->p_ssize
));
tsz
= p
->p_tsize
/ NPTEPG
;
swpt(p
, 0, tsz
, p
->p_szpt
- tsz
, rdwri
);
ssz
= ctopt(utl
->u_ossize
);
if (szpt
< p
->p_szpt
&& utl
->u_odsize
&& utl
->u_ossize
) {
* Page tables shrinking... see if last text+data and
* last stack page must be merged... if so, copy
* stack pte's from last stack page to end of last
* data page, and decrease size of stack pt to be swapped.
tdlast
= (p
->p_tsize
+ utl
->u_odsize
) % (NPTEPG
* CLSIZE
);
slast
= utl
->u_ossize
% (NPTEPG
* CLSIZE
);
if (tdlast
&& slast
&& tdlast
+ slast
<= (NPTEPG
* CLSIZE
)) {
tdsz
= clrnd(ctopt(p
->p_tsize
+ utl
->u_odsize
));
bcopy((caddr_t
)sptopte(p
, utl
->u_ossize
- 1),
(caddr_t
)&p
->p_p0br
[tdsz
* NPTEPG
- slast
],
(unsigned)(slast
* sizeof (struct pte
)));
swpt(p
, szpt
- ssz
- tsz
, p
->p_szpt
- ssz
, ssz
, rdwri
);
swpt(p
, 0, tsz
, clrnd(ctopt(p
->p_tsize
+ utl
->u_odsize
)) - tsz
, rdwri
);
for (i
= 0; i
< utl
->u_odsize
; i
++) {
if (pte
->pg_v
|| pte
->pg_fod
== 0 && (pte
->pg_pfnum
||pte
->pg_m
))
for (i
= 0; i
< utl
->u_ossize
; i
++) {
if (pte
->pg_v
|| pte
->pg_fod
== 0 && (pte
->pg_pfnum
||pte
->pg_m
))
swpt(p
, doff
, a
, n
, rdwri
)
swap(p
, p
->p_swaddr
+ ctod(UPAGES
) + doff
,
(caddr_t
)&p
->p_p0br
[a
* NPTEPG
], n
* NBPG
, rdwri
, B_PAGET
, swapdev
);