1237
1312
else if (!strcmp(a->name, "power-on-hours") ||
1238
1313
!strcmp(a->name, "loaded-hours") ||
1239
1314
!strcmp(a->name, "head-flying-hours"))
1240
a->pretty_value = fourtyeight * 60 * 60 * 1000;
1241
else if (!strcmp(a->name, "reallocated-sector-count"))
1315
a->pretty_value = (fourtyeight & 0xFFFFFFFFU) * 60 * 60 * 1000;
1316
else if (!strcmp(a->name, "reallocated-sector-count") ||
1317
!strcmp(a->name, "current-pending-sector"))
1242
1318
a->pretty_value = fourtyeight & 0xFFFFFFFFU;
1244
1320
a->pretty_value = fourtyeight;
1323
typedef void (*SkSmartAttributeVerify)(SkDisk *d, SkSmartAttributeParsedData *a);
1247
1325
typedef struct SkSmartAttributeInfo {
1248
1326
const char *name;
1249
1327
SkSmartAttributeUnit unit;
1328
SkSmartAttributeVerify verify;
1250
1329
} SkSmartAttributeInfo;
1331
static void verify_temperature(SkDisk *d, SkSmartAttributeParsedData *a) {
1333
assert(a->pretty_unit == SK_SMART_ATTRIBUTE_UNIT_MKELVIN);
1335
if (a->pretty_value < SK_MKELVIN_VALID_MIN ||
1336
a->pretty_value > SK_MKELVIN_VALID_MAX) {
1337
a->pretty_unit = SK_SMART_ATTRIBUTE_UNIT_UNKNOWN;
1338
d->attribute_verification_bad = TRUE;
1342
static void verify_short_time(SkDisk *d, SkSmartAttributeParsedData *a) {
1344
assert(a->pretty_unit == SK_SMART_ATTRIBUTE_UNIT_MSECONDS);
1346
if (a->pretty_value < SK_MSECOND_VALID_MIN ||
1347
a->pretty_value > SK_MSECOND_VALID_SHORT_MAX) {
1348
a->pretty_unit = SK_SMART_ATTRIBUTE_UNIT_UNKNOWN;
1349
d->attribute_verification_bad = TRUE;
1353
static void verify_long_time(SkDisk *d, SkSmartAttributeParsedData *a) {
1355
assert(a->pretty_unit == SK_SMART_ATTRIBUTE_UNIT_MSECONDS);
1357
if (a->pretty_value < SK_MSECOND_VALID_MIN ||
1358
a->pretty_value > SK_MSECOND_VALID_LONG_MAX) {
1359
a->pretty_unit = SK_SMART_ATTRIBUTE_UNIT_UNKNOWN;
1360
d->attribute_verification_bad = TRUE;
1364
static void verify_sectors(SkDisk *d, SkSmartAttributeParsedData *a) {
1365
uint64_t max_sectors;
1369
assert(a->pretty_unit == SK_SMART_ATTRIBUTE_UNIT_SECTORS);
1371
max_sectors = d->size / 512ULL;
1373
if (max_sectors > 0 && a->pretty_value > max_sectors) {
1374
a->pretty_value = SK_SMART_ATTRIBUTE_UNIT_UNKNOWN;
1375
d->attribute_verification_bad = TRUE;
1377
if ((!strcmp(a->name, "reallocated-sector-count") ||
1378
!strcmp(a->name, "current-pending-sector")) &&
1379
a->pretty_value > 0)
1252
1384
/* This data is stolen from smartmontools */
1254
1386
/* %STRINGPOOLSTART% */
1255
1387
static const SkSmartAttributeInfo const attribute_info[256] = {
1256
[1] = { ((const char*) 1446), SK_SMART_ATTRIBUTE_UNIT_NONE },
1257
[2] = { ((const char*) 1466), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1258
[3] = { ((const char*) 1489), SK_SMART_ATTRIBUTE_UNIT_MSECONDS },
1259
[4] = { ((const char*) 1502), SK_SMART_ATTRIBUTE_UNIT_NONE },
1260
[5] = { ((const char*) 1519), SK_SMART_ATTRIBUTE_UNIT_SECTORS },
1261
[6] = { ((const char*) 1544), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1262
[7] = { ((const char*) 1564), SK_SMART_ATTRIBUTE_UNIT_NONE },
1263
[8] = { ((const char*) 1580), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1264
[9] = { ((const char*) 1602), SK_SMART_ATTRIBUTE_UNIT_MSECONDS },
1265
[10] = { ((const char*) 1617), SK_SMART_ATTRIBUTE_UNIT_NONE },
1266
[11] = { ((const char*) 1634), SK_SMART_ATTRIBUTE_UNIT_NONE },
1267
[12] = { ((const char*) 1658), SK_SMART_ATTRIBUTE_UNIT_NONE },
1268
[13] = { ((const char*) 1676), SK_SMART_ATTRIBUTE_UNIT_NONE },
1269
[187] = { ((const char*) 1697), SK_SMART_ATTRIBUTE_UNIT_SECTORS },
1270
[189] = { ((const char*) 1716), SK_SMART_ATTRIBUTE_UNIT_NONE },
1271
[190] = { ((const char*) 1732), SK_SMART_ATTRIBUTE_UNIT_MKELVIN },
1272
[191] = { ((const char*) 1760), SK_SMART_ATTRIBUTE_UNIT_NONE },
1273
[192] = { ((const char*) 1779), SK_SMART_ATTRIBUTE_UNIT_NONE },
1274
[193] = { ((const char*) 1803), SK_SMART_ATTRIBUTE_UNIT_NONE },
1275
[194] = { ((const char*) 1820), SK_SMART_ATTRIBUTE_UNIT_MKELVIN },
1276
[195] = { ((const char*) 1842), SK_SMART_ATTRIBUTE_UNIT_NONE },
1277
[196] = { ((const char*) 1865), SK_SMART_ATTRIBUTE_UNIT_NONE },
1278
[197] = { ((const char*) 1889), SK_SMART_ATTRIBUTE_UNIT_SECTORS },
1279
[198] = { ((const char*) 1912), SK_SMART_ATTRIBUTE_UNIT_SECTORS },
1280
[199] = { ((const char*) 1934), SK_SMART_ATTRIBUTE_UNIT_NONE },
1281
[200] = { ((const char*) 1955), SK_SMART_ATTRIBUTE_UNIT_NONE },
1282
[201] = { ((const char*) 1977), SK_SMART_ATTRIBUTE_UNIT_NONE },
1283
[202] = { ((const char*) 1998), SK_SMART_ATTRIBUTE_UNIT_NONE },
1284
[203] = { ((const char*) 2016), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1285
[204] = { ((const char*) 2031), SK_SMART_ATTRIBUTE_UNIT_NONE },
1286
[205] = { ((const char*) 2054), SK_SMART_ATTRIBUTE_UNIT_NONE },
1287
[206] = { ((const char*) 2076), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1288
[207] = { ((const char*) 2090), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1289
[208] = { ((const char*) 2108), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN},
1290
[209] = { ((const char*) 2118), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1291
[220] = { ((const char*) 2143), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1292
[221] = { ((const char*) 2154), SK_SMART_ATTRIBUTE_UNIT_NONE },
1293
[222] = { ((const char*) 2175), SK_SMART_ATTRIBUTE_UNIT_MSECONDS },
1294
[223] = { ((const char*) 2188), SK_SMART_ATTRIBUTE_UNIT_NONE },
1295
[224] = { ((const char*) 2205), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1296
[225] = { ((const char*) 2219), SK_SMART_ATTRIBUTE_UNIT_NONE },
1297
[226] = { ((const char*) 2238), SK_SMART_ATTRIBUTE_UNIT_MSECONDS },
1298
[227] = { ((const char*) 2251), SK_SMART_ATTRIBUTE_UNIT_NONE },
1299
[228] = { ((const char*) 2266), SK_SMART_ATTRIBUTE_UNIT_NONE },
1300
[230] = { ((const char*) 2292), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN },
1301
[231] = { ((const char*) 1740), SK_SMART_ATTRIBUTE_UNIT_MKELVIN },
1302
[240] = { ((const char*) 2307), SK_SMART_ATTRIBUTE_UNIT_MSECONDS },
1303
[250] = { ((const char*) 2325), SK_SMART_ATTRIBUTE_UNIT_NONE }
1388
[1] = { ((const char*) 1501), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1389
[2] = { ((const char*) 1521), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1390
[3] = { ((const char*) 1544), SK_SMART_ATTRIBUTE_UNIT_MSECONDS, verify_short_time },
1391
[4] = { ((const char*) 1557), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1392
[5] = { ((const char*) 1574), SK_SMART_ATTRIBUTE_UNIT_SECTORS, verify_sectors },
1393
[6] = { ((const char*) 1599), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1394
[7] = { ((const char*) 1619), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1395
[8] = { ((const char*) 1635), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1396
[9] = { ((const char*) 1657), SK_SMART_ATTRIBUTE_UNIT_MSECONDS, verify_long_time },
1397
[10] = { ((const char*) 1672), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1398
[11] = { ((const char*) 1689), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1399
[12] = { ((const char*) 1713), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1400
[13] = { ((const char*) 1731), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1401
[187] = { ((const char*) 1752), SK_SMART_ATTRIBUTE_UNIT_SECTORS, verify_sectors },
1402
[189] = { ((const char*) 1771), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1403
[190] = { ((const char*) 1787), SK_SMART_ATTRIBUTE_UNIT_MKELVIN, verify_temperature },
1404
[191] = { ((const char*) 1815), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1405
[192] = { ((const char*) 1834), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1406
[193] = { ((const char*) 1858), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1407
[194] = { ((const char*) 1875), SK_SMART_ATTRIBUTE_UNIT_MKELVIN, verify_temperature },
1408
[195] = { ((const char*) 1897), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1409
[196] = { ((const char*) 1920), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1410
[197] = { ((const char*) 1944), SK_SMART_ATTRIBUTE_UNIT_SECTORS, verify_sectors },
1411
[198] = { ((const char*) 1967), SK_SMART_ATTRIBUTE_UNIT_SECTORS, verify_sectors },
1412
[199] = { ((const char*) 1989), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1413
[200] = { ((const char*) 2010), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1414
[201] = { ((const char*) 2032), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1415
[202] = { ((const char*) 2053), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1416
[203] = { ((const char*) 2071), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1417
[204] = { ((const char*) 2086), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1418
[205] = { ((const char*) 2109), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1419
[206] = { ((const char*) 2131), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1420
[207] = { ((const char*) 2145), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1421
[208] = { ((const char*) 2163), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1422
[209] = { ((const char*) 2173), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1423
[220] = { ((const char*) 2198), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1424
[221] = { ((const char*) 2209), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1425
[222] = { ((const char*) 2230), SK_SMART_ATTRIBUTE_UNIT_MSECONDS, verify_long_time },
1426
[223] = { ((const char*) 2243), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1427
[224] = { ((const char*) 2260), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1428
[225] = { ((const char*) 2274), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1429
[226] = { ((const char*) 2293), SK_SMART_ATTRIBUTE_UNIT_MSECONDS, verify_short_time },
1430
[227] = { ((const char*) 2306), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1431
[228] = { ((const char*) 2321), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL },
1432
[230] = { ((const char*) 2347), SK_SMART_ATTRIBUTE_UNIT_UNKNOWN, NULL },
1433
[231] = { ((const char*) 1795), SK_SMART_ATTRIBUTE_UNIT_MKELVIN, verify_temperature },
1434
[240] = { ((const char*) 2362), SK_SMART_ATTRIBUTE_UNIT_MSECONDS, verify_long_time },
1435
[250] = { ((const char*) 2380), SK_SMART_ATTRIBUTE_UNIT_NONE, NULL }
1305
1437
/* %STRINGPOOLSTOP% */
1307
1439
typedef enum SkSmartQuirk {
1308
SK_SMART_QUIRK_9_POWERONMINUTES = 1,
1309
SK_SMART_QUIRK_9_POWERONSECONDS = 2,
1310
SK_SMART_QUIRK_9_POWERONHALFMINUTES = 4,
1311
SK_SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT = 8,
1312
SK_SMART_QUIRK_193_LOADUNLOAD = 16,
1313
SK_SMART_QUIRK_194_10XCELSIUS = 32,
1314
SK_SMART_QUIRK_194_UNKNOWN = 64,
1315
SK_SMART_QUIRK_200_WRITEERRORCOUNT = 128,
1316
SK_SMART_QUIRK_201_DETECTEDTACOUNT = 256,
1317
SK_SMART_QUIRK_9_UNKNOWN = 512
1440
SK_SMART_QUIRK_9_POWERONMINUTES = 0x0001,
1441
SK_SMART_QUIRK_9_POWERONSECONDS = 0x0002,
1442
SK_SMART_QUIRK_9_POWERONHALFMINUTES = 0x0004,
1443
SK_SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT = 0x0008,
1444
SK_SMART_QUIRK_193_LOADUNLOAD = 0x0010,
1445
SK_SMART_QUIRK_194_10XCELSIUS = 0x0020,
1446
SK_SMART_QUIRK_194_UNKNOWN = 0x0040,
1447
SK_SMART_QUIRK_200_WRITEERRORCOUNT = 0x0080,
1448
SK_SMART_QUIRK_201_DETECTEDTACOUNT = 0x0100,
1449
SK_SMART_QUIRK_5_UNKNOWN = 0x0200,
1450
SK_SMART_QUIRK_9_UNKNOWN = 0x0400,
1451
SK_SMART_QUIRK_197_UNKNOWN = 0x0800,
1452
SK_SMART_QUIRK_198_UNKNOWN = 0x1000,
1318
1453
} SkSmartQuirk;
1320
1455
/* %STRINGPOOLSTART% */
1321
1456
static const char *quirk_name[] = {
1322
((const char*) 2347),
1323
((const char*) 2364),
1324
((const char*) 2381),
1325
1457
((const char*) 2402),
1326
((const char*) 2430),
1327
((const char*) 2445),
1328
((const char*) 2460),
1329
((const char*) 2472),
1330
((const char*) 2492),
1331
((const char*) 2512),
1458
((const char*) 2419),
1459
((const char*) 2436),
1460
((const char*) 2457),
1461
((const char*) 2485),
1462
((const char*) 2500),
1463
((const char*) 2515),
1464
((const char*) 2527),
1465
((const char*) 2547),
1466
((const char*) 2567),
1467
((const char*) 2577),
1468
((const char*) 2587),
1469
((const char*) 2599),
1334
1472
/* %STRINGPOOLSTOP% */