194 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.TH INT64 3
 | 
						|
.SH NAME
 | 
						|
int64, add64, add64u, add64ul, sub64, sub64u, sub64ul, diff64, cvu64, cvul64, cv64u, cv64ul, div64u, rem64u, mul64u, cmp64, cmp64u, cmp64ul, ex64lo, ex64hi, make64 \- 64 bit disk offset computations
 | 
						|
.SH SYNOPSIS
 | 
						|
.ft B
 | 
						|
.nf
 | 
						|
#include <minix/u64.h>
 | 
						|
 | 
						|
u64_t add64(u64_t \fIi\fP, u64_t \fIj\fP)
 | 
						|
u64_t add64u(u64_t \fIi\fP, unsigned \fIj\fP)
 | 
						|
u64_t add64ul(u64_t \fIi\fP, unsigned long \fIj\fP)
 | 
						|
u64_t sub64(u64_t \fIi\fP, u64_t \fIj\fP)
 | 
						|
u64_t sub64u(u64_t \fIi\fP, unsigned \fIj\fP)
 | 
						|
u64_t sub64ul(u64_t \fIi\fP, unsigned long \fIj\fP)
 | 
						|
unsigned diff64(u64_t \fIi\fP, u64_t \fIj\fP)
 | 
						|
u64_t cvu64(unsigned \fIi\fP)
 | 
						|
u64_t cvul64(unsigned long \fIi\fP)
 | 
						|
unsigned cv64u(u64_t \fIi\fP)
 | 
						|
unsigned long cv64ul(u64_t \fIi\fP)
 | 
						|
unsigned long div64u(u64_t \fIi\fP, unsigned \fIj\fP)
 | 
						|
unsigned rem64u(u64_t \fIi\fP, unsigned \fIj\fP)
 | 
						|
u64_t mul64u(unsigned long \fIi\fP, unsigned \fIj\fP)
 | 
						|
int cmp64(u64_t \fIi\fP, u64_t \fIj\fP)
 | 
						|
int cmp64u(u64_t \fIi\fP, unsigned \fIj\fP)
 | 
						|
int cmp64ul(u64_t \fIi\fP, unsigned long \fIj\fP)
 | 
						|
unsigned long ex64lo(u64_t \fIi\fP)
 | 
						|
unsigned long ex64hi(u64_t \fIi\fP)
 | 
						|
u64_t make64(unsigned long \fIlo\fP, unsigned long \fIhi\fP)
 | 
						|
.fi
 | 
						|
.ft P
 | 
						|
.SH DESCRIPTION
 | 
						|
.de SP
 | 
						|
.if t .sp 0.4
 | 
						|
.if n .sp
 | 
						|
..
 | 
						|
The
 | 
						|
.B int64
 | 
						|
family of functions allow MINIX 3 to handle disks of up to 4 terabytes using
 | 
						|
32 bit sector numbers and 64 bit byte offsets on a machine where the C type
 | 
						|
.B long
 | 
						|
is 32 bits.  The <minix/u64.h> include file defines a 64 bit data
 | 
						|
type,
 | 
						|
.BR u64_t ,
 | 
						|
and a number of functions to operate on them.  Note that these functions are
 | 
						|
geared towards common disk offset and block computations, and do not provide
 | 
						|
a full set of 64 bit operations.  They are:
 | 
						|
.PP
 | 
						|
.TP
 | 
						|
.B "u64_t add64(u64_t \fIi\fP, u64_t \fIj\fP)"
 | 
						|
Add the 64 bit numbers
 | 
						|
.I i
 | 
						|
and
 | 
						|
.I j
 | 
						|
forming a 64 bit result.
 | 
						|
.TP
 | 
						|
.B "u64_t add64u(u64_t \fIi\fP, unsigned \fIj\fP)"
 | 
						|
Add an unsigned
 | 
						|
.I j
 | 
						|
to a 64 bit number
 | 
						|
.I i
 | 
						|
forming a 64 bit result.
 | 
						|
.TP
 | 
						|
.B "u64_t add64ul(u64_t \fIi\fP, unsigned long \fIj\fP)"
 | 
						|
Add an unsigned long
 | 
						|
.I j
 | 
						|
to a 64 bit number
 | 
						|
.I i
 | 
						|
forming a 64 bit result.
 | 
						|
.TP
 | 
						|
.B "u64_t sub64(u64_t \fIi\fP, u64_t \fIj\fP)"
 | 
						|
Subtract the 64 bit number
 | 
						|
.I j
 | 
						|
from the 64 bit number
 | 
						|
.I i
 | 
						|
forming a 64 bit result.
 | 
						|
.TP
 | 
						|
.B "u64_t sub64u(u64_t \fIi\fP, unsigned \fIj\fP)"
 | 
						|
Subtract the unsigned
 | 
						|
.I j
 | 
						|
from the 64 bit number
 | 
						|
.I i
 | 
						|
forming a 64 bit result.
 | 
						|
.TP
 | 
						|
.B "u64_t sub64ul(u64_t \fIi\fP, unsigned long \fIj\fP)"
 | 
						|
Subtract the unsigned long
 | 
						|
.I j
 | 
						|
from the 64 bit number
 | 
						|
.I i
 | 
						|
forming a 64 bit result.
 | 
						|
.TP
 | 
						|
.B "unsigned diff64(u64_t \fIi\fP, u64_t \fIj\fP)"
 | 
						|
Subtract the 64 bit number
 | 
						|
.I j
 | 
						|
from the 64 bit number
 | 
						|
.I i
 | 
						|
forming an unsigned.  Overflow is not checked.
 | 
						|
.TP
 | 
						|
.B "u64_t cvu64(unsigned \fIi\fP)"
 | 
						|
Convert an unsigned to a 64 bit number.
 | 
						|
.TP
 | 
						|
.B "u64_t cvul64(unsigned long \fIi\fP)"
 | 
						|
Convert an unsigned long to a 64 bit number.
 | 
						|
.TP
 | 
						|
.B "unsigned cv64u(u64_t \fIi\fP)"
 | 
						|
Convert a 64 bit number to an unsigned if it fits, otherwise return
 | 
						|
.BR UINT_MAX .
 | 
						|
.TP
 | 
						|
.B "unsigned long cv64ul(u64_t \fIi\fP)"
 | 
						|
Convert a 64 bit number to an unsigned long if it fits, otherwise return
 | 
						|
.BR ULONG_MAX .
 | 
						|
.TP
 | 
						|
.B "unsigned long div64u(u64_t \fIi\fP, unsigned \fIj\fP)"
 | 
						|
Divide the 64 bit number
 | 
						|
.I i
 | 
						|
by the unsigned
 | 
						|
.I j
 | 
						|
giving an unsigned long.  Overflow is not checked.  (Typical "byte offset to
 | 
						|
block number" conversion.)
 | 
						|
.TP
 | 
						|
.B "unsigned rem64u(u64_t \fIi\fP, unsigned \fIj\fP)"
 | 
						|
Compute the remainder of the division of the 64 bit number
 | 
						|
.I i
 | 
						|
by the unsigned
 | 
						|
.I j
 | 
						|
as an unsigned.  (Typical "byte offset within a block" computation.)
 | 
						|
.TP
 | 
						|
.B "u64_t mul64u(unsigned long \fIi\fP, unsigned \fIj\fP)"
 | 
						|
Multiply the unsigned long
 | 
						|
.I i
 | 
						|
by the unsigned
 | 
						|
.I j
 | 
						|
giving a 64 bit number.  (Typical "block number to byte offset" conversion.)
 | 
						|
.TP
 | 
						|
.B "int cmp64(u64_t \fIi\fP, u64_t \fIj\fP)"
 | 
						|
Compare two 64 bit numbers.
 | 
						|
Returns
 | 
						|
.B -1
 | 
						|
if
 | 
						|
.I i
 | 
						|
<
 | 
						|
.IR j ,
 | 
						|
.B 0
 | 
						|
if
 | 
						|
.I i
 | 
						|
==
 | 
						|
.IR j ,
 | 
						|
and
 | 
						|
.B 1
 | 
						|
if
 | 
						|
.I i
 | 
						|
>
 | 
						|
.IR j .
 | 
						|
.TP
 | 
						|
.B "int cmp64u(u64_t \fIi\fP, unsigned \fIj\fP)"
 | 
						|
Likewise compare a 64 bit number with an unsigned.
 | 
						|
.TP
 | 
						|
.B "int cmp64ul(u64_t \fIi\fP, unsigned long \fIj\fP)"
 | 
						|
Likewise compare a 64 bit number with an unsigned long.
 | 
						|
.TP
 | 
						|
.B "unsigned long ex64lo(u64_t \fIi\fP)"
 | 
						|
Extract the low 32 bits of a 64 bit number.
 | 
						|
.TP
 | 
						|
.B "unsigned long ex64hi(u64_t \fIi\fP)"
 | 
						|
Extract the high 32 bits of a 64 bit number.
 | 
						|
.TP
 | 
						|
.B "u64_t make64(unsigned long \fIlo\fP, unsigned long \fIhi\fP)"
 | 
						|
Combine the low and high parts of a 64 bit number to a 64 bit number.  (The
 | 
						|
last three functions are used to pass 64 bit numbers in messages within the
 | 
						|
kernel.  They should not be used for anything else.)
 | 
						|
.SH "SEE ALSO"
 | 
						|
.BR fcntl (2),
 | 
						|
.BR controller (4).
 | 
						|
.SH NOTES
 | 
						|
With the usual disk block size of 512 bytes the maximum disk size is 512
 | 
						|
\(** 4 gigabytes = 2 terabytes.
 | 
						|
.PP
 | 
						|
Standard MINIX 3 only uses 64 bit computations within the disk drivers, so
 | 
						|
individual partitions are still limited to 4 gigabytes.  Minix-vmd has 64
 | 
						|
bit computations also in the file system code.
 | 
						|
.PP
 | 
						|
Special care must be taken when accessing disk devices.  For MINIX 3 one may
 | 
						|
have to temporarily change the start of the partition to go beyond 4 G.
 | 
						|
Minix-vmd can go beyond 4 G, but the
 | 
						|
.B lseek
 | 
						|
system call is still limited to a 32 bit offset.  One needs to use
 | 
						|
.PP
 | 
						|
.RS
 | 
						|
.BI "fcntl(" fd ", F_SEEK, u64_t " offset ")"
 | 
						|
.RE
 | 
						|
.PP
 | 
						|
to seek to a 64 bit position.
 | 
						|
.SH AUTHOR
 | 
						|
Kees J. Bot <kjb@cs.vu.nl>
 |