Software APIs
sw
device
lib
base
internal
absl_status.h
1
// Copyright lowRISC contributors (OpenTitan project).
2
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#ifndef OPENTITAN_SW_DEVICE_LIB_BASE_INTERNAL_ABSL_STATUS_H_
6
#define OPENTITAN_SW_DEVICE_LIB_BASE_INTERNAL_ABSL_STATUS_H_
7
8
#ifndef USING_ABSL_STATUS
9
#error \
10
"Do not include absl_status.h directly or use its status codes.\nInclude error.h and use rom_error_t."
11
#endif
12
// Note: the status definitions were taken directly from the abseil-cpp
13
// library, and in particular from the file:
14
// https://github.com/abseil/abseil-cpp/blob/master/absl/status/status.h
15
// The copyright is preserved below:
16
// -----------------------------------------------------------------------------
17
// Copyright 2019 The Abseil Authors.
18
//
19
// Licensed under the Apache License, Version 2.0 (the "License");
20
// you may not use this file except in compliance with the License.
21
// You may obtain a copy of the License at
22
//
23
// https://www.apache.org/licenses/LICENSE-2.0
24
//
25
// Unless required by applicable law or agreed to in writing, software
26
// distributed under the License is distributed on an "AS IS" BASIS,
27
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28
// See the License for the specific language governing permissions and
29
// limitations under the License.
30
// -----------------------------------------------------------------------------
31
32
#ifdef __cplusplus
33
extern
"C"
{
34
#endif
35
36
/**
37
* This enum was taken directly from the abseil-cpp library:
38
* https://github.com/abseil/abseil-cpp/blob/master/absl/status/status.h
39
*
40
* These error codes serve as general error classifications which are used to
41
* build up more specific error codes.
42
*
43
* DO NOT USE THESE CODES DIRECTLY. Use these codes to build per-module error
44
* codes in error.h. Although these error codes are generally used at
45
* Google by RPC servers, the advice about how to use them and how to
46
* categorize errors is generally sound.
47
*/
48
typedef
enum
absl_status_code {
49
// StatusCode::kOk
50
//
51
// kOK (gRPC code "OK") does not indicate an error; this value is returned on
52
// success. It is typical to check for this value before proceeding on any
53
// given call across an API or RPC boundary. To check this value, use the
54
// `absl::Status::ok()` member function rather than inspecting the raw code.
55
kOk = 0,
56
57
// StatusCode::kCancelled
58
//
59
// kCancelled (gRPC code "CANCELLED") indicates the operation was cancelled,
60
// typically by the caller.
61
kCancelled = 1,
62
63
// StatusCode::kUnknown
64
//
65
// kUnknown (gRPC code "UNKNOWN") indicates an unknown error occurred. In
66
// general, more specific errors should be raised, if possible. Errors raised
67
// by APIs that do not return enough error information may be converted to
68
// this error.
69
kUnknown = 2,
70
71
// StatusCode::kInvalidArgument
72
//
73
// kInvalidArgument (gRPC code "INVALID_ARGUMENT") indicates the caller
74
// specified an invalid argument, such a malformed filename. Note that such
75
// errors should be narrowly limited to indicate to the invalid nature of the
76
// arguments themselves. Errors with validly formed arguments that may cause
77
// errors with the state of the receiving system should be denoted with
78
// `kFailedPrecondition` instead.
79
kInvalidArgument = 3,
80
81
// StatusCode::kDeadlineExceeded
82
//
83
// kDeadlineExceeded (gRPC code "DEADLINE_EXCEEDED") indicates a deadline
84
// expired before the operation could complete. For operations that may change
85
// state within a system, this error may be returned even if the operation has
86
// completed successfully. For example, a successful response from a server
87
// could have been delayed long enough for the deadline to expire.
88
kDeadlineExceeded = 4,
89
90
// StatusCode::kNotFound
91
//
92
// kNotFound (gRPC code "NOT_FOUND") indicates some requested entity (such as
93
// a file or directory) was not found.
94
//
95
// `kNotFound` is useful if a request should be denied for an entire class of
96
// users, such as during a gradual feature rollout or undocumented allow list.
97
// If, instead, a request should be denied for specific sets of users, such as
98
// through user-based access control, use `kPermissionDenied` instead.
99
kNotFound = 5,
100
101
// StatusCode::kAlreadyExists
102
//
103
// kAlreadyExists (gRPC code "ALREADY_EXISTS") indicates the entity that a
104
// caller attempted to create (such as file or directory) is already present.
105
kAlreadyExists = 6,
106
107
// StatusCode::kPermissionDenied
108
//
109
// kPermissionDenied (gRPC code "PERMISSION_DENIED") indicates that the caller
110
// does not have permission to execute the specified operation. Note that this
111
// error is different than an error due to an *un*authenticated user. This
112
// error code does not imply the request is valid or the requested entity
113
// exists or satisfies any other pre-conditions.
114
//
115
// `kPermissionDenied` must not be used for rejections caused by exhausting
116
// some resource. Instead, use `kResourceExhausted` for those errors.
117
// `kPermissionDenied` must not be used if the caller cannot be identified.
118
// Instead, use `kUnauthenticated` for those errors.
119
kPermissionDenied = 7,
120
121
// StatusCode::kResourceExhausted
122
//
123
// kResourceExhausted (gRPC code "RESOURCE_EXHAUSTED") indicates some resource
124
// has been exhausted, perhaps a per-user quota, or perhaps the entire file
125
// system is out of space.
126
kResourceExhausted = 8,
127
128
// StatusCode::kFailedPrecondition
129
//
130
// kFailedPrecondition (gRPC code "FAILED_PRECONDITION") indicates that the
131
// operation was rejected because the system is not in a state required for
132
// the operation's execution. For example, a directory to be deleted may be
133
// non-empty, an "rmdir" operation is applied to a non-directory, etc.
134
//
135
// Some guidelines that may help a service implementer in deciding between
136
// `kFailedPrecondition`, `kAborted`, and `kUnavailable`:
137
//
138
// (a) Use `kUnavailable` if the client can retry just the failing call.
139
// (b) Use `kAborted` if the client should retry at a higher transaction
140
// level (such as when a client-specified test-and-set fails, indicating
141
// the client should restart a read-modify-write sequence).
142
// (c) Use `kFailedPrecondition` if the client should not retry until
143
// the system state has been explicitly fixed. For example, if an "rmdir"
144
// fails because the directory is non-empty, `kFailedPrecondition`
145
// should be returned since the client should not retry unless
146
// the files are deleted from the directory.
147
kFailedPrecondition = 9,
148
149
// StatusCode::kAborted
150
//
151
// kAborted (gRPC code "ABORTED") indicates the operation was aborted,
152
// typically due to a concurrency issue such as a sequencer check failure or a
153
// failed transaction.
154
//
155
// See the guidelines above for deciding between `kFailedPrecondition`,
156
// `kAborted`, and `kUnavailable`.
157
kAborted = 10,
158
159
// StatusCode::kOutOfRange
160
//
161
// kOutOfRange (gRPC code "OUT_OF_RANGE") indicates the operation was
162
// attempted past the valid range, such as seeking or reading past an
163
// end-of-file.
164
//
165
// Unlike `kInvalidArgument`, this error indicates a problem that may
166
// be fixed if the system state changes. For example, a 32-bit file
167
// system will generate `kInvalidArgument` if asked to read at an
168
// offset that is not in the range [0,2^32-1], but it will generate
169
// `kOutOfRange` if asked to read from an offset past the current
170
// file size.
171
//
172
// There is a fair bit of overlap between `kFailedPrecondition` and
173
// `kOutOfRange`. We recommend using `kOutOfRange` (the more specific
174
// error) when it applies so that callers who are iterating through
175
// a space can easily look for an `kOutOfRange` error to detect when
176
// they are done.
177
kOutOfRange = 11,
178
179
// StatusCode::kUnimplemented
180
//
181
// kUnimplemented (gRPC code "UNIMPLEMENTED") indicates the operation is not
182
// implemented or supported in this service. In this case, the operation
183
// should not be re-attempted.
184
kUnimplemented = 12,
185
186
// StatusCode::kInternal
187
//
188
// kInternal (gRPC code "INTERNAL") indicates an internal error has occurred
189
// and some invariants expected by the underlying system have not been
190
// satisfied. This error code is reserved for serious errors.
191
kInternal = 13,
192
193
// StatusCode::kUnavailable
194
//
195
// kUnavailable (gRPC code "UNAVAILABLE") indicates the service is currently
196
// unavailable and that this is most likely a transient condition. An error
197
// such as this can be corrected by retrying with a backoff scheme. Note that
198
// it is not always safe to retry non-idempotent operations.
199
//
200
// See the guidelines above for deciding between `kFailedPrecondition`,
201
// `kAborted`, and `kUnavailable`.
202
kUnavailable = 14,
203
204
// StatusCode::kDataLoss
205
//
206
// kDataLoss (gRPC code "DATA_LOSS") indicates that unrecoverable data loss or
207
// corruption has occurred. As this error is serious, proper alerting should
208
// be attached to errors such as this.
209
kDataLoss = 15,
210
211
// StatusCode::kUnauthenticated
212
//
213
// kUnauthenticated (gRPC code "UNAUTHENTICATED") indicates that the request
214
// does not have valid authentication credentials for the operation. Correct
215
// the authentication and try again.
216
kUnauthenticated = 16,
217
218
// StatusCode::DoNotUseReservedForFutureExpansionUseDefaultInSwitchInstead_
219
//
220
// NOTE: this error code entry should not be used and you should not rely on
221
// its value, which may change.
222
//
223
// The purpose of this enumerated value is to force people who handle status
224
// codes with `switch()` statements to *not* simply enumerate all possible
225
// values, but instead provide a "default:" case. Providing such a default
226
// case ensures that code will compile when new codes are added.
227
kDoNotUseReservedForFutureExpansionUseDefaultInSwitchInstead_ = 20
228
} absl_status_t;
229
230
#ifdef __cplusplus
231
}
232
#endif
233
234
#endif
// OPENTITAN_SW_DEVICE_LIB_BASE_INTERNAL_ABSL_STATUS_H_
Return to
OpenTitan Documentation