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

# i386\_vm86(2freebsd)

control vm86-related functions

## NAME

**i386\_vm86** – control vm86-related functions

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<sys/types.h\>**

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

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

*int*\

**i386\_vm86**(*int function*, *void \*data*);

## DESCRIPTION

The **i386\_vm86**() system call is used to call various vm86 related functions. The *function* argument can be one of the following values:

- VM86\_INIT

  This will initialize the kernel's vm86 parameter area for the process, and permit the process to make vm86 calls. The *data* argument points to the following structure:

  ```
  struct vm86_init_args {
          int     debug;
          int     cpu_type;
          u_char  int_map[32];
  };
  ```

  The *debug* argument is used to turn on debugging code. The *cpu\_type* argument controls the type of CPU being emulated, and is currently unimplemented. The *int\_map* argument is a bitmap which determines whether vm86 interrupts should be handled in vm86 mode, or reflected back to the process. If the *Nth* bit is set, the interrupt will be reflected to the process, otherwise it will be dispatched by the vm86 interrupt table.

- VM86\_INTCALL

  This allows calls to be made to vm86 interrupt handlers by the process. It effectively simulates an INT instruction. *data* should point to the following structure:

  ```
  struct vm86_intcall_args {
  	int	intnum;
  	struct	vm86frame vmf;
  };
  ```

  *intnum* specifies the operand of INT for the simulated call. A value of 0x10, for example, would often be used to call into the VGA BIOS. *vmf* is used to initialize CPU registers according to the calling convention for the interrupt handler.

- VM86\_GET\_VME

  This is used to retrieve the current state of the Pentium(r) processor's VME (Virtual-8086 Mode Extensions) flag, which is bit 0 of CR4. *data* should be initialized to point to the following:

  ```
  struct vm86_vme_args {
  	int	state;			/* status */
  };
  ```

  *state* will contain the state of the VME flag on return.

vm86 mode is entered by calling [sigreturn(2)](/sigreturn/2.md) with the correct machine context for vm86, and with the PSL\_VM bit set. Control returns to the process upon delivery of a signal.

## RETURN VALUES

The **i386\_vm86()** function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

## ERRORS

The **i386\_vm86**() system call will fail if:

- \[EINVAL\]

  The kernel does not have vm86 support, or an invalid function was specified.

- \[ENOMEM\]

  There is not enough memory to initialize the kernel data structures.

## AUTHORS

This man page was written by Jonathan Lemon, and updated by Bruce M Simpson.
