SLAU132V October   2004  – February 2020

 

  1.   1
    1.     2
    2.     3
    3.     4
    4.     5
    5.     6
  2.   7
    1.     8
    2.     9
    3.     10
    4.     11
    5.     12
  3.   13
    1.     14
    2.     15
    3.     16
      1.      17
      2.      18
      3.      19
      4.      20
      5.      21
      6.      22
      7.      23
      8.      24
      9.      25
      10.      26
      11.      27
      12.      28
    4.     29
      1.      30
      2.      31
    5.     32
      1.      33
      2.      34
        1.       35
      3.      36
      4.      37
      5.      38
      6.      39
      7.      40
      8.      41
      9.      42
      10.      43
    6.     44
    7.     45
      1.      46
      2.      47
    8.     48
    9.     49
    10.     50
    11.     51
      1.      52
      2.      53
    12.     54
      1.      55
    13.     56
    14.     57
  4.   58
    1.     59
    2.     60
    3.     61
      1.      62
    4.     63
      1.      64
      2.      65
    5.     66
    6.     67
      1.      68
      2.      69
    7.     70
      1.      71
        1.       72
        2.       73
        3.       74
        4.       75
        5.       76
        6.       77
        7.       78
        8.       79
      2.      80
      3.      81
      4.      82
    8.     83
      1.      84
        1.       85
        2.       86
      2.      87
        1.       88
        2.       89
        3.       90
    9.     91
    10.     92
    11.     93
      1.      94
      2.      95
    12.     96
    13.     97
      1.      98
      2.      99
      3.      100
      4.      101
      5.      102
      6.      103
      7.      104
      8.      105
      9.      106
      10.      107
      11.      108
      12.      109
      13.      110
  5.   111
    1.     112
      1.      113
      2.      114
      3.      115
    2.     116
      1.      117
      2.      118
    3.     119
      1.      120
        1.       121
          1.        122
        2.       123
        3.       124
      2.      125
      3.      126
      4.      127
      5.      128
      6.      129
      7.      130
      8.      131
      9.      132
        1.       133
  6.   134
    1.     135
      1.      136
    2.     137
    3.     138
    4.     139
    5.     140
    6.     141
      1.      142
    7.     143
    8.     144
      1.      145
      2.      146
      3.      147
        1.       148
        2.       149
      4.      150
        1.       151
    9.     152
    10.     153
    11.     154
    12.     155
      1.      156
      2.      157
      3.      158
      4.      159
      5.      160
      6.      161
        1.       162
        2.       163
        3.       164
        4.       165
      7.      166
      8.      167
        1.       168
        2.       169
        3.       170
      9.      171
      10.      172
      11.      173
      12.      174
      13.      175
      14.      176
      15.      177
      16.      178
      17.      179
      18.      180
      19.      181
      20.      182
      21.      183
      22.      184
      23.      185
      24.      186
      25.      187
      26.      188
      27.      189
      28.      190
      29.      191
      30.      192
        1.       193
        2.       194
        3.       195
      31.      196
      32.      197
    13.     198
    14.     199
    15.     200
    16.     201
      1.      202
      2.      203
      3.      204
    17.     205
      1.      206
      2.      207
      3.      208
      4.      209
      5.      210
    18.     211
  7.   212
    1.     213
      1.      214
      2.      215
      3.      216
      4.      217
      5.      218
      6.      219
    2.     220
      1.      221
        1.       222
        2.       223
        3.       224
        4.       225
      2.      226
    3.     227
    4.     228
      1.      229
      2.      230
      3.      231
    5.     232
    6.     233
      1.      234
      2.      235
        1.       236
        2.       237
      3.      238
        1.       239
          1.        240
          2.        241
        2.       242
          1.        243
          2.        244
      4.      245
      5.      246
    7.     247
      1.      248
      2.      249
      3.      250
      4.      251
      5.      252
    8.     253
      1.      254
      2.      255
      3.      256
      4.      257
        1.       258
          1.        259
        2.       260
          1.        261
    9.     262
      1.      263
      2.      264
      3.      265
        1.       266
        2.       267
        3.       268
        4.       269
          1.        270
          2.        271
          3.        272
          4.        273
        5.       274
        6.       275
      4.      276
        1.       277
        2.       278
    10.     279
  8.   280
    1.     281
      1.      282
      2.      283
      3.      284
      4.      285
      5.      286
      6.      287
      7.      288
      8.      289
    2.     290
      1.      291
        1.       292
      2.      293
      3.      294
      4.      295
        1.       296
      5.      297
        1.       298
    3.     299
    4.     300
      1.      301
      2.      302
        1.       303
        2.       304
          1.        305
          2.        306
          3.        307
          4.        308
      3.      309
        1.       310
        2.       311
  9.   312
    1.     313
    2.     314
      1.      315
      2.      316
      3.      317
  10.   318
    1.     319
  11.   320
    1.     321

Device-Driver Level I/O Functions

At the next level are the device-level drivers. They map directly to the low-level I/O functions. The default device driver is the HOST device driver, which uses the debugger to perform file operations. The HOST device driver is automatically used for the default C streams stdin, stdout, and stderr.

The HOST device driver shares a special protocol with the debugger running on a host system so that the host can perform the C I/O requested by the program. Instructions for C I/O operations that the program wants to perform are encoded in a special buffer named _CIOBUF_ in the .cio section. The debugger halts the program at a special breakpoint (C$$IO$$), reads and decodes the target memory, and performs the requested operation. The result is encoded into _CIOBUF_, the program is resumed, and the target decodes the result.

The HOST device is implemented with seven functions, HOSTopen, HOSTclose, HOSTread, HOSTwrite, HOSTlseek, HOSTunlink, and HOSTrename, which perform the encoding. Each function is called from the low-level I/O function with a similar name.

A device driver is composed of seven required functions. Not all function need to be meaningful for all devices, but all seven must be defined. Here we show the names of all seven functions as starting with DEV, but you may choose any name except for HOST.

DEV_open
Open File for I/O
Syntax

int DEV_open (const char *path, unsigned flags, intllv_fd);

Description

This function finds a file matching path and opens it for I/O as requested by flags.

  • The path is the filename of the file to be opened. If the name of a file passed to open has a device prefix, the device prefix will be stripped by open, so DEV_open will not see it. (See Section 7.2.5 for details on the device prefix.)
  • The flags are attributes that specify how the file is manipulated. The flags are specified using the following symbols:
  • O_RDONLY (0x0000) /* open for reading */ O_WRONLY (0x0001) /* open for writing */ O_RDWR (0x0002) /* open for read & write */ O_APPEND (0x0008) /* append on each write */ O_CREAT (0x0200) /* open with file create */ O_TRUNC (0x0400) /* open with truncation */ O_BINARY (0x8000) /* open in binary mode */

    See POSIX for further explanation of the flags.

  • The llv_fd is treated as a suggested low-level file descriptor. This is a historical artifact; newly-defined device drivers should ignore this argument. This differs from the low-level I/O open function.

This function must arrange for information to be saved for each file descriptor, typically including a file position indicator and any significant flags. For the HOST version, all the bookkeeping is handled by the debugger running on the host machine. If the device uses an internal buffer, the buffer can be created when a file is opened, or the buffer can be created during a read or write.

Return Value

This function must return -1 to indicate an error if for some reason the file could not be opened; such as the file does not exist, could not be created, or there are too many files open. The value of errno may optionally be set to indicate the exact error (the HOST device does not set errno). Some devices might have special failure conditions; for instance, if a device is read-only, a file cannot be opened O_WRONLY.

On success, this function must return a non-negative file descriptor unique among all open files handled by the specific device. The file descriptor need not be unique across devices. The device file descriptor is used only by low-level functions when calling the device-driver-level functions. The low-level function open allocates its own unique file descriptor for the high-level functions to call the low-level functions. Code that uses only high-level I/O functions need not be aware of these file descriptors.

DEV_close
Close File for I/O
Syntax

int DEV_close (int dev_fd);

Description

This function closes a valid open file descriptor.

On some devices, DEV_close may need to be responsible for checking if this is the last file descriptor pointing to a file that was unlinked. If so, it is responsible for ensuring that the file is actually removed from the device and the resources reclaimed, if appropriate.

Return Value

This function should return -1 to indicate an error if the file descriptor is invalid in some way, such as being out of range or already closed, but this is not required. The user should not call close() with an invalid file descriptor.

DEV_read
Read Characters from a File
Syntax

int DEV_read (intdev_fd, char *buf, unsignedcount);

Description

The read function reads count bytes from the input file associated with dev_fd.

  • The dev_fd is the number assigned by open to an opened file.
  • The buf is where the read characters are placed.
  • The count is the number of characters to read from the file.
Return Value

This function must return -1 to indicate an error if for some reason no bytes could be read from the file. This could be because of an attempt to read from a O_WRONLY file, or for device-specific reasons.

If count is 0, no bytes are read and this function returns 0.

This function returns the number of bytes read, from 0 to count. 0 indicates that EOF was reached before any bytes were read. It is not an error to read less than count bytes; this is common if the are not enough bytes left in the file or the request was larger than an internal device buffer size.

DEV_write
Write Characters to a File
Syntax

int DEV_write (intdev_fd, const char *buf, unsignedcount);

Description

This function writes count bytes to the output file.

  • The dev_fd is the number assigned by open to an opened file.
  • The buffer is where the write characters are placed.
  • The count is the number of characters to write to the file.
Return Value

This function must return -1 to indicate an error if for some reason no bytes could be written to the file. This could be because of an attempt to read from a O_RDONLY file, or for device-specific reasons.

DEV_lseek
Set File Position Indicator
Syntax

off_t DEV_lseek (intdev_fd, off_toffset, intorigin);

Description

This function sets the file's position indicator for this file descriptor as lseek.

If lseek is supported, it should not allow a seek to before the beginning of the file, but it should support seeking past the end of the file. Such seeks do not change the size of the file, but if it is followed by a write, the file size will increase.

Return Value

If successful, this function returns the new value of the file position indicator.

This function must return -1 to indicate an error if for some reason no bytes could be written to the file. For many devices, the lseek operation is nonsensical (e.g. a computer monitor).

Delete File
Syntax

int DEV_unlink (const char *path);

Description

Remove the association of the pathname with the file. This means that the file may no longer be opened using this name, but the file may not actually be immediately removed.

Depending on the device, the file may be immediately removed, but for a device which allows open file descriptors to point to unlinked files, the file will not actually be deleted until the last file descriptor is closed. See Section 7.2.3.

Return Value

This function must return -1 to indicate an error if for some reason the file could not be unlinked (delayed removal does not count as a failure to unlink.)

If successful, this function returns 0.

DEV_rename
Rename File
Syntax

int DEV_rename (const char *old_name, const char *new_name);

Description

This function changes the name associated with the file.

  • The old_name is the current name of the file.
  • The new_name is the new name for the file.
Return Value

This function must return -1 to indicate an error if for some reason the file could not be renamed, such as the file doesn't exist, or the new name already exists.

NOTE

It is inadvisable to allow renaming a file so that it is on a different device. In general this would require a whole file copy, which may be more expensive than you expect.

If successful, this function returns 0.