---
name: "i386_set_ldt"
section: "2freebsd"
platform: "linux"
package: "freebsd-manpages"
version: "12.2-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/i386_get_ldt/2freebsd"
---

# i386\_set\_ldt(2freebsd)

manage i386 per-process Local Descriptor Table entries

Part of [i386\_get\_ldt(2freebsd)](/i386_get_ldt/2freebsd.md).

## NAME

**i386\_get\_ldt**, **i386\_set\_ldt** – manage i386 per-process Local Descriptor Table entries

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<machine/segments.h\>**

**#include \<machine/sysarch.h\>**

*int*\

**i386\_get\_ldt**(*int start\_sel*, *union descriptor \*descs*, *int num\_sels*);

*int*\

**i386\_set\_ldt**(*int start\_sel*, *union descriptor \*descs*, *int num\_sels*);

## DESCRIPTION

The **i386\_get\_ldt**() system call returns a list of the i386 descriptors in the current process' LDT. The **i386\_set\_ldt**() system call sets a list of i386 descriptors in the current process' LDT. For both routines, *start\_sel* specifies the index of the selector in the LDT at which to begin and *descs* points to an array of *num\_sels* descriptors to be set or returned.

Each entry in the *descs* array can be either a segment\_descriptor or gate\_descriptor and are defined in ⟨i386/segments.h⟩. These structures are defined by the architecture as disjoint bit-fields, so care must be taken in constructing them.

If *start\_sel* is *LDT\_AUTO\_ALLOC*, *num\_sels* is 1 and the descriptor pointed to by *descs* is legal, then **i386\_set\_ldt**() will allocate a descriptor and return its selector number.

If *num\_descs* is 1, *start\_sels* is valid, and *descs* is NULL, then **i386\_set\_ldt**() will free that descriptor (making it available to be reallocated again later).

If *num\_descs* is 0, *start\_sels* is 0 and *descs* is NULL then, as a special case, **i386\_set\_ldt**() will free all descriptors.

## RETURN VALUES

Upon successful completion, **i386\_get\_ldt**() returns the number of descriptors currently in the LDT. The **i386\_set\_ldt**() system call returns the first selector set on success. If the kernel allocated a descriptor in the LDT, the allocated index is returned. Otherwise, a value of -1 is returned and the global variable *errno* is set to indicate the error.

## ERRORS

The **i386\_get\_ldt**() and **i386\_set\_ldt**() system calls will fail if:

- \[EINVAL\]

  An inappropriate value was used for *start\_sel* or *num\_sels*.

- \[EACCES\]

  The caller attempted to use a descriptor that would circumvent protection or cause a failure.

## SEE ALSO

i386 Microprocessor Programmer's Reference Manual, Intel

## WARNING

You can really hose your process using this.
